robopark 3.3.61 → 3.3.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/package.json +1 -1
  2. package/scheduler/main.py +40 -3
  3. package/scheduler/static/voice-join.html +5 -1
  4. package/ui/standalone/.next/BUILD_ID +1 -1
  5. package/ui/standalone/.next/app-build-manifest.json +75 -75
  6. package/ui/standalone/.next/app-path-routes-manifest.json +22 -22
  7. package/ui/standalone/.next/build-manifest.json +2 -2
  8. package/ui/standalone/.next/prerender-manifest.json +3 -3
  9. package/ui/standalone/.next/server/app/(app)/opengraph-image-xg4ifa/route_client-reference-manifest.js +1 -1
  10. package/ui/standalone/.next/server/app/(app)/page_client-reference-manifest.js +1 -1
  11. package/ui/standalone/.next/server/app/(app)/voice/page_client-reference-manifest.js +1 -1
  12. package/ui/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/ui/standalone/.next/server/app/api/connection-details/route_client-reference-manifest.js +1 -1
  14. package/ui/standalone/.next/server/app/api/device-character/route_client-reference-manifest.js +1 -1
  15. package/ui/standalone/.next/server/app/api/download-piper-model/route_client-reference-manifest.js +1 -1
  16. package/ui/standalone/.next/server/app/api/kiosk-hardware/route_client-reference-manifest.js +1 -1
  17. package/ui/standalone/.next/server/app/api/model-status/route_client-reference-manifest.js +1 -1
  18. package/ui/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
  19. package/ui/standalone/.next/server/app/api/prewarm/route_client-reference-manifest.js +1 -1
  20. package/ui/standalone/.next/server/app/api/prompt/route_client-reference-manifest.js +1 -1
  21. package/ui/standalone/.next/server/app/api/reload-tools/route_client-reference-manifest.js +1 -1
  22. package/ui/standalone/.next/server/app/api/robopark/camera-token/route_client-reference-manifest.js +1 -1
  23. package/ui/standalone/.next/server/app/api/robopark/character-ai/route_client-reference-manifest.js +1 -1
  24. package/ui/standalone/.next/server/app/api/robopark/device-access/route_client-reference-manifest.js +1 -1
  25. package/ui/standalone/.next/server/app/api/robopark/devices/[deviceId]/control/route_client-reference-manifest.js +1 -1
  26. package/ui/standalone/.next/server/app/api/robopark/live-rooms/route.js +1 -1
  27. package/ui/standalone/.next/server/app/api/robopark/live-rooms/route_client-reference-manifest.js +1 -1
  28. package/ui/standalone/.next/server/app/api/robopark/monitor-token/route_client-reference-manifest.js +1 -1
  29. package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/operations/route_client-reference-manifest.js +1 -1
  30. package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/voice-engine/route_client-reference-manifest.js +1 -1
  31. package/ui/standalone/.next/server/app/api/robopark/robots/route_client-reference-manifest.js +1 -1
  32. package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/metrics/route_client-reference-manifest.js +1 -1
  33. package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/route_client-reference-manifest.js +1 -1
  34. package/ui/standalone/.next/server/app/api/robopark/servers/route_client-reference-manifest.js +1 -1
  35. package/ui/standalone/.next/server/app/api/robopark/sessions/[sessionId]/end/route_client-reference-manifest.js +1 -1
  36. package/ui/standalone/.next/server/app/api/robopark/sessions/route_client-reference-manifest.js +1 -1
  37. package/ui/standalone/.next/server/app/api/robopark/transcripts/[sessionId]/route_client-reference-manifest.js +1 -1
  38. package/ui/standalone/.next/server/app/api/robopark/transcripts/route_client-reference-manifest.js +1 -1
  39. package/ui/standalone/.next/server/app/api/robopark/vision-caption/route_client-reference-manifest.js +1 -1
  40. package/ui/standalone/.next/server/app/api/robovoice/robots/[robotId]/media-health/route_client-reference-manifest.js +1 -1
  41. package/ui/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  42. package/ui/standalone/.next/server/app/api/setup/complete/route_client-reference-manifest.js +1 -1
  43. package/ui/standalone/.next/server/app/api/setup/status/route_client-reference-manifest.js +1 -1
  44. package/ui/standalone/.next/server/app/api/setup/test-groq/route_client-reference-manifest.js +1 -1
  45. package/ui/standalone/.next/server/app/api/setup/test-hass/route_client-reference-manifest.js +1 -1
  46. package/ui/standalone/.next/server/app/api/setup/test-n8n/route_client-reference-manifest.js +1 -1
  47. package/ui/standalone/.next/server/app/api/setup/test-ollama/route_client-reference-manifest.js +1 -1
  48. package/ui/standalone/.next/server/app/api/test-tts/route_client-reference-manifest.js +1 -1
  49. package/ui/standalone/.next/server/app/api/turn-credentials/route_client-reference-manifest.js +1 -1
  50. package/ui/standalone/.next/server/app/api/voices/route_client-reference-manifest.js +1 -1
  51. package/ui/standalone/.next/server/app/api/wake/route_client-reference-manifest.js +1 -1
  52. package/ui/standalone/.next/server/app/api/wake-word/models/route_client-reference-manifest.js +1 -1
  53. package/ui/standalone/.next/server/app/api/wake-word/status/route_client-reference-manifest.js +1 -1
  54. package/ui/standalone/.next/server/app/api/wake-word/upload/route_client-reference-manifest.js +1 -1
  55. package/ui/standalone/.next/server/app/camera-grid/route_client-reference-manifest.js +1 -1
  56. package/ui/standalone/.next/server/app/fed/[...path]/route_client-reference-manifest.js +1 -1
  57. package/ui/standalone/.next/server/app/fed/media/robots/[robotId]/video_feed/route_client-reference-manifest.js +1 -1
  58. package/ui/standalone/.next/server/app/robopark/[...path]/route_client-reference-manifest.js +1 -1
  59. package/ui/standalone/.next/server/app/robopark/api/[...path]/route_client-reference-manifest.js +1 -1
  60. package/ui/standalone/.next/server/app/robopark/api/robots/[robotId]/stream/route_client-reference-manifest.js +1 -1
  61. package/ui/standalone/.next/server/app/robopark/page_client-reference-manifest.js +1 -1
  62. package/ui/standalone/.next/server/app/tailnet/route_client-reference-manifest.js +1 -1
  63. package/ui/standalone/.next/server/app/vendor/livekit-client.umd.js/route_client-reference-manifest.js +1 -1
  64. package/ui/standalone/.next/server/app/voice-tester/page_client-reference-manifest.js +1 -1
  65. package/ui/standalone/.next/server/app-paths-manifest.json +22 -22
  66. package/ui/standalone/.next/server/functions-config-manifest.json +1 -1
  67. package/ui/standalone/.next/server/pages/500.html +1 -1
  68. package/ui/standalone/.next/server/pages-manifest.json +1 -1
  69. package/ui/standalone/.next/server/server-reference-manifest.json +1 -1
  70. package/ui/standalone/public/robopark-control.html +233 -17
  71. package/ui/standalone/public/voice-join.html +5 -1
  72. /package/ui/standalone/.next/static/{95wYdEKkTppMWNZn6Vr-N → yvZvIl5mqEgNQQCAaVeEm}/_buildManifest.js +0 -0
  73. /package/ui/standalone/.next/static/{95wYdEKkTppMWNZn6Vr-N → yvZvIl5mqEgNQQCAaVeEm}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/vendor/livekit-client.umd.js/route"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"5233":{"*":{"id":"92681","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"5945":{"*":{"id":"14890","name":"*","chunks":[],"async":false}},"6960":{"*":{"id":"34635","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\builtin\\global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\builtin\\global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\http-access-fallback\\error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\http-access-fallback\\error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\metadata\\async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\metadata\\async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\lib\\framework\\boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\lib\\framework\\boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\lib\\metadata\\generate\\icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\lib\\metadata\\generate\\icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\components\\app\\theme-provider.tsx":{"id":5233,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\font\\google\\target.css?{\"path\":\"app\\\\layout.tsx\",\"import\":\"Public_Sans\",\"arguments\":[{\"variable\":\"--font-public-sans\",\"subsets\":[\"latin\"]}],\"variableName\":\"publicSans\"}":{"id":5757,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\font\\local\\target.css?{\"path\":\"app\\\\layout.tsx\",\"import\":\"\",\"arguments\":[{\"display\":\"swap\",\"variable\":\"--font-commit-mono\",\"src\":[{\"path\":\"../fonts/CommitMono-400-Regular.otf\",\"weight\":\"400\",\"style\":\"normal\"},{\"path\":\"../fonts/CommitMono-700-Regular.otf\",\"weight\":\"700\",\"style\":\"normal\"},{\"path\":\"../fonts/CommitMono-400-Italic.otf\",\"weight\":\"400\",\"style\":\"italic\"},{\"path\":\"../fonts/CommitMono-700-Italic.otf\",\"weight\":\"700\",\"style\":\"italic\"}]}],\"variableName\":\"commitMono\"}":{"id":1901,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\styles\\globals.css":{"id":3677,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\voice-tester\\page.tsx":{"id":6960,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\components\\app\\app.tsx":{"id":5945,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\layout":[{"inlined":false,"path":"static/css/3f478a573f9be82e.css"},{"inlined":false,"path":"static/css/51560c4af1d5a21f.css"}],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\(app)\\layout":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\(app)\\page":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\vendor\\livekit-client.umd.js\\route":[]},"rscModuleMapping":{"622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"3677":{"*":{"id":"23141","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"5233":{"*":{"id":"43259","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"5945":{"*":{"id":"58467","name":"*","chunks":[],"async":false}},"6960":{"*":{"id":"33323","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}
1
+ globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/vendor/livekit-client.umd.js/route"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"5233":{"*":{"id":"92681","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"5945":{"*":{"id":"14890","name":"*","chunks":[],"async":false}},"6960":{"*":{"id":"34635","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\builtin\\global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\builtin\\global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\http-access-fallback\\error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\http-access-fallback\\error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\metadata\\async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\metadata\\async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\lib\\framework\\boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\lib\\framework\\boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\lib\\metadata\\generate\\icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\lib\\metadata\\generate\\icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\components\\app\\theme-provider.tsx":{"id":5233,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\font\\google\\target.css?{\"path\":\"app\\\\layout.tsx\",\"import\":\"Public_Sans\",\"arguments\":[{\"variable\":\"--font-public-sans\",\"subsets\":[\"latin\"]}],\"variableName\":\"publicSans\"}":{"id":5757,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\font\\local\\target.css?{\"path\":\"app\\\\layout.tsx\",\"import\":\"\",\"arguments\":[{\"display\":\"swap\",\"variable\":\"--font-commit-mono\",\"src\":[{\"path\":\"../fonts/CommitMono-400-Regular.otf\",\"weight\":\"400\",\"style\":\"normal\"},{\"path\":\"../fonts/CommitMono-700-Regular.otf\",\"weight\":\"700\",\"style\":\"normal\"},{\"path\":\"../fonts/CommitMono-400-Italic.otf\",\"weight\":\"400\",\"style\":\"italic\"},{\"path\":\"../fonts/CommitMono-700-Italic.otf\",\"weight\":\"700\",\"style\":\"italic\"}]}],\"variableName\":\"commitMono\"}":{"id":1901,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\styles\\globals.css":{"id":3677,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\components\\app\\app.tsx":{"id":5945,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\voice-tester\\page.tsx":{"id":6960,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\layout":[{"inlined":false,"path":"static/css/3f478a573f9be82e.css"},{"inlined":false,"path":"static/css/51560c4af1d5a21f.css"}],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\(app)\\layout":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\(app)\\page":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\vendor\\livekit-client.umd.js\\route":[]},"rscModuleMapping":{"622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"3677":{"*":{"id":"23141","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"5233":{"*":{"id":"43259","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"5945":{"*":{"id":"58467","name":"*","chunks":[],"async":false}},"6960":{"*":{"id":"33323","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}
@@ -1 +1 @@
1
- globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/voice-tester/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"5233":{"*":{"id":"92681","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"5945":{"*":{"id":"14890","name":"*","chunks":[],"async":false}},"6960":{"*":{"id":"34635","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\builtin\\global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\builtin\\global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\http-access-fallback\\error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\http-access-fallback\\error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\metadata\\async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\metadata\\async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\lib\\framework\\boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\lib\\framework\\boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\lib\\metadata\\generate\\icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\lib\\metadata\\generate\\icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\components\\app\\theme-provider.tsx":{"id":5233,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\font\\google\\target.css?{\"path\":\"app\\\\layout.tsx\",\"import\":\"Public_Sans\",\"arguments\":[{\"variable\":\"--font-public-sans\",\"subsets\":[\"latin\"]}],\"variableName\":\"publicSans\"}":{"id":5757,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\font\\local\\target.css?{\"path\":\"app\\\\layout.tsx\",\"import\":\"\",\"arguments\":[{\"display\":\"swap\",\"variable\":\"--font-commit-mono\",\"src\":[{\"path\":\"../fonts/CommitMono-400-Regular.otf\",\"weight\":\"400\",\"style\":\"normal\"},{\"path\":\"../fonts/CommitMono-700-Regular.otf\",\"weight\":\"700\",\"style\":\"normal\"},{\"path\":\"../fonts/CommitMono-400-Italic.otf\",\"weight\":\"400\",\"style\":\"italic\"},{\"path\":\"../fonts/CommitMono-700-Italic.otf\",\"weight\":\"700\",\"style\":\"italic\"}]}],\"variableName\":\"commitMono\"}":{"id":1901,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\styles\\globals.css":{"id":3677,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\voice-tester\\page.tsx":{"id":6960,"name":"*","chunks":["4461","static/chunks/app/voice-tester/page-ae699e048e0eb834.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\components\\app\\app.tsx":{"id":5945,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\layout":[{"inlined":false,"path":"static/css/3f478a573f9be82e.css"},{"inlined":false,"path":"static/css/51560c4af1d5a21f.css"}],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\(app)\\layout":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\(app)\\page":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\voice-tester\\page":[]},"rscModuleMapping":{"622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"3677":{"*":{"id":"23141","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"5233":{"*":{"id":"43259","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"5945":{"*":{"id":"58467","name":"*","chunks":[],"async":false}},"6960":{"*":{"id":"33323","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}
1
+ globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/voice-tester/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"5233":{"*":{"id":"92681","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"5945":{"*":{"id":"14890","name":"*","chunks":[],"async":false}},"6960":{"*":{"id":"34635","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\builtin\\global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\builtin\\global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\http-access-fallback\\error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\http-access-fallback\\error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\metadata\\async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\metadata\\async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\client\\components\\render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\client\\components\\render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\lib\\framework\\boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\lib\\framework\\boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\lib\\metadata\\generate\\icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\dist\\esm\\lib\\metadata\\generate\\icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\components\\app\\theme-provider.tsx":{"id":5233,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\font\\google\\target.css?{\"path\":\"app\\\\layout.tsx\",\"import\":\"Public_Sans\",\"arguments\":[{\"variable\":\"--font-public-sans\",\"subsets\":[\"latin\"]}],\"variableName\":\"publicSans\"}":{"id":5757,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\node_modules\\next\\font\\local\\target.css?{\"path\":\"app\\\\layout.tsx\",\"import\":\"\",\"arguments\":[{\"display\":\"swap\",\"variable\":\"--font-commit-mono\",\"src\":[{\"path\":\"../fonts/CommitMono-400-Regular.otf\",\"weight\":\"400\",\"style\":\"normal\"},{\"path\":\"../fonts/CommitMono-700-Regular.otf\",\"weight\":\"700\",\"style\":\"normal\"},{\"path\":\"../fonts/CommitMono-400-Italic.otf\",\"weight\":\"400\",\"style\":\"italic\"},{\"path\":\"../fonts/CommitMono-700-Italic.otf\",\"weight\":\"700\",\"style\":\"italic\"}]}],\"variableName\":\"commitMono\"}":{"id":1901,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\styles\\globals.css":{"id":3677,"name":"*","chunks":["7501","static/chunks/144d3bae-bd5d150c0cab972e.js","9880","static/chunks/9880-53262785284464cc.js","7177","static/chunks/app/layout-fcce963da1d8220f.js"],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\components\\app\\app.tsx":{"id":5945,"name":"*","chunks":[],"async":false},"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\voice-tester\\page.tsx":{"id":6960,"name":"*","chunks":["4461","static/chunks/app/voice-tester/page-ae699e048e0eb834.js"],"async":false}},"entryCSSFiles":{"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\layout":[{"inlined":false,"path":"static/css/3f478a573f9be82e.css"},{"inlined":false,"path":"static/css/51560c4af1d5a21f.css"}],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\(app)\\layout":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\(app)\\page":[],"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\voice-tester\\page":[]},"rscModuleMapping":{"622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"3677":{"*":{"id":"23141","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"5233":{"*":{"id":"43259","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"5945":{"*":{"id":"58467","name":"*","chunks":[],"async":false}},"6960":{"*":{"id":"33323","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}
@@ -1,21 +1,21 @@
1
1
  {
2
- "/api/device-character/route": "app/api/device-character/route.js",
3
2
  "/_not-found/page": "app/_not-found/page.js",
4
3
  "/api/download-piper-model/route": "app/api/download-piper-model/route.js",
5
- "/api/prewarm/route": "app/api/prewarm/route.js",
6
- "/api/models/route": "app/api/models/route.js",
4
+ "/api/device-character/route": "app/api/device-character/route.js",
7
5
  "/api/prompt/route": "app/api/prompt/route.js",
6
+ "/api/models/route": "app/api/models/route.js",
7
+ "/api/prewarm/route": "app/api/prewarm/route.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
11
  "/api/robopark/sessions/[sessionId]/end/route": "app/api/robopark/sessions/[sessionId]/end/route.js",
12
12
  "/api/robopark/transcripts/[sessionId]/route": "app/api/robopark/transcripts/[sessionId]/route.js",
13
- "/api/setup/complete/route": "app/api/setup/complete/route.js",
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
16
  "/api/setup/test-hass/route": "app/api/setup/test-hass/route.js",
17
- "/api/setup/test-n8n/route": "app/api/setup/test-n8n/route.js",
18
17
  "/api/setup/test-ollama/route": "app/api/setup/test-ollama/route.js",
18
+ "/api/setup/test-n8n/route": "app/api/setup/test-n8n/route.js",
19
19
  "/api/test-tts/route": "app/api/test-tts/route.js",
20
20
  "/api/voices/route": "app/api/voices/route.js",
21
21
  "/api/wake-word/models/route": "app/api/wake-word/models/route.js",
@@ -23,36 +23,36 @@
23
23
  "/api/wake-word/upload/route": "app/api/wake-word/upload/route.js",
24
24
  "/favicon.ico/route": "app/favicon.ico/route.js",
25
25
  "/api/kiosk-hardware/route": "app/api/kiosk-hardware/route.js",
26
- "/api/connection-details/route": "app/api/connection-details/route.js",
27
26
  "/api/model-status/route": "app/api/model-status/route.js",
28
- "/api/robopark/live-rooms/route": "app/api/robopark/live-rooms/route.js",
29
- "/api/robopark/camera-token/route": "app/api/robopark/camera-token/route.js",
30
- "/api/robopark/monitor-token/route": "app/api/robopark/monitor-token/route.js",
27
+ "/api/connection-details/route": "app/api/connection-details/route.js",
31
28
  "/api/robopark/character-ai/route": "app/api/robopark/character-ai/route.js",
29
+ "/api/robopark/camera-token/route": "app/api/robopark/camera-token/route.js",
32
30
  "/api/robopark/device-access/route": "app/api/robopark/device-access/route.js",
33
- "/api/robopark/robots/route": "app/api/robopark/robots/route.js",
31
+ "/api/robopark/monitor-token/route": "app/api/robopark/monitor-token/route.js",
32
+ "/api/robopark/servers/route": "app/api/robopark/servers/route.js",
33
+ "/api/robopark/live-rooms/route": "app/api/robopark/live-rooms/route.js",
34
34
  "/api/robopark/servers/[serverId]/metrics/route": "app/api/robopark/servers/[serverId]/metrics/route.js",
35
+ "/api/robopark/robots/route": "app/api/robopark/robots/route.js",
36
+ "/api/robopark/sessions/route": "app/api/robopark/sessions/route.js",
35
37
  "/api/robopark/servers/[serverId]/route": "app/api/robopark/servers/[serverId]/route.js",
36
38
  "/api/robopark/vision-caption/route": "app/api/robopark/vision-caption/route.js",
37
- "/api/robopark/sessions/route": "app/api/robopark/sessions/route.js",
38
- "/api/robopark/servers/route": "app/api/robopark/servers/route.js",
39
- "/api/robovoice/robots/[robotId]/media-health/route": "app/api/robovoice/robots/[robotId]/media-health/route.js",
40
- "/api/settings/route": "app/api/settings/route.js",
41
39
  "/api/robopark/robots/[robotId]/voice-engine/route": "app/api/robopark/robots/[robotId]/voice-engine/route.js",
40
+ "/api/robovoice/robots/[robotId]/media-health/route": "app/api/robovoice/robots/[robotId]/media-health/route.js",
42
41
  "/api/turn-credentials/route": "app/api/turn-credentials/route.js",
42
+ "/api/settings/route": "app/api/settings/route.js",
43
+ "/camera-grid/route": "app/camera-grid/route.js",
44
+ "/api/wake/route": "app/api/wake/route.js",
45
+ "/robopark/[...path]/route": "app/robopark/[...path]/route.js",
43
46
  "/api/robopark/transcripts/route": "app/api/robopark/transcripts/route.js",
44
47
  "/fed/media/robots/[robotId]/video_feed/route": "app/fed/media/robots/[robotId]/video_feed/route.js",
45
- "/api/wake/route": "app/api/wake/route.js",
46
- "/camera-grid/route": "app/camera-grid/route.js",
47
- "/robopark/api/robots/[robotId]/stream/route": "app/robopark/api/robots/[robotId]/stream/route.js",
48
48
  "/fed/[...path]/route": "app/fed/[...path]/route.js",
49
- "/vendor/livekit-client.umd.js/route": "app/vendor/livekit-client.umd.js/route.js",
50
- "/robopark/[...path]/route": "app/robopark/[...path]/route.js",
51
49
  "/tailnet/route": "app/tailnet/route.js",
52
50
  "/(app)/opengraph-image-xg4ifa/route": "app/(app)/opengraph-image-xg4ifa/route.js",
51
+ "/robopark/api/robots/[robotId]/stream/route": "app/robopark/api/robots/[robotId]/stream/route.js",
52
+ "/vendor/livekit-client.umd.js/route": "app/vendor/livekit-client.umd.js/route.js",
53
53
  "/robopark/api/[...path]/route": "app/robopark/api/[...path]/route.js",
54
- "/voice-tester/page": "app/voice-tester/page.js",
55
- "/robopark/page": "app/robopark/page.js",
56
54
  "/(app)/page": "app/(app)/page.js",
57
- "/(app)/voice/page": "app/(app)/voice/page.js"
55
+ "/robopark/page": "app/robopark/page.js",
56
+ "/(app)/voice/page": "app/(app)/voice/page.js",
57
+ "/voice-tester/page": "app/voice-tester/page.js"
58
58
  }
@@ -3,8 +3,8 @@
3
3
  "functions": {
4
4
  "/api/kiosk-hardware": {},
5
5
  "/api/robovoice/robots/[robotId]/media-health": {},
6
- "/fed/media/robots/[robotId]/video_feed": {},
7
6
  "/robopark/[...path]": {},
7
+ "/fed/media/robots/[robotId]/video_feed": {},
8
8
  "/robopark/api/robots/[robotId]/stream": {}
9
9
  }
10
10
  }
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-5252e5254da079b5.js" defer=""></script><script src="/_next/static/chunks/framework-e60c938074ff7136.js" defer=""></script><script src="/_next/static/chunks/main-9e24e8708ff075fc.js" defer=""></script><script src="/_next/static/chunks/pages/_app-131c90850aef965b.js" defer=""></script><script src="/_next/static/chunks/pages/_error-e4ba546eb376bdf4.js" defer=""></script><script src="/_next/static/95wYdEKkTppMWNZn6Vr-N/_buildManifest.js" defer=""></script><script src="/_next/static/95wYdEKkTppMWNZn6Vr-N/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"95wYdEKkTppMWNZn6Vr-N","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-5252e5254da079b5.js" defer=""></script><script src="/_next/static/chunks/framework-e60c938074ff7136.js" defer=""></script><script src="/_next/static/chunks/main-9e24e8708ff075fc.js" defer=""></script><script src="/_next/static/chunks/pages/_app-131c90850aef965b.js" defer=""></script><script src="/_next/static/chunks/pages/_error-e4ba546eb376bdf4.js" defer=""></script><script src="/_next/static/yvZvIl5mqEgNQQCAaVeEm/_buildManifest.js" defer=""></script><script src="/_next/static/yvZvIl5mqEgNQQCAaVeEm/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"yvZvIl5mqEgNQQCAaVeEm","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1,5 +1,5 @@
1
1
  {
2
- "/_error": "pages/_error.js",
3
2
  "/_app": "pages/_app.js",
3
+ "/_error": "pages/_error.js",
4
4
  "/_document": "pages/_document.js"
5
5
  }
@@ -1 +1 @@
1
- {"node":{},"edge":{},"encryptionKey":"4BR88lq4iqpHk/8KKT2cL+dncVsnltA0ZuBJwvAdjnw="}
1
+ {"node":{},"edge":{},"encryptionKey":"kp07KNR6uTzrpPvUXOIXAGy9W97bVFuj+EqQgq1xb34="}
@@ -149,7 +149,7 @@ section h2 .count{color:var(--muted);}
149
149
  .fleet-services{margin:.5rem 0;border:1px solid var(--glass-border);border-radius:11px;overflow:hidden;background:rgba(0,0,0,.2)}.fleet-services-head{display:flex;justify-content:space-between;align-items:center;padding:.42rem .52rem;border-bottom:1px solid var(--glass-border);font:700 .51rem var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--gold-pale)}.fleet-service{display:grid;grid-template-columns:8px minmax(72px,.7fr) minmax(90px,1fr) auto;gap:.42rem;align-items:center;padding:.4rem .5rem;border-bottom:1px solid rgba(255,255,255,.035);font:.51rem var(--mono)}.fleet-service:last-child{border-bottom:0}.fleet-service i{width:7px;height:7px;border-radius:50%;background:var(--bad)}.fleet-service.up i{background:var(--ok);box-shadow:0 0 7px rgba(111,224,166,.45)}.fleet-service.missing i{background:var(--muted)}.fleet-service b{color:var(--ink);white-space:nowrap}.fleet-service span{color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fleet-service-actions{display:flex;gap:.22rem}.fleet-service-actions button{padding:.22rem .34rem;font-size:.47rem}.fleet-service-fix{padding:.38rem .5rem;border-top:1px solid rgba(246,215,123,.08);background:rgba(246,215,123,.025)}.fleet-service-fix code{display:block;overflow:auto;white-space:nowrap;color:var(--gold-pale);font:.48rem var(--mono)}.fleet-service-fix button{margin-top:.3rem}
150
150
  .fleet-group-title{grid-column:1/-1;display:flex;align-items:center;justify-content:space-between;margin-top:.35rem;padding:.55rem .15rem .25rem;border-bottom:1px solid rgba(246,215,123,.18);font-family:var(--display);color:var(--gold-pale);font-size:.82rem;letter-spacing:.04em}.fleet-group-title span{font:500 .54rem var(--mono);color:var(--muted);text-transform:uppercase;letter-spacing:.1em}
151
151
  .fleet-live-camera{position:relative;aspect-ratio:16/9;margin:.55rem 0;border:1px solid var(--glass-border);border-radius:12px;overflow:hidden;background:radial-gradient(circle at 50% 35%,rgba(246,215,123,.08),transparent 44%),#050504;box-shadow:inset 0 1px 0 var(--glass-hi)}
152
- .fleet-live-camera img{width:100%;height:100%;display:block;object-fit:contain;background:#050504}.fleet-live-camera .state{position:absolute;left:.5rem;bottom:.45rem;padding:.18rem .4rem;border-radius:100px;background:rgba(3,3,2,.78);border:1px solid var(--glass-border);font-family:var(--mono);font-size:.5rem;color:var(--warn);backdrop-filter:blur(8px)}.fleet-live-camera.live .state{color:var(--ok)}.fleet-live-camera.failed .state{color:var(--bad)}
152
+ .fleet-live-camera img,.fleet-live-camera video{width:100%;height:100%;display:block;object-fit:contain;background:#050504}.fleet-live-camera .state{position:absolute;left:.5rem;bottom:.45rem;padding:.18rem .4rem;border-radius:100px;background:rgba(3,3,2,.78);border:1px solid var(--glass-border);font-family:var(--mono);font-size:.5rem;color:var(--warn);backdrop-filter:blur(8px)}.fleet-live-camera.live .state{color:var(--ok)}.fleet-live-camera.failed .state{color:var(--bad)}
153
153
  @media(max-width:1150px){.fleet-kpis{grid-template-columns:repeat(3,1fr)}.fleet-insights{grid-template-columns:1fr 1fr}.fleet-insights .fleet-panel:last-of-type{grid-column:1/-1}}
154
154
  @media(max-width:720px){.fleet-hero{align-items:flex-start;flex-direction:column}.fleet-hero-actions{justify-content:flex-start}.fleet-kpis{grid-template-columns:repeat(2,1fr)}.fleet-insights{display:block}.fleet-panel{margin-bottom:.65rem}.fleet-readiness{grid-template-columns:90px 1fr}.fleet-donut{width:86px;height:86px}}
155
155
 
@@ -1702,6 +1702,210 @@ footer.cmd{left:var(--global-nav-width);transition:left .24s cubic-bezier(.2,.8,
1702
1702
  }
1703
1703
  window.addEventListener('online',rpRecoverVisibleCameras);
1704
1704
  document.addEventListener('visibilitychange',function(){if(document.visibilityState==='visible')rpRecoverVisibleCameras();});
1705
+ // ── Fleet LiveKit cameras ──
1706
+ // Robot kiosks/character call pages publish the camera into LiveKit room
1707
+ // robopark-<stream id>, where the stream id is the claim/device id (e.g.
1708
+ // claim_63a36d48…). The fleet tiles used to hit only the MJPEG relay, which
1709
+ // 502s for claim devices, so tiles spun on "connecting camera" forever.
1710
+ // Subscribe each tile through /api/robopark/monitor-token instead and keep
1711
+ // the MJPEG relay strictly as a grace-period fallback.
1712
+ var fleetLiveKitRooms = {};
1713
+ var rpCameraStreamIds = {}; // tile key (display name) -> claim/device stream id
1714
+ var fleetLiveKitSdkPromise = null;
1715
+ function ensureFleetLiveKit(){
1716
+ if(window.LivekitClient)return Promise.resolve(window.LivekitClient);
1717
+ if(fleetLiveKitSdkPromise)return fleetLiveKitSdkPromise;
1718
+ fleetLiveKitSdkPromise=new Promise(function(resolve,reject){var s=document.createElement('script');s.src='/vendor/livekit-client.umd.js'+QS;s.onload=function(){resolve(window.LivekitClient);};s.onerror=function(){fleetLiveKitSdkPromise=null;reject(new Error('LiveKit SDK failed to load'));};document.head.appendChild(s);});
1719
+ return fleetLiveKitSdkPromise;
1720
+ }
1721
+ function pruneRoomTargets(entry){
1722
+ entry.videos=(entry.videos||[]).filter(function(node){return node&&node.isConnected;});
1723
+ entry.states=(entry.states||[]).filter(function(node){return node&&node.isConnected;});
1724
+ return entry;
1725
+ }
1726
+ // MJPEG fallback: when a LiveKit room connects but nobody publishes video
1727
+ // (no character call open), the tile fell into 'waiting for camera track'
1728
+ // forever. After a grace period we overlay the vision-server MJPEG stream in
1729
+ // the tile while keeping the room joined; a real LiveKit track always wins
1730
+ // and tears the overlay down. Every open MJPEG <img> holds an HTTP
1731
+ // connection, so teardown must be exhaustive (close, sweep, pagehide, error).
1732
+ var FLEET_FALLBACK_DELAY=12000;
1733
+ function removeFleetFallbackImgs(entry){
1734
+ (entry.fallbackImgs||[]).forEach(function(img){
1735
+ try{img.onload=null;img.onerror=null;img.src='';}catch(e){}
1736
+ var host=img._rpHost;
1737
+ if(img.parentNode)img.parentNode.removeChild(img);
1738
+ if(host&&!entry.hasTrack)host.classList.remove('live');
1739
+ });
1740
+ entry.fallbackImgs=[];entry.fallbackActive=false;
1741
+ }
1742
+ function clearFleetFallback(entry){
1743
+ if(!entry)return;
1744
+ if(entry.fallbackTimer){clearTimeout(entry.fallbackTimer);entry.fallbackTimer=null;}
1745
+ removeFleetFallbackImgs(entry);
1746
+ }
1747
+ function tryFleetFallback(cameraKey,entry){
1748
+ if(fleetLiveKitRooms[cameraKey]!==entry||entry.hasTrack)return;
1749
+ pruneRoomTargets(entry);
1750
+ if(!entry.videos.length)return;
1751
+ entry.fallbackImgs=(entry.fallbackImgs||[]).filter(function(img){return img&&img.isConnected;});
1752
+ entry.videos.forEach(function(video){
1753
+ var host=(video.closest&&video.closest('[data-fleet-camera-host]'))||video.parentNode;
1754
+ if(!host||host.querySelector('img[data-fleet-fallback]'))return;
1755
+ var img=document.createElement('img');
1756
+ img.setAttribute('data-fleet-fallback',cameraKey);
1757
+ img.alt='fallback camera stream';
1758
+ img.style.position='absolute';img.style.inset='0';img.style.zIndex='2';
1759
+ img.style.width='100%';img.style.height='100%';img.style.objectFit='contain';
1760
+ img._rpHost=host;
1761
+ img.onload=function(){
1762
+ if(fleetLiveKitRooms[cameraKey]!==entry||entry.hasTrack)return;
1763
+ entry.fallbackActive=true;entry.fallbackFailures=0;
1764
+ host.classList.add('live');host.classList.remove('failed');
1765
+ setRoomStatus(entry,'MJPEG camera live (fallback)');
1766
+ };
1767
+ img.onerror=function(){
1768
+ if(fleetLiveKitRooms[cameraKey]!==entry)return;
1769
+ removeFleetFallbackImgs(entry);
1770
+ if(entry.hasTrack)return;
1771
+ setRoomStatus(entry,'connected · waiting for camera track');
1772
+ armFleetFallback(cameraKey,entry,true);
1773
+ };
1774
+ // The MJPEG relay is keyed by the robot display name (the legacy tile
1775
+ // identity), not the LiveKit stream id.
1776
+ img.src=rpCameraFeedUrl(cameraKey);
1777
+ entry.fallbackImgs.push(img);
1778
+ host.appendChild(img);
1779
+ });
1780
+ }
1781
+ function armFleetFallback(cameraKey,entry,backoff){
1782
+ if(!entry||entry.fallbackTimer||entry.hasTrack)return;
1783
+ var delay=FLEET_FALLBACK_DELAY;
1784
+ if(backoff){
1785
+ entry.fallbackFailures=(entry.fallbackFailures||0)+1;
1786
+ delay=Math.min(15000,Math.round(1500*Math.pow(1.6,Math.min(entry.fallbackFailures-1,6))+Math.random()*500));
1787
+ }
1788
+ entry.fallbackTimer=setTimeout(function(){
1789
+ entry.fallbackTimer=null;
1790
+ if(fleetLiveKitRooms[cameraKey]!==entry)return;
1791
+ tryFleetFallback(cameraKey,entry);
1792
+ },delay);
1793
+ }
1794
+ // Always disconnect before dropping a room reference. Abandoning the object
1795
+ // leaves the monitor joined server-side, so every refresh or re-render would
1796
+ // stack another monitor participant in the room.
1797
+ function closeFleetCameraRoom(cameraKey,entry){
1798
+ entry=entry||fleetLiveKitRooms[cameraKey];
1799
+ if(!entry)return;
1800
+ if(entry.retry){clearTimeout(entry.retry);entry.retry=null;}
1801
+ clearFleetFallback(entry);
1802
+ entry.hasTrack=false;
1803
+ var room=entry.room;entry.room=null;
1804
+ if(room){try{room.disconnect(true);}catch(e){}}
1805
+ if(fleetLiveKitRooms[cameraKey]===entry)delete fleetLiveKitRooms[cameraKey];
1806
+ }
1807
+ // Sweep rooms whose tiles are gone. Without this a room stayed joined for as
1808
+ // long as the tab lived, even after its tile was re-rendered away.
1809
+ function sweepFleetCameraRooms(){
1810
+ Object.keys(fleetLiveKitRooms||{}).forEach(function(cameraKey){
1811
+ var entry=fleetLiveKitRooms[cameraKey];if(!entry)return;
1812
+ pruneRoomTargets(entry);
1813
+ if(!entry.videos.length&&!entry.connecting)closeFleetCameraRoom(cameraKey,entry);
1814
+ });
1815
+ }
1816
+ if(typeof window!=='undefined'&&!window.__rpFleetRoomTeardown){
1817
+ window.__rpFleetRoomTeardown=true;
1818
+ setInterval(sweepFleetCameraRooms,15000);
1819
+ // pagehide covers refresh, navigation and tab close; without it the monitor
1820
+ // lingered until LiveKit's own participant timeout.
1821
+ window.addEventListener('pagehide',function(){
1822
+ Object.keys(fleetLiveKitRooms||{}).forEach(function(cameraKey){closeFleetCameraRoom(cameraKey);});
1823
+ });
1824
+ }
1825
+ function setRoomStatus(entry,message){
1826
+ entry.states.forEach(function(label){if(label&&label.isConnected)label.textContent=message;});
1827
+ }
1828
+ function attachRoomTrack(entry,track){
1829
+ entry.videos.forEach(function(target){
1830
+ if(!target||!target.isConnected)return;
1831
+ track.attach(target);target.muted=true;target.autoplay=true;target.playsInline=true;
1832
+ var host=target.closest('[data-fleet-camera-host]');if(host){host.classList.add('live');host.classList.remove('failed');}
1833
+ });
1834
+ }
1835
+ // Retries must never capture a specific <video>. renderFleet() rebuilds its
1836
+ // tiles, so a captured element can already be detached when the timer fires.
1837
+ // Retry against the device entry instead; later renders register their fresh
1838
+ // elements on it.
1839
+ function scheduleFleetCameraRetry(cameraKey){
1840
+ var entry=fleetLiveKitRooms[cameraKey];if(!entry||entry.retry)return;
1841
+ entry.failures=(entry.failures||0)+1;
1842
+ var delay=Math.min(15000,Math.round(1500*Math.pow(1.6,Math.min(entry.failures-1,6))+Math.random()*500));
1843
+ entry.retry=setTimeout(function(){
1844
+ entry.retry=null;
1845
+ if(fleetLiveKitRooms[cameraKey]!==entry)return;
1846
+ pruneRoomTargets(entry);
1847
+ // Nothing on screen is waiting for this room any more.
1848
+ if(!entry.videos.length){closeFleetCameraRoom(cameraKey,entry);return;}
1849
+ openFleetCameraRoom(cameraKey);
1850
+ },delay);
1851
+ }
1852
+ function openFleetCameraRoom(cameraKey){
1853
+ var entry=fleetLiveKitRooms[cameraKey];if(!entry||entry.connecting||entry.room)return;
1854
+ var roomId=String(rpCameraStreamIds[cameraKey]||cameraKey);
1855
+ entry.roomId=roomId;
1856
+ if(!/^[a-zA-Z0-9_-]{1,64}$/.test(roomId)){
1857
+ // Not a valid robopark-<id> room name; skip LiveKit and rely on the
1858
+ // MJPEG relay so the tile is never a terminal 'connecting' state.
1859
+ if(!entry.fallbackActive&&!entry.fallbackTimer)armFleetFallback(cameraKey,entry,true);
1860
+ return;
1861
+ }
1862
+ entry.connecting=true;
1863
+ Promise.all([ensureFleetLiveKit(),fetch('/api/robopark/monitor-token',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({room_name:'robopark-'+roomId})}).then(function(r){if(!r.ok)throw new Error('monitor token '+r.status);return r.json();})]).then(function(parts){
1864
+ var LK=parts[0],info=parts[1];
1865
+ entry.connecting=false;
1866
+ if(fleetLiveKitRooms[cameraKey]!==entry)return null;
1867
+ var room=new LK.Room();entry.room=room;
1868
+ room.on(LK.RoomEvent.TrackSubscribed,function(track){if(track.kind==='video'){entry.hasTrack=true;clearFleetFallback(entry);pruneRoomTargets(entry);attachRoomTrack(entry,track);setRoomStatus(entry,'LiveKit camera live');}});
1869
+ room.on(LK.RoomEvent.Disconnected,function(){if(fleetLiveKitRooms[cameraKey]!==entry)return;entry.room=null;entry.hasTrack=false;if(!entry.fallbackActive)setRoomStatus(entry,'camera disconnected · retrying');scheduleFleetCameraRetry(cameraKey);});
1870
+ return room.connect(info.serverUrl,info.token);
1871
+ }).then(function(result){if(result===null||fleetLiveKitRooms[cameraKey]!==entry)return;entry.failures=0;if(entry.fallbackActive){setRoomStatus(entry,'MJPEG camera live (fallback)');}else{setRoomStatus(entry,'connected · waiting for camera track');armFleetFallback(cameraKey,entry);}}).catch(function(error){
1872
+ entry.connecting=false;entry.room=null;entry.hasTrack=false;
1873
+ if(fleetLiveKitRooms[cameraKey]!==entry)return;
1874
+ if(!entry.fallbackActive)setRoomStatus(entry,'camera unavailable · '+error.message+' · retrying');
1875
+ scheduleFleetCameraRetry(cameraKey);
1876
+ // LiveKit is down entirely; don't sit dark for the full grace period.
1877
+ if(!entry.fallbackActive&&!entry.fallbackTimer)armFleetFallback(cameraKey,entry,true);
1878
+ });
1879
+ }
1880
+ function connectFleetLiveCamera(video,cameraKey,state){
1881
+ if(!cameraKey||!video)return;
1882
+ var desiredRoomId=String(rpCameraStreamIds[cameraKey]||cameraKey);
1883
+ var entry=fleetLiveKitRooms[cameraKey];
1884
+ // The session/live-room census can discover that the camera publishes into
1885
+ // a claim room (robopark-claim_<hash>) after we already joined a stale
1886
+ // room. Re-key: drop the stale subscription and rejoin the room that
1887
+ // actually has a publisher. Only when not mid-connect and the target
1888
+ // genuinely changed.
1889
+ if(entry&&!entry.connecting&&entry.roomId&&entry.roomId!==desiredRoomId){closeFleetCameraRoom(cameraKey,entry);entry=null;}
1890
+ if(!entry){entry={connecting:false,room:null,roomId:null,videos:[],states:[],retry:null,failures:0,hasTrack:false,fallbackTimer:null,fallbackImgs:[],fallbackActive:false,fallbackFailures:0};fleetLiveKitRooms[cameraKey]=entry;}
1891
+ pruneRoomTargets(entry);
1892
+ if(entry.videos.indexOf(video)<0)entry.videos.push(video);
1893
+ if(state&&entry.states.indexOf(state)<0)entry.states.push(state);
1894
+ if(entry.room){
1895
+ entry.room.remoteParticipants.forEach(function(p){p.trackPublications.forEach(function(pub){if(pub.track&&pub.track.kind==='video'){entry.hasTrack=true;clearFleetFallback(entry);attachRoomTrack(entry,pub.track);setRoomStatus(entry,'LiveKit camera live');}});});
1896
+ if(!entry.hasTrack){
1897
+ // Freshly rendered tile joined an already-open but publisher-less room:
1898
+ // re-cover it with the active fallback, or make sure the timer is armed
1899
+ // so 'waiting for camera track' can never be a terminal state.
1900
+ if(entry.fallbackActive)tryFleetFallback(cameraKey,entry);
1901
+ else if(!entry.fallbackTimer)armFleetFallback(cameraKey,entry);
1902
+ }
1903
+ return;
1904
+ }
1905
+ // A connect or retry is already in flight; it will pick up this element.
1906
+ if(entry.connecting||entry.retry)return;
1907
+ openFleetCameraRoom(cameraKey);
1908
+ }
1705
1909
  function renderFleetOperations(nodes, prefix, telemetryRows){
1706
1910
  prefix=prefix||'fleet'; nodes=Array.isArray(nodes)?nodes:[]; telemetryRows=Array.isArray(telemetryRows)?telemetryRows:null;
1707
1911
  var rows=[];
@@ -1764,11 +1968,12 @@ footer.cmd{left:var(--global-nav-width);transition:left .24s cubic-bezier(.2,.8,
1764
1968
  }
1765
1969
  function renderFleet(nodes){
1766
1970
  var el = $('fleet');
1767
- // Keep existing MJPEG elements alive while telemetry cards are rebuilt.
1768
- // Replacing an <img> tears down its long-lived stream and made cameras
1769
- // appear to reconnect on every fleet poll.
1971
+ // Keep existing camera hosts alive while telemetry cards are rebuilt.
1972
+ // Replacing the host tears down the attached LiveKit <video> and any
1973
+ // long-lived MJPEG fallback <img>, making cameras appear to reconnect on
1974
+ // every fleet poll.
1770
1975
  var preservedCameras={};
1771
- if(el){Array.prototype.forEach.call(el.querySelectorAll('[data-fleet-camera]'),function(img){var key=img.getAttribute('data-fleet-camera');if(key)preservedCameras[key]=img;});}
1976
+ if(el){Array.prototype.forEach.call(el.querySelectorAll('[data-fleet-camera-host]'),function(host){var key=host.getAttribute('data-fleet-camera-host');if(key&&host.querySelector('[data-fleet-camera]'))preservedCameras[key]=host;});}
1772
1977
  renderFleetOperations(nodes||[],'fleet');
1773
1978
  if(!nodes || !nodes.length){ el.innerHTML = '<div class="empty">No nodes reporting yet. Start peers with <span class="mono">infinicode serve</span> or <span class="mono">robopark setup</span>.</div>'; return; }
1774
1979
  nodes=nodes.slice();
@@ -1871,7 +2076,7 @@ footer.cmd{left:var(--global-nav-width);transition:left .24s cubic-bezier(.2,.8,
1871
2076
  if(tele){var fleetStage=tele.current_stage||{},fleetStageStatus=fleetStage.status||tele.current_stage_status||'waiting',fleetStageLabel=fleetStage.label||tele.current_stage_label||'Waiting for pipeline telemetry';html+='<div class="fleet-stage-focus '+esc(fleetStageStatus)+'"><span>Live production stage</span><b>'+esc(fleetStageLabel)+'</b></div>';}
1872
2077
 
1873
2078
  if(isRegisteredRobot&&cameraRef){
1874
- html += '<div class="fleet-live-camera" data-fleet-camera-host="'+esc(cameraRef)+'">'+((up||partialOnline)?'<img alt="Live camera for '+esc(n.displayName)+'" data-fleet-camera="'+esc(cameraRef)+'">':'')+'<span class="state">'+(up?'connecting camera':(partialOnline?'connecting camera / voice active':'offline / camera paused'))+'</span></div>';
2079
+ html += '<div class="fleet-live-camera" data-fleet-camera-host="'+esc(cameraRef)+'">'+((up||partialOnline)?'<video muted autoplay playsinline aria-label="Live camera for '+esc(n.displayName)+'" data-fleet-camera="'+esc(cameraRef)+'"></video>':'')+'<span class="state">'+(up?'connecting camera':(partialOnline?'connecting camera / voice active':'offline / camera paused'))+'</span></div>';
1875
2080
  }
1876
2081
 
1877
2082
  if(up){
@@ -1896,16 +2101,15 @@ footer.cmd{left:var(--global-nav-width);transition:left .24s cubic-bezier(.2,.8,
1896
2101
  + (isRegisteredRobot?('<div class="fleet-card-actions"><button class="rp-btn primary" data-fleet-action="camera" data-robot="'+esc(n.displayName)+'"'+(up?'':' disabled')+'>Live camera</button><button class="rp-btn" data-fleet-action="motors" data-robot="'+esc(n.displayName)+'">Motors</button><button class="rp-btn" data-fleet-action="sessions" data-robot="'+esc(n.displayName)+'">Sessions</button><button class="rp-btn" data-fleet-action="incidents" data-robot="'+esc(n.displayName)+'">Health</button>'+(tele&&(tele.character_id||tele.character_preset_id)?'<button class="rp-btn" data-config-edit-character="'+esc(tele.character_id||tele.character_preset_id)+'">Edit character</button>':'')+(tele&&tele.voice_stack_id?'<button class="rp-btn" data-config-edit-stack="'+esc(tele.voice_stack_id)+'">Edit voice</button>':'')+'</div>'):'')+'</div>';
1897
2102
  }
1898
2103
  el.innerHTML = html;
1899
- Array.prototype.forEach.call(el.querySelectorAll('[data-fleet-camera]'),function(placeholder){
1900
- var key=placeholder.getAttribute('data-fleet-camera'),old=preservedCameras[key];
1901
- if(old){placeholder.parentNode.replaceChild(old,placeholder);placeholder=old;}
1902
- var host=placeholder.closest('[data-fleet-camera-host]'),state=host&&host.querySelector('.state');
1903
- rpReliableCamera(placeholder,key,{
1904
- connecting:function(){if(host){host.classList.remove('failed');}if(state)state.textContent='connecting camera';},
1905
- live:function(){if(host){host.classList.add('live');host.classList.remove('failed');}if(state)state.textContent='always-on live';},
1906
- failed:function(){if(host){host.classList.remove('live');host.classList.add('failed');}if(state)state.textContent='reconnecting camera';}
1907
- });
2104
+ Array.prototype.forEach.call(el.querySelectorAll('[data-fleet-camera-host]'),function(host){
2105
+ var key=host.getAttribute('data-fleet-camera-host'),video=host.querySelector('[data-fleet-camera]'),old=preservedCameras[key];
2106
+ if(!video)return; // offline card: no live media requested
2107
+ if(old&&host.parentNode){host.parentNode.replaceChild(old,host);host=old;video=host.querySelector('[data-fleet-camera]');}
2108
+ var state=host.querySelector('.state');
2109
+ connectFleetLiveCamera(video,key,state);
1908
2110
  });
2111
+ // Close rooms whose tiles just went offline or were rendered away.
2112
+ sweepFleetCameraRooms();
1909
2113
  var cards = el.querySelectorAll('.node');
1910
2114
  for(var j=0;j<cards.length;j++){
1911
2115
  (function(card){
@@ -2057,8 +2261,8 @@ footer.cmd{left:var(--global-nav-width);transition:left .24s cubic-bezier(.2,.8,
2057
2261
  });
2058
2262
  }
2059
2263
  function mergeSchedulerRobots(nodes){
2060
- return Promise.all([getJson('/robopark/api/robots'), getJson('/robopark/api/devices'), getJson('/robopark/api/character-presets'), getJson('/api/robopark/live-rooms').catch(function(){return [];})]).then(function(data){
2061
- var rows = data[0], devices = data[1], liveRooms=Array.isArray(data[3])?data[3]:[];
2264
+ return Promise.all([getJson('/robopark/api/robots'), getJson('/robopark/api/devices'), getJson('/robopark/api/character-presets'), getJson('/api/robopark/live-rooms').catch(function(){return [];}), getJson('/robopark/api/sessions?active_only=true').catch(function(){return [];})]).then(function(data){
2265
+ var rows = data[0], devices = data[1], liveRooms=Array.isArray(data[3])?data[3]:[], activeSessions=Array.isArray(data[4])?data[4]:[];
2062
2266
  characterPresets=Array.isArray(data[2])?data[2]:(data[2]&&data[2].presets)||[];
2063
2267
  var deviceById = {}, deviceByName = {};
2064
2268
  function norm(v){ return String(v||'').trim().toLowerCase(); }
@@ -2117,6 +2321,18 @@ footer.cmd{left:var(--global-nav-width);transition:left .24s cubic-bezier(.2,.8,
2117
2321
  var id=device.id||activeRow.id||activeRow.robot_id||(liveRoom&&liveRoom.robot_id)||'';
2118
2322
  var row=activeRow.id||activeRow.robot_id?activeRow:(rowsById[norm(id)]||{});
2119
2323
  var name=String(preset.name||characterId).trim();
2324
+ // Camera publishers join robopark-<claim/device id> (a character call
2325
+ // page claims a device id like claim_63a36d48…), so an active
2326
+ // session's robot_id or the live-room census is the authoritative
2327
+ // camera stream identity; the bound device id is only a fallback.
2328
+ var activeSession=activeSessions.find(function(sess){
2329
+ var sid=norm(sess.robot_id||sess.device_id);if(!sid)return false;
2330
+ if(sid===characterId||norm(sess.character_id||sess.character_preset_id)===characterId)return true;
2331
+ return matchingDevices.some(function(candidate){return norm(candidate.id)===sid;});
2332
+ })||null;
2333
+ var liveRoomName=liveRoom?String(liveRoom.room_name||liveRoom.room||'').trim():'';
2334
+ var cameraStreamId=String((activeSession&&(activeSession.robot_id||activeSession.device_id))||(liveRoomName?liveRoomName.replace(/^robopark-/,''):'')||(liveRoom&&liveRoom.robot_id)||id||'').trim();
2335
+ if(name&&cameraStreamId)rpCameraStreamIds[name]=cameraStreamId;
2120
2336
  var status = String(row.connection_status || row.status || device.connection_status || device.status || '').toLowerCase();
2121
2337
  var heartbeat = row.last_heartbeat || device.last_heartbeat;
2122
2338
  var heartbeatAt = heartbeat ? Date.parse(heartbeat) : NaN;
@@ -144,7 +144,11 @@
144
144
  }
145
145
  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}
146
146
  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)}
147
- 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})}
147
+ // simulcast:false is load-bearing: livekit-server 1.13.4 ACKs a simulcast
148
+ // publish (the page logs "Camera relay live") but never adds the track to
149
+ // room state, so every subscriber — including the fleet grid — waits for a
150
+ // camera track that never comes. Single-layer publishes propagate normally.
151
+ 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,simulcast:false})}).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})}
148
152
  // camera=off: the RoboPark vision server is the sole owner of this kiosk's
149
153
  // camera, and the control centre watches its MJPEG stream rather than a
150
154
  // browser LiveKit publisher. A second opener of a USB camera just fails on