robopark 2.8.35 → 3.0.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 (68) hide show
  1. package/README.md +88 -63
  2. package/bin/robopark.js +7 -17
  3. package/conversation/elevenlabs_agent.py +1985 -0
  4. package/conversation/requirements.txt +3 -0
  5. package/conversation/supervisor_store.py +189 -0
  6. package/dist/kernel/config-schema.js +37 -0
  7. package/dist/kernel/types.js +7 -0
  8. package/dist/robopark/access.js +99 -0
  9. package/dist/robopark/add-robot.js +188 -0
  10. package/dist/robopark/agent-ctl.js +305 -0
  11. package/dist/robopark/auto-start.js +289 -0
  12. package/dist/robopark/conversation.js +505 -0
  13. package/dist/robopark/deployment-commands.js +47 -0
  14. package/dist/robopark/discovery.js +180 -0
  15. package/dist/robopark/doctor.js +175 -0
  16. package/dist/robopark/enroll.js +68 -0
  17. package/dist/robopark/llm-set.js +87 -0
  18. package/dist/robopark/motor-control.js +195 -0
  19. package/dist/robopark/preview-agent-launcher.js +77 -0
  20. package/dist/robopark/probe.js +138 -0
  21. package/dist/robopark/profile.js +69 -0
  22. package/dist/robopark/python-env.js +162 -0
  23. package/dist/robopark/robot-runtime.js +489 -0
  24. package/dist/robopark/scan.js +97 -0
  25. package/dist/robopark/screen-control.js +55 -0
  26. package/dist/robopark/secrets.js +41 -0
  27. package/dist/robopark/serve.js +285 -0
  28. package/dist/robopark/server-add.js +114 -0
  29. package/dist/robopark/setup-livekit.js +300 -0
  30. package/dist/robopark/setup.js +286 -0
  31. package/dist/robopark/standalone.js +466 -0
  32. package/dist/robopark/stop-all.js +141 -0
  33. package/dist/robopark/verify.js +192 -0
  34. package/dist/robopark/vision-agent-launcher.js +98 -0
  35. package/dist/robopark/vision-control.js +81 -0
  36. package/dist/robopark-cli.js +799 -0
  37. package/package.json +21 -5
  38. package/pi-client/_install_steps.sh +29 -29
  39. package/pi-client/client.py +61 -2
  40. package/pi-client/install.sh +40 -40
  41. package/pi-client/join_convo.sh +54 -54
  42. package/pi-client/livekit_bridge.py +16 -7
  43. package/pi-client/motor_bridge.py +6 -3
  44. package/scheduler/fleet_config.json +75 -0
  45. package/scheduler/main.py +4505 -135
  46. package/scheduler/media_lock.py +57 -0
  47. package/scheduler/preview_agent.py +1465 -87
  48. package/scheduler/production_config.json +139 -0
  49. package/scheduler/robot_supervisor.py +1705 -0
  50. package/scheduler/scripts/install-robot-supervisor-linux.sh +33 -0
  51. package/scheduler/scripts/install-robot-supervisor-windows.ps1 +49 -0
  52. package/scheduler/scripts/robopark-supervisor.service +20 -0
  53. package/scheduler/scripts/start-scheduler-local.ps1 +50 -0
  54. package/scheduler/supervisor.example.json +26 -0
  55. package/scheduler/vision_motion_trigger.py +101 -0
  56. package/screen/screen_runtime.py +75 -0
  57. package/vision/app_pi_clean.py +253 -16
  58. package/vision/audio_server_pi.py +19 -0
  59. package/vision/install.sh +34 -34
  60. package/vision/motor_server.py +224 -61
  61. package/vision/requirements_camera.txt +6 -0
  62. package/vision/requirements_motor.txt +4 -0
  63. package/vision/requirements_pi_unified.txt +1 -0
  64. package/vision/requirements_vision_agent.txt +19 -0
  65. package/vision/run.sh +244 -244
  66. package/vision/services/services.sh +12 -12
  67. package/scheduler/__pycache__/main.cpython-312.pyc +0 -0
  68. package/scheduler/__pycache__/preview_agent.cpython-312.pyc +0 -0
package/vision/run.sh CHANGED
@@ -1,244 +1,244 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
- STATE_DIR="$ROOT_DIR/.run"
6
- LOG_DIR="$STATE_DIR/logs"
7
- VENV_DIR="$ROOT_DIR/venv"
8
-
9
- mkdir -p "$LOG_DIR"
10
-
11
- if [ -f "$ROOT_DIR/.env" ]; then
12
- set -a
13
- source "$ROOT_DIR/.env"
14
- set +a
15
- fi
16
-
17
- source "$ROOT_DIR/services/services.sh"
18
-
19
- require_venv() {
20
- if [ ! -f "$VENV_DIR/bin/activate" ]; then
21
- echo "Missing venv. Run: ./install.sh"
22
- exit 1
23
- fi
24
- }
25
-
26
- is_running() {
27
- local name="$1"
28
- local pid_file="$STATE_DIR/$name.pid"
29
- if [ ! -f "$pid_file" ]; then
30
- return 1
31
- fi
32
- local pid
33
- pid="$(cat "$pid_file" 2>/dev/null || true)"
34
- if [ -z "$pid" ]; then
35
- return 1
36
- fi
37
- kill -0 "$pid" >/dev/null 2>&1
38
- }
39
-
40
- start_one() {
41
- local name="$1"
42
- local cmd_var="SERVICE_${name}_CMD"
43
- local cmd
44
- cmd="${!cmd_var}"
45
- if [ -z "$cmd" ]; then
46
- echo "Unknown service: $name"
47
- exit 1
48
- fi
49
-
50
- if is_running "$name"; then
51
- echo "$name already running"
52
- return 0
53
- fi
54
-
55
- require_venv
56
- source "$VENV_DIR/bin/activate"
57
-
58
- local log_file="$LOG_DIR/$name.log"
59
- local pid_file="$STATE_DIR/$name.pid"
60
-
61
- echo "Starting $name"
62
- nohup bash -lc "cd \"$ROOT_DIR\" && source \"$VENV_DIR/bin/activate\" && $cmd" >>"$log_file" 2>&1 &
63
- echo $! >"$pid_file"
64
- }
65
-
66
- detect_terminal() {
67
- if command -v lxterminal >/dev/null 2>&1; then
68
- echo "lxterminal"
69
- return 0
70
- fi
71
- if command -v gnome-terminal >/dev/null 2>&1; then
72
- echo "gnome-terminal"
73
- return 0
74
- fi
75
- if command -v xterm >/dev/null 2>&1; then
76
- echo "xterm"
77
- return 0
78
- fi
79
- return 1
80
- }
81
-
82
- start_one_term() {
83
- local name="$1"
84
- local cmd_var="SERVICE_${name}_CMD"
85
- local cmd
86
- cmd="${!cmd_var}"
87
- if [ -z "$cmd" ]; then
88
- echo "Unknown service: $name"
89
- exit 1
90
- fi
91
-
92
- if is_running "$name"; then
93
- echo "$name already running"
94
- return 0
95
- fi
96
-
97
- require_venv
98
-
99
- local term
100
- term="$(detect_terminal || true)"
101
- if [ -z "$term" ]; then
102
- echo "No supported terminal found (need lxterminal, gnome-terminal, or xterm)"
103
- exit 1
104
- fi
105
-
106
- local log_file="$LOG_DIR/$name.log"
107
- local pid_file="$STATE_DIR/$name.pid"
108
- local title="RoboVision:$name"
109
- local run_cmd
110
- run_cmd="cd \"$ROOT_DIR\" && source \"$VENV_DIR/bin/activate\" && exec $cmd"
111
-
112
- echo "Starting $name in terminal ($term)"
113
-
114
- if [ "$term" = "lxterminal" ]; then
115
- lxterminal --title="$title" --command="bash -lc '$run_cmd'" >>"$log_file" 2>&1 &
116
- echo $! >"$pid_file"
117
- return 0
118
- fi
119
-
120
- if [ "$term" = "gnome-terminal" ]; then
121
- gnome-terminal --title="$title" -- bash -lc "$run_cmd" >>"$log_file" 2>&1 &
122
- echo $! >"$pid_file"
123
- return 0
124
- fi
125
-
126
- if [ "$term" = "xterm" ]; then
127
- xterm -T "$title" -e bash -lc "$run_cmd" >>"$log_file" 2>&1 &
128
- echo $! >"$pid_file"
129
- return 0
130
- fi
131
- }
132
-
133
- stop_one() {
134
- local name="$1"
135
- local pid_file="$STATE_DIR/$name.pid"
136
-
137
- if ! is_running "$name"; then
138
- rm -f "$pid_file"
139
- echo "$name not running"
140
- return 0
141
- fi
142
-
143
- local pid
144
- pid="$(cat "$pid_file")"
145
- echo "Stopping $name (pid $pid)"
146
- kill "$pid" >/dev/null 2>&1 || true
147
-
148
- local i
149
- for i in $(seq 1 30); do
150
- if kill -0 "$pid" >/dev/null 2>&1; then
151
- sleep 0.2
152
- else
153
- break
154
- fi
155
- done
156
-
157
- if kill -0 "$pid" >/dev/null 2>&1; then
158
- kill -9 "$pid" >/dev/null 2>&1 || true
159
- fi
160
-
161
- rm -f "$pid_file"
162
- }
163
-
164
- status_one() {
165
- local name="$1"
166
- local port_var="SERVICE_${name}_PORT"
167
- local port
168
- port="${!port_var}"
169
-
170
- if is_running "$name"; then
171
- echo "$name: running (port ${port:-n/a})"
172
- else
173
- echo "$name: stopped"
174
- fi
175
- }
176
-
177
- tail_one() {
178
- local name="$1"
179
- local log_file="$LOG_DIR/$name.log"
180
- if [ ! -f "$log_file" ]; then
181
- echo "No log file: $log_file"
182
- exit 1
183
- fi
184
- tail -n 200 -f "$log_file"
185
- }
186
-
187
- usage() {
188
- echo "Usage: ./run.sh <start|start-term|stop|restart|status|logs> [service]"
189
- echo "Services: ${SERVICES[*]}"
190
- }
191
-
192
- ACTION="${1:-}"
193
- NAME="${2:-all}"
194
-
195
- case "$ACTION" in
196
- start)
197
- if [ "$NAME" = "all" ]; then
198
- for s in "${SERVICES[@]}"; do start_one "$s"; done
199
- else
200
- start_one "$NAME"
201
- fi
202
- ;;
203
- start-term)
204
- if [ "$NAME" = "all" ]; then
205
- for s in "${SERVICES[@]}"; do start_one_term "$s"; done
206
- else
207
- start_one_term "$NAME"
208
- fi
209
- ;;
210
- stop)
211
- if [ "$NAME" = "all" ]; then
212
- for s in "${SERVICES[@]}"; do stop_one "$s"; done
213
- else
214
- stop_one "$NAME"
215
- fi
216
- ;;
217
- restart)
218
- if [ "$NAME" = "all" ]; then
219
- for s in "${SERVICES[@]}"; do stop_one "$s"; done
220
- for s in "${SERVICES[@]}"; do start_one "$s"; done
221
- else
222
- stop_one "$NAME"
223
- start_one "$NAME"
224
- fi
225
- ;;
226
- status)
227
- if [ "$NAME" = "all" ]; then
228
- for s in "${SERVICES[@]}"; do status_one "$s"; done
229
- else
230
- status_one "$NAME"
231
- fi
232
- ;;
233
- logs)
234
- if [ "$NAME" = "all" ]; then
235
- echo "Specify a service for logs"
236
- exit 1
237
- fi
238
- tail_one "$NAME"
239
- ;;
240
- *)
241
- usage
242
- exit 1
243
- ;;
244
- esac
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ STATE_DIR="$ROOT_DIR/.run"
6
+ LOG_DIR="$STATE_DIR/logs"
7
+ VENV_DIR="$ROOT_DIR/venv"
8
+
9
+ mkdir -p "$LOG_DIR"
10
+
11
+ if [ -f "$ROOT_DIR/.env" ]; then
12
+ set -a
13
+ source "$ROOT_DIR/.env"
14
+ set +a
15
+ fi
16
+
17
+ source "$ROOT_DIR/services/services.sh"
18
+
19
+ require_venv() {
20
+ if [ ! -f "$VENV_DIR/bin/activate" ]; then
21
+ echo "Missing venv. Run: ./install.sh"
22
+ exit 1
23
+ fi
24
+ }
25
+
26
+ is_running() {
27
+ local name="$1"
28
+ local pid_file="$STATE_DIR/$name.pid"
29
+ if [ ! -f "$pid_file" ]; then
30
+ return 1
31
+ fi
32
+ local pid
33
+ pid="$(cat "$pid_file" 2>/dev/null || true)"
34
+ if [ -z "$pid" ]; then
35
+ return 1
36
+ fi
37
+ kill -0 "$pid" >/dev/null 2>&1
38
+ }
39
+
40
+ start_one() {
41
+ local name="$1"
42
+ local cmd_var="SERVICE_${name}_CMD"
43
+ local cmd
44
+ cmd="${!cmd_var}"
45
+ if [ -z "$cmd" ]; then
46
+ echo "Unknown service: $name"
47
+ exit 1
48
+ fi
49
+
50
+ if is_running "$name"; then
51
+ echo "$name already running"
52
+ return 0
53
+ fi
54
+
55
+ require_venv
56
+ source "$VENV_DIR/bin/activate"
57
+
58
+ local log_file="$LOG_DIR/$name.log"
59
+ local pid_file="$STATE_DIR/$name.pid"
60
+
61
+ echo "Starting $name"
62
+ nohup bash -lc "cd \"$ROOT_DIR\" && source \"$VENV_DIR/bin/activate\" && $cmd" >>"$log_file" 2>&1 &
63
+ echo $! >"$pid_file"
64
+ }
65
+
66
+ detect_terminal() {
67
+ if command -v lxterminal >/dev/null 2>&1; then
68
+ echo "lxterminal"
69
+ return 0
70
+ fi
71
+ if command -v gnome-terminal >/dev/null 2>&1; then
72
+ echo "gnome-terminal"
73
+ return 0
74
+ fi
75
+ if command -v xterm >/dev/null 2>&1; then
76
+ echo "xterm"
77
+ return 0
78
+ fi
79
+ return 1
80
+ }
81
+
82
+ start_one_term() {
83
+ local name="$1"
84
+ local cmd_var="SERVICE_${name}_CMD"
85
+ local cmd
86
+ cmd="${!cmd_var}"
87
+ if [ -z "$cmd" ]; then
88
+ echo "Unknown service: $name"
89
+ exit 1
90
+ fi
91
+
92
+ if is_running "$name"; then
93
+ echo "$name already running"
94
+ return 0
95
+ fi
96
+
97
+ require_venv
98
+
99
+ local term
100
+ term="$(detect_terminal || true)"
101
+ if [ -z "$term" ]; then
102
+ echo "No supported terminal found (need lxterminal, gnome-terminal, or xterm)"
103
+ exit 1
104
+ fi
105
+
106
+ local log_file="$LOG_DIR/$name.log"
107
+ local pid_file="$STATE_DIR/$name.pid"
108
+ local title="RoboVision:$name"
109
+ local run_cmd
110
+ run_cmd="cd \"$ROOT_DIR\" && source \"$VENV_DIR/bin/activate\" && exec $cmd"
111
+
112
+ echo "Starting $name in terminal ($term)"
113
+
114
+ if [ "$term" = "lxterminal" ]; then
115
+ lxterminal --title="$title" --command="bash -lc '$run_cmd'" >>"$log_file" 2>&1 &
116
+ echo $! >"$pid_file"
117
+ return 0
118
+ fi
119
+
120
+ if [ "$term" = "gnome-terminal" ]; then
121
+ gnome-terminal --title="$title" -- bash -lc "$run_cmd" >>"$log_file" 2>&1 &
122
+ echo $! >"$pid_file"
123
+ return 0
124
+ fi
125
+
126
+ if [ "$term" = "xterm" ]; then
127
+ xterm -T "$title" -e bash -lc "$run_cmd" >>"$log_file" 2>&1 &
128
+ echo $! >"$pid_file"
129
+ return 0
130
+ fi
131
+ }
132
+
133
+ stop_one() {
134
+ local name="$1"
135
+ local pid_file="$STATE_DIR/$name.pid"
136
+
137
+ if ! is_running "$name"; then
138
+ rm -f "$pid_file"
139
+ echo "$name not running"
140
+ return 0
141
+ fi
142
+
143
+ local pid
144
+ pid="$(cat "$pid_file")"
145
+ echo "Stopping $name (pid $pid)"
146
+ kill "$pid" >/dev/null 2>&1 || true
147
+
148
+ local i
149
+ for i in $(seq 1 30); do
150
+ if kill -0 "$pid" >/dev/null 2>&1; then
151
+ sleep 0.2
152
+ else
153
+ break
154
+ fi
155
+ done
156
+
157
+ if kill -0 "$pid" >/dev/null 2>&1; then
158
+ kill -9 "$pid" >/dev/null 2>&1 || true
159
+ fi
160
+
161
+ rm -f "$pid_file"
162
+ }
163
+
164
+ status_one() {
165
+ local name="$1"
166
+ local port_var="SERVICE_${name}_PORT"
167
+ local port
168
+ port="${!port_var}"
169
+
170
+ if is_running "$name"; then
171
+ echo "$name: running (port ${port:-n/a})"
172
+ else
173
+ echo "$name: stopped"
174
+ fi
175
+ }
176
+
177
+ tail_one() {
178
+ local name="$1"
179
+ local log_file="$LOG_DIR/$name.log"
180
+ if [ ! -f "$log_file" ]; then
181
+ echo "No log file: $log_file"
182
+ exit 1
183
+ fi
184
+ tail -n 200 -f "$log_file"
185
+ }
186
+
187
+ usage() {
188
+ echo "Usage: ./run.sh <start|start-term|stop|restart|status|logs> [service]"
189
+ echo "Services: ${SERVICES[*]}"
190
+ }
191
+
192
+ ACTION="${1:-}"
193
+ NAME="${2:-all}"
194
+
195
+ case "$ACTION" in
196
+ start)
197
+ if [ "$NAME" = "all" ]; then
198
+ for s in "${SERVICES[@]}"; do start_one "$s"; done
199
+ else
200
+ start_one "$NAME"
201
+ fi
202
+ ;;
203
+ start-term)
204
+ if [ "$NAME" = "all" ]; then
205
+ for s in "${SERVICES[@]}"; do start_one_term "$s"; done
206
+ else
207
+ start_one_term "$NAME"
208
+ fi
209
+ ;;
210
+ stop)
211
+ if [ "$NAME" = "all" ]; then
212
+ for s in "${SERVICES[@]}"; do stop_one "$s"; done
213
+ else
214
+ stop_one "$NAME"
215
+ fi
216
+ ;;
217
+ restart)
218
+ if [ "$NAME" = "all" ]; then
219
+ for s in "${SERVICES[@]}"; do stop_one "$s"; done
220
+ for s in "${SERVICES[@]}"; do start_one "$s"; done
221
+ else
222
+ stop_one "$NAME"
223
+ start_one "$NAME"
224
+ fi
225
+ ;;
226
+ status)
227
+ if [ "$NAME" = "all" ]; then
228
+ for s in "${SERVICES[@]}"; do status_one "$s"; done
229
+ else
230
+ status_one "$NAME"
231
+ fi
232
+ ;;
233
+ logs)
234
+ if [ "$NAME" = "all" ]; then
235
+ echo "Specify a service for logs"
236
+ exit 1
237
+ fi
238
+ tail_one "$NAME"
239
+ ;;
240
+ *)
241
+ usage
242
+ exit 1
243
+ ;;
244
+ esac
@@ -1,12 +1,12 @@
1
- #!/usr/bin/env bash
2
-
3
- SERVICES=("vision" "motor" "audio")
4
-
5
- SERVICE_vision_PORT=5000
6
- SERVICE_vision_CMD="python app_pi_clean.py"
7
-
8
- SERVICE_motor_PORT=8001
9
- SERVICE_motor_CMD="python motor_server.py"
10
-
11
- SERVICE_audio_PORT=8000
12
- SERVICE_audio_CMD="python audio_server_pi.py"
1
+ #!/usr/bin/env bash
2
+
3
+ SERVICES=("vision" "motor" "audio")
4
+
5
+ SERVICE_vision_PORT=5000
6
+ SERVICE_vision_CMD="python app_pi_clean.py"
7
+
8
+ SERVICE_motor_PORT=8001
9
+ SERVICE_motor_CMD="python motor_server.py"
10
+
11
+ SERVICE_audio_PORT=8000
12
+ SERVICE_audio_CMD="python audio_server_pi.py"