robopark 3.1.1 → 3.2.0

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 (312) hide show
  1. package/README.md +15 -5
  2. package/dist/robopark/frontend-service.js +80 -0
  3. package/dist/robopark/serve.js +2 -2
  4. package/dist/robopark/standalone.js +106 -8
  5. package/package.json +35 -3
  6. package/ui/ROBOVOICE_BUILD.json +9 -0
  7. package/ui/standalone/.next/BUILD_ID +1 -0
  8. package/ui/standalone/.next/app-build-manifest.json +391 -0
  9. package/ui/standalone/.next/app-path-routes-manifest.json +55 -0
  10. package/ui/standalone/.next/build-manifest.json +33 -0
  11. package/ui/standalone/.next/package.json +1 -0
  12. package/ui/standalone/.next/prerender-manifest.json +41 -0
  13. package/ui/standalone/.next/react-loadable-manifest.json +14 -0
  14. package/ui/standalone/.next/required-server-files.json +362 -0
  15. package/ui/standalone/.next/routes-manifest.json +246 -0
  16. package/ui/standalone/.next/server/app/(app)/opengraph-image-xg4ifa/route.js +1 -0
  17. package/ui/standalone/.next/server/app/(app)/opengraph-image-xg4ifa/route.js.nft.json +1 -0
  18. package/ui/standalone/.next/server/app/(app)/opengraph-image-xg4ifa/route_client-reference-manifest.js +1 -0
  19. package/ui/standalone/.next/server/app/(app)/page.js +2 -0
  20. package/ui/standalone/.next/server/app/(app)/page.js.nft.json +1 -0
  21. package/ui/standalone/.next/server/app/(app)/page_client-reference-manifest.js +1 -0
  22. package/ui/standalone/.next/server/app/(app)/voice/page.js +12 -0
  23. package/ui/standalone/.next/server/app/(app)/voice/page.js.nft.json +1 -0
  24. package/ui/standalone/.next/server/app/(app)/voice/page_client-reference-manifest.js +1 -0
  25. package/ui/standalone/.next/server/app/_not-found/page.js +12 -0
  26. package/ui/standalone/.next/server/app/_not-found/page.js.nft.json +1 -0
  27. package/ui/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  28. package/ui/standalone/.next/server/app/api/connection-details/route.js +1 -0
  29. package/ui/standalone/.next/server/app/api/connection-details/route.js.nft.json +1 -0
  30. package/ui/standalone/.next/server/app/api/connection-details/route_client-reference-manifest.js +1 -0
  31. package/ui/standalone/.next/server/app/api/device-character/route.js +1 -0
  32. package/ui/standalone/.next/server/app/api/device-character/route.js.nft.json +1 -0
  33. package/ui/standalone/.next/server/app/api/device-character/route_client-reference-manifest.js +1 -0
  34. package/ui/standalone/.next/server/app/api/download-piper-model/route.js +1 -0
  35. package/ui/standalone/.next/server/app/api/download-piper-model/route.js.nft.json +1 -0
  36. package/ui/standalone/.next/server/app/api/download-piper-model/route_client-reference-manifest.js +1 -0
  37. package/ui/standalone/.next/server/app/api/model-status/route.js +1 -0
  38. package/ui/standalone/.next/server/app/api/model-status/route.js.nft.json +1 -0
  39. package/ui/standalone/.next/server/app/api/model-status/route_client-reference-manifest.js +1 -0
  40. package/ui/standalone/.next/server/app/api/models/route.js +1 -0
  41. package/ui/standalone/.next/server/app/api/models/route.js.nft.json +1 -0
  42. package/ui/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
  43. package/ui/standalone/.next/server/app/api/prewarm/route.js +1 -0
  44. package/ui/standalone/.next/server/app/api/prewarm/route.js.nft.json +1 -0
  45. package/ui/standalone/.next/server/app/api/prewarm/route_client-reference-manifest.js +1 -0
  46. package/ui/standalone/.next/server/app/api/prompt/route.js +1 -0
  47. package/ui/standalone/.next/server/app/api/prompt/route.js.nft.json +1 -0
  48. package/ui/standalone/.next/server/app/api/prompt/route_client-reference-manifest.js +1 -0
  49. package/ui/standalone/.next/server/app/api/reload-tools/route.js +1 -0
  50. package/ui/standalone/.next/server/app/api/reload-tools/route.js.nft.json +1 -0
  51. package/ui/standalone/.next/server/app/api/reload-tools/route_client-reference-manifest.js +1 -0
  52. package/ui/standalone/.next/server/app/api/robopark/camera-token/route.js +1 -0
  53. package/ui/standalone/.next/server/app/api/robopark/camera-token/route.js.nft.json +1 -0
  54. package/ui/standalone/.next/server/app/api/robopark/camera-token/route_client-reference-manifest.js +1 -0
  55. package/ui/standalone/.next/server/app/api/robopark/character-ai/route.js +1 -0
  56. package/ui/standalone/.next/server/app/api/robopark/character-ai/route.js.nft.json +1 -0
  57. package/ui/standalone/.next/server/app/api/robopark/character-ai/route_client-reference-manifest.js +1 -0
  58. package/ui/standalone/.next/server/app/api/robopark/device-access/route.js +1 -0
  59. package/ui/standalone/.next/server/app/api/robopark/device-access/route.js.nft.json +1 -0
  60. package/ui/standalone/.next/server/app/api/robopark/device-access/route_client-reference-manifest.js +1 -0
  61. package/ui/standalone/.next/server/app/api/robopark/devices/[deviceId]/control/route.js +1 -0
  62. package/ui/standalone/.next/server/app/api/robopark/devices/[deviceId]/control/route.js.nft.json +1 -0
  63. package/ui/standalone/.next/server/app/api/robopark/devices/[deviceId]/control/route_client-reference-manifest.js +1 -0
  64. package/ui/standalone/.next/server/app/api/robopark/live-rooms/route.js +1 -0
  65. package/ui/standalone/.next/server/app/api/robopark/live-rooms/route.js.nft.json +1 -0
  66. package/ui/standalone/.next/server/app/api/robopark/live-rooms/route_client-reference-manifest.js +1 -0
  67. package/ui/standalone/.next/server/app/api/robopark/monitor-token/route.js +1 -0
  68. package/ui/standalone/.next/server/app/api/robopark/monitor-token/route.js.nft.json +1 -0
  69. package/ui/standalone/.next/server/app/api/robopark/monitor-token/route_client-reference-manifest.js +1 -0
  70. package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/operations/route.js +1 -0
  71. package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/operations/route.js.nft.json +1 -0
  72. package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/operations/route_client-reference-manifest.js +1 -0
  73. package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/voice-engine/route.js +1 -0
  74. package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/voice-engine/route.js.nft.json +1 -0
  75. package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/voice-engine/route_client-reference-manifest.js +1 -0
  76. package/ui/standalone/.next/server/app/api/robopark/robots/route.js +1 -0
  77. package/ui/standalone/.next/server/app/api/robopark/robots/route.js.nft.json +1 -0
  78. package/ui/standalone/.next/server/app/api/robopark/robots/route_client-reference-manifest.js +1 -0
  79. package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/metrics/route.js +1 -0
  80. package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/metrics/route.js.nft.json +1 -0
  81. package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/metrics/route_client-reference-manifest.js +1 -0
  82. package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/route.js +1 -0
  83. package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/route.js.nft.json +1 -0
  84. package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/route_client-reference-manifest.js +1 -0
  85. package/ui/standalone/.next/server/app/api/robopark/servers/route.js +1 -0
  86. package/ui/standalone/.next/server/app/api/robopark/servers/route.js.nft.json +1 -0
  87. package/ui/standalone/.next/server/app/api/robopark/servers/route_client-reference-manifest.js +1 -0
  88. package/ui/standalone/.next/server/app/api/robopark/sessions/[sessionId]/end/route.js +1 -0
  89. package/ui/standalone/.next/server/app/api/robopark/sessions/[sessionId]/end/route.js.nft.json +1 -0
  90. package/ui/standalone/.next/server/app/api/robopark/sessions/[sessionId]/end/route_client-reference-manifest.js +1 -0
  91. package/ui/standalone/.next/server/app/api/robopark/sessions/route.js +1 -0
  92. package/ui/standalone/.next/server/app/api/robopark/sessions/route.js.nft.json +1 -0
  93. package/ui/standalone/.next/server/app/api/robopark/sessions/route_client-reference-manifest.js +1 -0
  94. package/ui/standalone/.next/server/app/api/robopark/transcripts/[sessionId]/route.js +1 -0
  95. package/ui/standalone/.next/server/app/api/robopark/transcripts/[sessionId]/route.js.nft.json +1 -0
  96. package/ui/standalone/.next/server/app/api/robopark/transcripts/[sessionId]/route_client-reference-manifest.js +1 -0
  97. package/ui/standalone/.next/server/app/api/robopark/transcripts/route.js +1 -0
  98. package/ui/standalone/.next/server/app/api/robopark/transcripts/route.js.nft.json +1 -0
  99. package/ui/standalone/.next/server/app/api/robopark/transcripts/route_client-reference-manifest.js +1 -0
  100. package/ui/standalone/.next/server/app/api/robovoice/robots/[robotId]/media-health/route.js +1 -0
  101. package/ui/standalone/.next/server/app/api/robovoice/robots/[robotId]/media-health/route.js.nft.json +1 -0
  102. package/ui/standalone/.next/server/app/api/robovoice/robots/[robotId]/media-health/route_client-reference-manifest.js +1 -0
  103. package/ui/standalone/.next/server/app/api/settings/route.js +1 -0
  104. package/ui/standalone/.next/server/app/api/settings/route.js.nft.json +1 -0
  105. package/ui/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -0
  106. package/ui/standalone/.next/server/app/api/setup/complete/route.js +1 -0
  107. package/ui/standalone/.next/server/app/api/setup/complete/route.js.nft.json +1 -0
  108. package/ui/standalone/.next/server/app/api/setup/complete/route_client-reference-manifest.js +1 -0
  109. package/ui/standalone/.next/server/app/api/setup/status/route.js +1 -0
  110. package/ui/standalone/.next/server/app/api/setup/status/route.js.nft.json +1 -0
  111. package/ui/standalone/.next/server/app/api/setup/status/route_client-reference-manifest.js +1 -0
  112. package/ui/standalone/.next/server/app/api/setup/test-groq/route.js +1 -0
  113. package/ui/standalone/.next/server/app/api/setup/test-groq/route.js.nft.json +1 -0
  114. package/ui/standalone/.next/server/app/api/setup/test-groq/route_client-reference-manifest.js +1 -0
  115. package/ui/standalone/.next/server/app/api/setup/test-hass/route.js +1 -0
  116. package/ui/standalone/.next/server/app/api/setup/test-hass/route.js.nft.json +1 -0
  117. package/ui/standalone/.next/server/app/api/setup/test-hass/route_client-reference-manifest.js +1 -0
  118. package/ui/standalone/.next/server/app/api/setup/test-n8n/route.js +1 -0
  119. package/ui/standalone/.next/server/app/api/setup/test-n8n/route.js.nft.json +1 -0
  120. package/ui/standalone/.next/server/app/api/setup/test-n8n/route_client-reference-manifest.js +1 -0
  121. package/ui/standalone/.next/server/app/api/setup/test-ollama/route.js +1 -0
  122. package/ui/standalone/.next/server/app/api/setup/test-ollama/route.js.nft.json +1 -0
  123. package/ui/standalone/.next/server/app/api/setup/test-ollama/route_client-reference-manifest.js +1 -0
  124. package/ui/standalone/.next/server/app/api/test-tts/route.js +1 -0
  125. package/ui/standalone/.next/server/app/api/test-tts/route.js.nft.json +1 -0
  126. package/ui/standalone/.next/server/app/api/test-tts/route_client-reference-manifest.js +1 -0
  127. package/ui/standalone/.next/server/app/api/turn-credentials/route.js +1 -0
  128. package/ui/standalone/.next/server/app/api/turn-credentials/route.js.nft.json +1 -0
  129. package/ui/standalone/.next/server/app/api/turn-credentials/route_client-reference-manifest.js +1 -0
  130. package/ui/standalone/.next/server/app/api/voices/route.js +1 -0
  131. package/ui/standalone/.next/server/app/api/voices/route.js.nft.json +1 -0
  132. package/ui/standalone/.next/server/app/api/voices/route_client-reference-manifest.js +1 -0
  133. package/ui/standalone/.next/server/app/api/wake/route.js +1 -0
  134. package/ui/standalone/.next/server/app/api/wake/route.js.nft.json +1 -0
  135. package/ui/standalone/.next/server/app/api/wake/route_client-reference-manifest.js +1 -0
  136. package/ui/standalone/.next/server/app/api/wake-word/models/route.js +1 -0
  137. package/ui/standalone/.next/server/app/api/wake-word/models/route.js.nft.json +1 -0
  138. package/ui/standalone/.next/server/app/api/wake-word/models/route_client-reference-manifest.js +1 -0
  139. package/ui/standalone/.next/server/app/api/wake-word/status/route.js +1 -0
  140. package/ui/standalone/.next/server/app/api/wake-word/status/route.js.nft.json +1 -0
  141. package/ui/standalone/.next/server/app/api/wake-word/status/route_client-reference-manifest.js +1 -0
  142. package/ui/standalone/.next/server/app/api/wake-word/upload/route.js +1 -0
  143. package/ui/standalone/.next/server/app/api/wake-word/upload/route.js.nft.json +1 -0
  144. package/ui/standalone/.next/server/app/api/wake-word/upload/route_client-reference-manifest.js +1 -0
  145. package/ui/standalone/.next/server/app/favicon.ico/route.js +1 -0
  146. package/ui/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  147. package/ui/standalone/.next/server/app/favicon.ico.body +0 -0
  148. package/ui/standalone/.next/server/app/favicon.ico.meta +1 -0
  149. package/ui/standalone/.next/server/app/fed/[...path]/route.js +4 -0
  150. package/ui/standalone/.next/server/app/fed/[...path]/route.js.nft.json +1 -0
  151. package/ui/standalone/.next/server/app/fed/[...path]/route_client-reference-manifest.js +1 -0
  152. package/ui/standalone/.next/server/app/fed/media/robots/[robotId]/video_feed/route.js +1 -0
  153. package/ui/standalone/.next/server/app/fed/media/robots/[robotId]/video_feed/route.js.nft.json +1 -0
  154. package/ui/standalone/.next/server/app/fed/media/robots/[robotId]/video_feed/route_client-reference-manifest.js +1 -0
  155. package/ui/standalone/.next/server/app/robopark/[...path]/route.js +1 -0
  156. package/ui/standalone/.next/server/app/robopark/[...path]/route.js.nft.json +1 -0
  157. package/ui/standalone/.next/server/app/robopark/[...path]/route_client-reference-manifest.js +1 -0
  158. package/ui/standalone/.next/server/app/robopark/api/[...path]/route.js +1 -0
  159. package/ui/standalone/.next/server/app/robopark/api/[...path]/route.js.nft.json +1 -0
  160. package/ui/standalone/.next/server/app/robopark/api/[...path]/route_client-reference-manifest.js +1 -0
  161. package/ui/standalone/.next/server/app/robopark/api/robots/[robotId]/stream/route.js +1 -0
  162. package/ui/standalone/.next/server/app/robopark/api/robots/[robotId]/stream/route.js.nft.json +1 -0
  163. package/ui/standalone/.next/server/app/robopark/api/robots/[robotId]/stream/route_client-reference-manifest.js +1 -0
  164. package/ui/standalone/.next/server/app/robopark/page.js +2 -0
  165. package/ui/standalone/.next/server/app/robopark/page.js.nft.json +1 -0
  166. package/ui/standalone/.next/server/app/robopark/page_client-reference-manifest.js +1 -0
  167. package/ui/standalone/.next/server/app/tailnet/route.js +1 -0
  168. package/ui/standalone/.next/server/app/tailnet/route.js.nft.json +1 -0
  169. package/ui/standalone/.next/server/app/tailnet/route_client-reference-manifest.js +1 -0
  170. package/ui/standalone/.next/server/app/vendor/livekit-client.umd.js/route.js +1 -0
  171. package/ui/standalone/.next/server/app/vendor/livekit-client.umd.js/route.js.nft.json +1 -0
  172. package/ui/standalone/.next/server/app/vendor/livekit-client.umd.js/route_client-reference-manifest.js +1 -0
  173. package/ui/standalone/.next/server/app/voice-tester/page.js +2 -0
  174. package/ui/standalone/.next/server/app/voice-tester/page.js.nft.json +1 -0
  175. package/ui/standalone/.next/server/app/voice-tester/page_client-reference-manifest.js +1 -0
  176. package/ui/standalone/.next/server/app-paths-manifest.json +55 -0
  177. package/ui/standalone/.next/server/chunks/1428.js +1 -0
  178. package/ui/standalone/.next/server/chunks/1692.js +1 -0
  179. package/ui/standalone/.next/server/chunks/37.js +1 -0
  180. package/ui/standalone/.next/server/chunks/4876.js +1 -0
  181. package/ui/standalone/.next/server/chunks/5232.js +9 -0
  182. package/ui/standalone/.next/server/chunks/5455.js +11 -0
  183. package/ui/standalone/.next/server/chunks/5611.js +6 -0
  184. package/ui/standalone/.next/server/chunks/5873.js +22 -0
  185. package/ui/standalone/.next/server/chunks/6018.js +1 -0
  186. package/ui/standalone/.next/server/chunks/8755.js +1 -0
  187. package/ui/standalone/.next/server/chunks/9077.js +11 -0
  188. package/ui/standalone/.next/server/functions-config-manifest.json +9 -0
  189. package/ui/standalone/.next/server/middleware-build-manifest.js +1 -0
  190. package/ui/standalone/.next/server/middleware-manifest.json +6 -0
  191. package/ui/standalone/.next/server/middleware-react-loadable-manifest.js +1 -0
  192. package/ui/standalone/.next/server/next-font-manifest.js +1 -0
  193. package/ui/standalone/.next/server/next-font-manifest.json +1 -0
  194. package/ui/standalone/.next/server/pages/500.html +1 -0
  195. package/ui/standalone/.next/server/pages/_app.js +1 -0
  196. package/ui/standalone/.next/server/pages/_app.js.nft.json +1 -0
  197. package/ui/standalone/.next/server/pages/_document.js +1 -0
  198. package/ui/standalone/.next/server/pages/_document.js.nft.json +1 -0
  199. package/ui/standalone/.next/server/pages/_error.js +19 -0
  200. package/ui/standalone/.next/server/pages/_error.js.nft.json +1 -0
  201. package/ui/standalone/.next/server/pages-manifest.json +5 -0
  202. package/ui/standalone/.next/server/server-reference-manifest.js +1 -0
  203. package/ui/standalone/.next/server/server-reference-manifest.json +1 -0
  204. package/ui/standalone/.next/server/webpack-runtime.js +1 -0
  205. package/ui/standalone/.next/static/T3eGaQUuZNb6rhEStcouc/_buildManifest.js +1 -0
  206. package/ui/standalone/.next/static/T3eGaQUuZNb6rhEStcouc/_ssgManifest.js +1 -0
  207. package/ui/standalone/.next/static/chunks/1255-404bb8de49c90395.js +1 -0
  208. package/ui/standalone/.next/static/chunks/144d3bae-bd5d150c0cab972e.js +1 -0
  209. package/ui/standalone/.next/static/chunks/1646.9123ee47220ed70b.js +1 -0
  210. package/ui/standalone/.next/static/chunks/2333-43c39acb531f7d4e.js +3 -0
  211. package/ui/standalone/.next/static/chunks/4bd1b696-f785427dddbba9fb.js +1 -0
  212. package/ui/standalone/.next/static/chunks/5139.c5e46d26064a85db.js +1 -0
  213. package/ui/standalone/.next/static/chunks/76e8f37e-2ae0e3fe7b44d874.js +1 -0
  214. package/ui/standalone/.next/static/chunks/9880-53262785284464cc.js +1 -0
  215. package/ui/standalone/.next/static/chunks/adfb71a7-625c1b5ebd039b6a.js +1 -0
  216. package/ui/standalone/.next/static/chunks/app/(app)/layout-5f312b128a0caf75.js +1 -0
  217. package/ui/standalone/.next/static/chunks/app/(app)/opengraph-image-xg4ifa/route-5f312b128a0caf75.js +1 -0
  218. package/ui/standalone/.next/static/chunks/app/(app)/page-5f312b128a0caf75.js +1 -0
  219. package/ui/standalone/.next/static/chunks/app/(app)/voice/page-72d72d9a70d9c1d4.js +1 -0
  220. package/ui/standalone/.next/static/chunks/app/_not-found/page-cfd7daa82d71540c.js +1 -0
  221. package/ui/standalone/.next/static/chunks/app/api/connection-details/route-5f312b128a0caf75.js +1 -0
  222. package/ui/standalone/.next/static/chunks/app/api/device-character/route-5f312b128a0caf75.js +1 -0
  223. package/ui/standalone/.next/static/chunks/app/api/download-piper-model/route-5f312b128a0caf75.js +1 -0
  224. package/ui/standalone/.next/static/chunks/app/api/model-status/route-5f312b128a0caf75.js +1 -0
  225. package/ui/standalone/.next/static/chunks/app/api/models/route-5f312b128a0caf75.js +1 -0
  226. package/ui/standalone/.next/static/chunks/app/api/prewarm/route-5f312b128a0caf75.js +1 -0
  227. package/ui/standalone/.next/static/chunks/app/api/prompt/route-5f312b128a0caf75.js +1 -0
  228. package/ui/standalone/.next/static/chunks/app/api/reload-tools/route-5f312b128a0caf75.js +1 -0
  229. package/ui/standalone/.next/static/chunks/app/api/robopark/camera-token/route-5f312b128a0caf75.js +1 -0
  230. package/ui/standalone/.next/static/chunks/app/api/robopark/character-ai/route-5f312b128a0caf75.js +1 -0
  231. package/ui/standalone/.next/static/chunks/app/api/robopark/device-access/route-5f312b128a0caf75.js +1 -0
  232. package/ui/standalone/.next/static/chunks/app/api/robopark/devices/[deviceId]/control/route-5f312b128a0caf75.js +1 -0
  233. package/ui/standalone/.next/static/chunks/app/api/robopark/live-rooms/route-5f312b128a0caf75.js +1 -0
  234. package/ui/standalone/.next/static/chunks/app/api/robopark/monitor-token/route-5f312b128a0caf75.js +1 -0
  235. package/ui/standalone/.next/static/chunks/app/api/robopark/robots/[robotId]/operations/route-5f312b128a0caf75.js +1 -0
  236. package/ui/standalone/.next/static/chunks/app/api/robopark/robots/[robotId]/voice-engine/route-5f312b128a0caf75.js +1 -0
  237. package/ui/standalone/.next/static/chunks/app/api/robopark/robots/route-5f312b128a0caf75.js +1 -0
  238. package/ui/standalone/.next/static/chunks/app/api/robopark/servers/[serverId]/metrics/route-5f312b128a0caf75.js +1 -0
  239. package/ui/standalone/.next/static/chunks/app/api/robopark/servers/[serverId]/route-5f312b128a0caf75.js +1 -0
  240. package/ui/standalone/.next/static/chunks/app/api/robopark/servers/route-5f312b128a0caf75.js +1 -0
  241. package/ui/standalone/.next/static/chunks/app/api/robopark/sessions/[sessionId]/end/route-5f312b128a0caf75.js +1 -0
  242. package/ui/standalone/.next/static/chunks/app/api/robopark/sessions/route-5f312b128a0caf75.js +1 -0
  243. package/ui/standalone/.next/static/chunks/app/api/robopark/transcripts/[sessionId]/route-5f312b128a0caf75.js +1 -0
  244. package/ui/standalone/.next/static/chunks/app/api/robopark/transcripts/route-5f312b128a0caf75.js +1 -0
  245. package/ui/standalone/.next/static/chunks/app/api/robovoice/robots/[robotId]/media-health/route-5f312b128a0caf75.js +1 -0
  246. package/ui/standalone/.next/static/chunks/app/api/settings/route-5f312b128a0caf75.js +1 -0
  247. package/ui/standalone/.next/static/chunks/app/api/setup/complete/route-5f312b128a0caf75.js +1 -0
  248. package/ui/standalone/.next/static/chunks/app/api/setup/status/route-5f312b128a0caf75.js +1 -0
  249. package/ui/standalone/.next/static/chunks/app/api/setup/test-groq/route-5f312b128a0caf75.js +1 -0
  250. package/ui/standalone/.next/static/chunks/app/api/setup/test-hass/route-5f312b128a0caf75.js +1 -0
  251. package/ui/standalone/.next/static/chunks/app/api/setup/test-n8n/route-5f312b128a0caf75.js +1 -0
  252. package/ui/standalone/.next/static/chunks/app/api/setup/test-ollama/route-5f312b128a0caf75.js +1 -0
  253. package/ui/standalone/.next/static/chunks/app/api/test-tts/route-5f312b128a0caf75.js +1 -0
  254. package/ui/standalone/.next/static/chunks/app/api/turn-credentials/route-5f312b128a0caf75.js +1 -0
  255. package/ui/standalone/.next/static/chunks/app/api/voices/route-5f312b128a0caf75.js +1 -0
  256. package/ui/standalone/.next/static/chunks/app/api/wake/route-5f312b128a0caf75.js +1 -0
  257. package/ui/standalone/.next/static/chunks/app/api/wake-word/models/route-5f312b128a0caf75.js +1 -0
  258. package/ui/standalone/.next/static/chunks/app/api/wake-word/status/route-5f312b128a0caf75.js +1 -0
  259. package/ui/standalone/.next/static/chunks/app/api/wake-word/upload/route-5f312b128a0caf75.js +1 -0
  260. package/ui/standalone/.next/static/chunks/app/fed/[...path]/route-5f312b128a0caf75.js +1 -0
  261. package/ui/standalone/.next/static/chunks/app/fed/media/robots/[robotId]/video_feed/route-5f312b128a0caf75.js +1 -0
  262. package/ui/standalone/.next/static/chunks/app/layout-fcce963da1d8220f.js +1 -0
  263. package/ui/standalone/.next/static/chunks/app/robopark/[...path]/route-5f312b128a0caf75.js +1 -0
  264. package/ui/standalone/.next/static/chunks/app/robopark/api/[...path]/route-5f312b128a0caf75.js +1 -0
  265. package/ui/standalone/.next/static/chunks/app/robopark/api/robots/[robotId]/stream/route-5f312b128a0caf75.js +1 -0
  266. package/ui/standalone/.next/static/chunks/app/robopark/page-5f312b128a0caf75.js +1 -0
  267. package/ui/standalone/.next/static/chunks/app/tailnet/route-5f312b128a0caf75.js +1 -0
  268. package/ui/standalone/.next/static/chunks/app/vendor/livekit-client.umd.js/route-5f312b128a0caf75.js +1 -0
  269. package/ui/standalone/.next/static/chunks/app/voice-tester/page-ae699e048e0eb834.js +1 -0
  270. package/ui/standalone/.next/static/chunks/framework-e60c938074ff7136.js +1 -0
  271. package/ui/standalone/.next/static/chunks/main-9e24e8708ff075fc.js +1 -0
  272. package/ui/standalone/.next/static/chunks/main-app-a1f59168303c7f84.js +1 -0
  273. package/ui/standalone/.next/static/chunks/pages/_app-131c90850aef965b.js +1 -0
  274. package/ui/standalone/.next/static/chunks/pages/_error-e4ba546eb376bdf4.js +1 -0
  275. package/ui/standalone/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  276. package/ui/standalone/.next/static/chunks/webpack-5252e5254da079b5.js +1 -0
  277. package/ui/standalone/.next/static/css/3f478a573f9be82e.css +1 -0
  278. package/ui/standalone/.next/static/css/51560c4af1d5a21f.css +1 -0
  279. package/ui/standalone/.next/static/media/27fe93087559d480-s.p.otf +0 -0
  280. package/ui/standalone/.next/static/media/4d3869dd8a56345a-s.p.otf +0 -0
  281. package/ui/standalone/.next/static/media/63f3bb9ce29e22d5-s.p.otf +0 -0
  282. package/ui/standalone/.next/static/media/79e1c5d0f2fe9f68-s.p.otf +0 -0
  283. package/ui/standalone/.next/static/media/8bf7b2ceda89477b-s.p.woff2 +0 -0
  284. package/ui/standalone/.next/static/media/98baa4a7809fbf72-s.woff2 +0 -0
  285. package/ui/standalone/.next/static/media/f7650dfaa438c37c-s.woff2 +0 -0
  286. package/ui/standalone/package.json +57 -0
  287. package/ui/standalone/public/caal-logo.svg +3 -0
  288. package/ui/standalone/public/commit-mono-400-regular.woff +0 -0
  289. package/ui/standalone/public/cwl-logo-round.png +0 -0
  290. package/ui/standalone/public/everett-light.woff +0 -0
  291. package/ui/standalone/public/hey_cal.ppn +0 -0
  292. package/ui/standalone/public/install-robot-kiosk.sh +242 -0
  293. package/ui/standalone/public/lk-logo-dark.svg +18 -0
  294. package/ui/standalone/public/lk-logo.svg +18 -0
  295. package/ui/standalone/public/lk-wordmark.svg +12 -0
  296. package/ui/standalone/public/opengraph-image-bg.png +0 -0
  297. package/ui/standalone/public/porcupine_params.pv +0 -0
  298. package/ui/standalone/public/robopark-control.html +9200 -0
  299. package/ui/standalone/public/static/robopark/barracuda.png +0 -0
  300. package/ui/standalone/public/static/robopark/bmw.png +0 -0
  301. package/ui/standalone/public/static/robopark/jaguar.png +0 -0
  302. package/ui/standalone/public/static/robopark/magnus.jpg +0 -0
  303. package/ui/standalone/public/static/robopark/panda.png +0 -0
  304. package/ui/standalone/public/static/robopark/tesla.png +0 -0
  305. package/ui/standalone/public/static/robopark/titan.jpg +0 -0
  306. package/ui/standalone/public/static/robopark/volt.png +0 -0
  307. package/ui/standalone/public/tailnet/index.html +8995 -0
  308. package/ui/standalone/public/transcript-analytics.html +72 -0
  309. package/ui/standalone/public/vendor/elevenlabs-client.iife.js +24200 -0
  310. package/ui/standalone/public/vendor/livekit-client.umd.js +2 -0
  311. package/ui/standalone/public/voice-join.html +89 -0
  312. package/ui/standalone/server.js +38 -0
package/README.md CHANGED
@@ -24,12 +24,22 @@ On the gateway:
24
24
  robopark --password '<activation-password>' gateway start --public-url https://robopark.example.com
25
25
  ```
26
26
 
27
- `gateway start` owns both RoboPark surfaces:
28
-
29
- - Full Park Control Center: port 47913
27
+ `gateway start` owns the complete stable ROBOVOICE frontend and RoboPark
28
+ services:
29
+
30
+ - Full ROBOVOICE stable frontend: port 47913
31
+ - Park Control Center: `/robopark` or `/robopark-control.html`
32
+ - Voice operations: `/voice`
33
+ - Voice tester: `/voice-tester`
34
+ - Managed character joins: `/voice-join.html`
30
35
  - Private scheduler/API service: port 8080
36
+ - Private control compatibility adapter: port 47914
31
37
 
32
- InfiniCode is not required to render or operate the Park UI.
38
+ The frontend is the prebuilt production output from
39
+ `MrYungCEO/ROBOVOICE-main` stable, including its React application, Next API
40
+ routes, static Park operator UI, native microphone handling, live room/camera
41
+ discovery, transcript surfaces, settings, setup, and device operations.
42
+ InfiniCode is not required to render or operate any RoboPark surface.
33
43
 
34
44
  The gateway prints a complete connection command. Run it once on a device:
35
45
 
@@ -82,7 +92,7 @@ RoboPark owns device connectivity, camera/audio, sessions, transcripts, and the
82
92
  operator gateway. InfiniCode is an optional management/orchestration layer and
83
93
  is not a runtime dependency.
84
94
 
85
- The 3.0 artifact deliberately preserves the current scheduler, Pi client,
95
+ The 3.2 artifact deliberately preserves the current scheduler, Pi client,
86
96
  ElevenLabs conversation worker, camera/vision service, screen relay, motor
87
97
  bridge, configuration filenames, and service names. Existing enrolled robots
88
98
  are grandfathered on upgrade and continue using their current device identity
@@ -0,0 +1,80 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ function packageRoot() {
6
+ return dirname(dirname(dirname(fileURLToPath(import.meta.url))));
7
+ }
8
+ export function frontendServerPath() {
9
+ return join(packageRoot(), 'ui', 'standalone', 'server.js');
10
+ }
11
+ async function waitForFrontend(port, child) {
12
+ const deadline = Date.now() + 60_000;
13
+ let lastError = 'not responding';
14
+ while (Date.now() < deadline) {
15
+ if (child.exitCode !== null) {
16
+ throw new Error(`ROBOVOICE frontend exited before readiness (code ${child.exitCode})`);
17
+ }
18
+ try {
19
+ const response = await fetch(`http://127.0.0.1:${port}/fed/ui-build`, {
20
+ signal: AbortSignal.timeout(1_500),
21
+ });
22
+ if (response.ok) {
23
+ const body = await response.json();
24
+ if (body.source === 'robovoice-control' && body.build)
25
+ return;
26
+ lastError = `unexpected UI owner ${JSON.stringify(body)}`;
27
+ }
28
+ else {
29
+ lastError = `HTTP ${response.status}`;
30
+ }
31
+ }
32
+ catch (error) {
33
+ lastError = error instanceof Error ? error.message : String(error);
34
+ }
35
+ await new Promise(resolve => setTimeout(resolve, 500));
36
+ }
37
+ throw new Error(`ROBOVOICE frontend did not become healthy on port ${port}: ${lastError}`);
38
+ }
39
+ export async function startFrontendService(opts) {
40
+ const server = frontendServerPath();
41
+ if (!existsSync(server)) {
42
+ throw new Error('packaged ROBOVOICE stable frontend is missing; reinstall robopark');
43
+ }
44
+ const root = dirname(server);
45
+ const child = spawn(process.execPath, [server], {
46
+ cwd: root,
47
+ windowsHide: true,
48
+ stdio: ['ignore', 'inherit', 'inherit'],
49
+ env: {
50
+ ...process.env,
51
+ NODE_ENV: 'production',
52
+ HOSTNAME: opts.host,
53
+ PORT: String(opts.port),
54
+ ROBOPARK_CONTROL_URL: `http://127.0.0.1:${opts.adapterPort}`,
55
+ ROBOPARK_SCHEDULER_URL: `http://127.0.0.1:${opts.schedulerPort}`,
56
+ SCHEDULER_URL: `http://127.0.0.1:${opts.schedulerPort}`,
57
+ V2_SCHEDULER_URL: `http://127.0.0.1:${opts.schedulerPort}`,
58
+ NEXT_PUBLIC_LIVEKIT_URL: process.env.NEXT_PUBLIC_LIVEKIT_URL || 'auto',
59
+ },
60
+ });
61
+ try {
62
+ await waitForFrontend(opts.port, child);
63
+ return child;
64
+ }
65
+ catch (error) {
66
+ try {
67
+ child.kill('SIGTERM');
68
+ }
69
+ catch { /* already stopped */ }
70
+ throw error;
71
+ }
72
+ }
73
+ export function stopFrontendService(child) {
74
+ if (!child || child.exitCode !== null)
75
+ return;
76
+ try {
77
+ child.kill('SIGTERM');
78
+ }
79
+ catch { /* already stopped */ }
80
+ }
@@ -255,11 +255,11 @@ function openBrowser(url) {
255
255
  // Use detached platform-native launchers so robopark serve remains usable
256
256
  // from terminals and does not inherit browser stdio or lifecycle.
257
257
  const command = process.platform === 'win32'
258
- ? 'cmd.exe'
258
+ ? 'explorer.exe'
259
259
  : process.platform === 'darwin'
260
260
  ? 'open'
261
261
  : 'xdg-open';
262
- const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
262
+ const args = [url];
263
263
  try {
264
264
  spawn(command, args, { detached: true, stdio: 'ignore', windowsHide: true }).unref();
265
265
  }
@@ -8,6 +8,7 @@ import { registerAutoStart } from './auto-start.js';
8
8
  import { findPython, findSchedulerPath, prepareRobotPython } from './python-env.js';
9
9
  import { roboparkServe, schedulerHealthy } from './serve.js';
10
10
  import { startControlServer } from './control-server.js';
11
+ import { startFrontendService, stopFrontendService } from './frontend-service.js';
11
12
  import { activateFromPairing } from './access.js';
12
13
  const STATE_DIR = process.env.ROBOPARK_HOME
13
14
  ? resolve(process.env.ROBOPARK_HOME)
@@ -150,6 +151,7 @@ export async function connectDevice(token, opts = {}) {
150
151
  deviceToken: enrolled.device_token,
151
152
  name,
152
153
  connectedAt: new Date().toISOString(),
154
+ controlPort: pairing.controlPort,
153
155
  };
154
156
  atomicJson(CONNECTION_PATH, connection);
155
157
  writeFileSync(join(STATE_DIR, 'device_token'), connection.deviceToken, { encoding: 'utf8', mode: 0o600 });
@@ -196,6 +198,56 @@ function positiveInteger(value, fallback, label) {
196
198
  throw new Error(`${label} must be a positive integer`);
197
199
  return parsed;
198
200
  }
201
+ function openBrowser(url) {
202
+ // Use detached platform-native launchers so this CLI remains usable from
203
+ // terminals and does not inherit browser stdio or lifecycle.
204
+ const command = process.platform === 'win32'
205
+ ? 'explorer.exe'
206
+ : process.platform === 'darwin'
207
+ ? 'open'
208
+ : 'xdg-open';
209
+ // Do not route URLs through cmd.exe. Character links contain "&"; cmd
210
+ // treats each query parameter after the first as a separate shell command,
211
+ // causing the browser to receive an incomplete join link.
212
+ const args = [url];
213
+ try {
214
+ spawn(command, args, { detached: true, stdio: 'ignore', windowsHide: true }).unref();
215
+ }
216
+ catch (err) {
217
+ console.log(chalk.yellow(` ⚠ could not open browser: ${err instanceof Error ? err.message : String(err)}`));
218
+ }
219
+ }
220
+ /**
221
+ * Opens the character-specific ElevenLabs voice-join page (served by the Park
222
+ * Control Center, not the scheduler) for the device just configured. Best
223
+ * effort only: a browser-less robot host or an unreachable control server
224
+ * must never fail `robopark start`/`robopark connect`.
225
+ */
226
+ async function openCharacterCallPage(connection, character) {
227
+ try {
228
+ const preset = await jsonRequest(`${connection.schedulerUrl}/api/character-presets/${encodeURIComponent(character)}`, {});
229
+ if (!preset.elevenlabs_agent_id) {
230
+ console.log(chalk.yellow(` ⚠ character "${character}" has no ElevenLabs agent configured; not opening a call page.`));
231
+ return;
232
+ }
233
+ const controlPort = connection.controlPort ?? 47913;
234
+ const controlHost = new URL(connection.schedulerUrl).hostname;
235
+ const params = new URLSearchParams({
236
+ character,
237
+ agent_id: preset.elevenlabs_agent_id,
238
+ mode: 'production',
239
+ robot: connection.deviceId,
240
+ });
241
+ if (preset.elevenlabs_branch_id)
242
+ params.set('branch_id', preset.elevenlabs_branch_id);
243
+ const url = `http://${controlHost}:${controlPort}/voice-join.html?${params.toString()}`;
244
+ console.log(` call page: ${chalk.cyan(url)}`);
245
+ openBrowser(url);
246
+ }
247
+ catch (err) {
248
+ console.log(chalk.yellow(` ⚠ could not open the character call page: ${err instanceof Error ? err.message : String(err)}`));
249
+ }
250
+ }
199
251
  export async function startDevice(opts) {
200
252
  const connection = readConnection();
201
253
  const desired = {
@@ -216,6 +268,9 @@ export async function startDevice(opts) {
216
268
  }
217
269
  await updateDeviceConfiguration(desired);
218
270
  atomicJson(DESIRED_PATH, desired);
271
+ if (desired.character) {
272
+ await openCharacterCallPage(connection, desired.character);
273
+ }
219
274
  if (opts.foreground) {
220
275
  await superviseDevice(DESIRED_PATH);
221
276
  return;
@@ -424,20 +479,37 @@ export async function gatewayStart(opts) {
424
479
  }
425
480
  const schedulerUrl = localPublicUrl(host, port, opts.publicUrl);
426
481
  const healthUrl = `http://127.0.0.1:${port}`;
482
+ const controlHealthUrl = `http://127.0.0.1:${controlPort}/fed/ui-build`;
427
483
  const deadline = Date.now() + 30_000;
428
- while (!(await schedulerHealthy(healthUrl, 1_000))) {
429
- if (Date.now() >= deadline)
430
- throw new Error(`gateway did not become healthy at ${schedulerUrl}`);
484
+ let schedulerReady = false;
485
+ let controlReady = false;
486
+ while (!schedulerReady || !controlReady) {
487
+ [schedulerReady, controlReady] = await Promise.all([
488
+ schedulerHealthy(healthUrl, 1_000),
489
+ fetch(controlHealthUrl, { signal: AbortSignal.timeout(1_000) })
490
+ .then(async (response) => {
491
+ if (!response.ok)
492
+ return false;
493
+ const body = await response.json();
494
+ return body.owner === 'robopark' || body.source === 'robovoice-control';
495
+ })
496
+ .catch(() => false),
497
+ ]);
498
+ if (Date.now() >= deadline) {
499
+ throw new Error(`gateway did not become healthy (scheduler ${port}: ${schedulerReady ? 'ready' : 'down'}, `
500
+ + `Control Center ${controlPort}: ${controlReady ? 'ready' : 'down'})`);
501
+ }
431
502
  await wait(500);
432
503
  }
433
- const token = await createGatewayTokenAt(healthUrl, schedulerUrl);
504
+ const token = await createGatewayTokenAt(healthUrl, schedulerUrl, controlPort);
434
505
  const controlHost = new URL(schedulerUrl).hostname;
435
- console.log(` Park Control Center: ${chalk.cyan(`http://${controlHost}:${controlPort}/`)}`);
506
+ console.log(` Park Control Center: ${chalk.cyan(`http://${controlHost}:${controlPort}/robopark`)}`);
507
+ console.log(` Voice operations: ${chalk.cyan(`http://${controlHost}:${controlPort}/voice`)}`);
436
508
  console.log(chalk.bold('\n Connect a device'));
437
509
  console.log(` ${chalk.cyan(`robopark connect ${token}`)}`);
438
510
  console.log(chalk.dim(' This pairing token expires in 24 hours. Connected devices keep their own durable credentials.\n'));
439
511
  }
440
- async function createGatewayTokenAt(localUrl, publicUrl) {
512
+ async function createGatewayTokenAt(localUrl, publicUrl, controlPort) {
441
513
  await jsonRequest(`${localUrl}/api/settings`, {
442
514
  method: 'PUT',
443
515
  headers: { 'content-type': 'application/json' },
@@ -449,6 +521,7 @@ async function createGatewayTokenAt(localUrl, publicUrl) {
449
521
  schedulerUrl: publicUrl,
450
522
  enrollmentToken: result.enrollment_token,
451
523
  expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
524
+ controlPort,
452
525
  });
453
526
  atomicJson(GATEWAY_PATH, { schedulerUrl: publicUrl, pairingToken: pairing, createdAt: new Date().toISOString() });
454
527
  return pairing;
@@ -456,14 +529,26 @@ async function createGatewayTokenAt(localUrl, publicUrl) {
456
529
  export async function runGatewayService(opts) {
457
530
  const schedulerPort = positiveInteger(opts.port, 8080, 'port');
458
531
  const controlPort = positiveInteger(opts.controlPort, 47913, 'control port');
532
+ const adapterPort = controlPort + 1;
459
533
  const host = opts.host ?? '0.0.0.0';
460
534
  const control = await startControlServer({
461
535
  host,
462
- port: controlPort,
536
+ port: adapterPort,
463
537
  schedulerUrl: `http://127.0.0.1:${schedulerPort}`,
464
538
  });
465
- console.log(` Park Control Center listening on ${host}:${controlPort}`);
539
+ let frontend;
466
540
  try {
541
+ frontend = await startFrontendService({
542
+ host,
543
+ port: controlPort,
544
+ adapterPort,
545
+ schedulerPort,
546
+ });
547
+ console.log(` ROBOVOICE stable frontend listening on ${host}:${controlPort}`);
548
+ console.log(` RoboPark control adapter listening on ${host}:${adapterPort}`);
549
+ const frontendExit = new Promise(resolve => {
550
+ frontend?.once('exit', () => resolve('frontend-exit'));
551
+ });
467
552
  await roboparkServe({
468
553
  port: String(schedulerPort),
469
554
  host,
@@ -471,8 +556,21 @@ export async function runGatewayService(opts) {
471
556
  open: false,
472
557
  foreground: true,
473
558
  });
559
+ // roboparkServe wires the scheduler child's lifecycle handlers and then
560
+ // returns once it has launched. Keep this outer gateway process alive so
561
+ // the sibling Control Center server is not closed by the finally block.
562
+ const shutdown = new Promise(resolve => {
563
+ const stop = () => resolve('shutdown');
564
+ process.once('SIGINT', stop);
565
+ process.once('SIGTERM', stop);
566
+ });
567
+ const ended = await Promise.race([shutdown, frontendExit]);
568
+ if (ended === 'frontend-exit') {
569
+ throw new Error('ROBOVOICE stable frontend stopped unexpectedly');
570
+ }
474
571
  }
475
572
  finally {
573
+ stopFrontendService(frontend);
476
574
  control.close();
477
575
  }
478
576
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "robopark",
3
- "version": "3.1.1",
3
+ "version": "3.2.0",
4
4
  "description": "Standalone packaged RoboPark control center and supervised robot runtime.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,6 +9,7 @@
9
9
  "files": [
10
10
  "bin/robopark.js",
11
11
  "dist",
12
+ "ui",
12
13
  "scripts/windows-shim-fix.cjs",
13
14
  "scheduler",
14
15
  "pi-client",
@@ -29,16 +30,42 @@
29
30
  "node": ">=20"
30
31
  },
31
32
  "dependencies": {
33
+ "@livekit/components-react": "^2.9.15",
34
+ "@livekit/protocol": "^1.40.0",
35
+ "@phosphor-icons/react": "^2.1.8",
36
+ "@picovoice/porcupine-web": "^4.0.0",
37
+ "@picovoice/web-voice-processor": "^4.0.9",
38
+ "@radix-ui/react-select": "^2.2.5",
39
+ "@radix-ui/react-slot": "^1.2.3",
40
+ "@radix-ui/react-toggle": "^1.1.9",
41
+ "@radix-ui/react-tooltip": "^1.2.8",
42
+ "buffer-image-size": "^0.6.4",
43
+ "class-variance-authority": "^0.7.1",
32
44
  "chalk": "^5.3.0",
45
+ "clsx": "^2.1.1",
33
46
  "commander": "^12.1.0",
34
47
  "conf": "^12.0.0",
35
48
  "execa": "^9.3.0",
36
- "livekit-client": "^2.20.1"
49
+ "jose": "^6.0.12",
50
+ "livekit-client": "^2.20.1",
51
+ "livekit-server-sdk": "^2.13.2",
52
+ "mime": "^4.0.7",
53
+ "motion": "^12.16.0",
54
+ "next": "15.5.21",
55
+ "next-themes": "^0.4.6",
56
+ "react": "^19.0.0",
57
+ "react-dom": "^19.0.0",
58
+ "sonner": "^2.0.7",
59
+ "tailwind-merge": "^3.3.0"
37
60
  },
38
61
  "devDependencies": {
39
62
  "@types/node": "^20.14.0",
40
63
  "typescript": "^5.4.5"
41
64
  },
65
+ "overrides": {
66
+ "postcss": "8.5.23",
67
+ "sharp": "0.35.3"
68
+ },
42
69
  "keywords": [
43
70
  "robopark",
44
71
  "fleet",
@@ -53,6 +80,11 @@
53
80
  "license": "MIT",
54
81
  "repository": {
55
82
  "type": "git",
56
- "url": "https://github.com/MrYungCEO/infinicode"
83
+ "url": "https://github.com/MrYungCEO/ROBOVOICE-main"
84
+ },
85
+ "roboparkBuild": {
86
+ "uiSourceBranch": "stable",
87
+ "uiSourceCommit": "be4ecb0",
88
+ "uiBuild": "production-native-microphone-20260725-8"
57
89
  }
58
90
  }
@@ -0,0 +1,9 @@
1
+ {
2
+ "repository": "https://github.com/MrYungCEO/ROBOVOICE-main",
3
+ "branch": "stable",
4
+ "commit": "be4ecb0",
5
+ "control_ui_build": "production-native-microphone-20260725-8",
6
+ "next_build_version": "15.5.7",
7
+ "next_runtime_version": "15.5.21",
8
+ "packaged_at": "2026-07-26"
9
+ }
@@ -0,0 +1 @@
1
+ T3eGaQUuZNb6rhEStcouc