diff --git a/SConstruct b/SConstruct index dff2cd40..5bdcf570 100644 --- a/SConstruct +++ b/SConstruct @@ -136,6 +136,8 @@ assert arch in ["larch64", "aarch64", "x86_64", "Darwin"] # Use the system toolchain explicitly on macOS for reliable local builds. cc = '/usr/bin/clang' if arch == "Darwin" else 'clang' cxx = '/usr/bin/clang++' if arch == "Darwin" else 'clang++' +ar = '/usr/bin/ar' if arch == "Darwin" else 'ar' +ranlib = '/usr/bin/ranlib' if arch == "Darwin" else 'ranlib' lenv = { "PATH": os.environ['PATH'], @@ -215,12 +217,8 @@ else: "/System/Library/Frameworks/OpenGL.framework/Libraries", ] - # cereal headers in this tree were generated with capnp 1.0.1, while - # Homebrew currently ships newer capnp headers (1.3.x). For mac host - # tooling builds (desktop UI/runtime .so), force the expected version - # macro so generated headers remain buildable. - cflags += ["-DGL_SILENCE_DEPRECATION", "-DCAPNP_VERSION=1000001"] - cxxflags += ["-DGL_SILENCE_DEPRECATION", "-DCAPNP_VERSION=1000001"] + cflags += ["-DGL_SILENCE_DEPRECATION"] + cxxflags += ["-DGL_SILENCE_DEPRECATION"] cpppath += [ f"{brew_prefix}/include", f"{brew_prefix}/opt/openssl@3.0/include", @@ -290,6 +288,8 @@ env = Environment( CC=cc, CXX=cxx, + AR=ar, + RANLIB=ranlib, LINKFLAGS=ldflags, RPATH=rpath, @@ -318,7 +318,9 @@ if arch == "Darwin": env.CompilationDatabase('compile_commands.json') # Setup cache dir -cache_dir = '/data/scons_cache' if AGNOS else '/tmp/scons_cache' +cache_dir = os.environ.get("SP_SCONS_CACHE_DIR", "").strip() +if not cache_dir: + cache_dir = '/data/scons_cache' if AGNOS else '/tmp/scons_cache' CacheDir(cache_dir) Clean(["."], cache_dir) diff --git a/common/libcommon.a b/common/libcommon.a index adac862e..bff03042 100644 Binary files a/common/libcommon.a and b/common/libcommon.a differ diff --git a/common/params_keys.h b/common/params_keys.h index f60a84a9..a0875512 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -238,9 +238,9 @@ inline static std::unordered_map keys = { {"DownloadAllModels", {CLEAR_ON_MANAGER_START, BOOL, "0", "0"}}, {"DownloadMaps", {CLEAR_ON_MANAGER_START, BOOL, "0", "0"}}, {"DriverCamera", {PERSISTENT, BOOL, "0", "0", 1}}, - {"Model", {PERSISTENT, STRING, "sc", "sc", 1}}, + {"Model", {PERSISTENT, STRING, "sc2", "sc2", 1}}, {"ModelVersion", {PERSISTENT, STRING, "v11", "v11", 1}}, - {"DrivingModel", {PERSISTENT, STRING, "sc", "sc", 1}}, + {"DrivingModel", {PERSISTENT, STRING, "sc2", "sc2", 1}}, {"DrivingModelName", {PERSISTENT, STRING, "South Carolina", "South Carolina", 1}}, {"DrivingModelVersion", {PERSISTENT, STRING, "v11", "v11", 1}}, {"DynamicPathWidth", {PERSISTENT, BOOL, "0", "0", 2}}, diff --git a/common/params_pyx.so b/common/params_pyx.so index ddfd9e62..1f550526 100755 Binary files a/common/params_pyx.so and b/common/params_pyx.so differ diff --git a/frogpilot/assets/model_manager.py b/frogpilot/assets/model_manager.py index ae199fbc..54274701 100644 --- a/frogpilot/assets/model_manager.py +++ b/frogpilot/assets/model_manager.py @@ -18,9 +18,9 @@ from openpilot.frogpilot.common.frogpilot_variables import MODELS_PATH MANIFEST_CANDIDATES = ("v21",) TINYGRAD_VERSIONS = {"v8", "v9", "v10", "v11", "v12"} -DEFAULT_MODEL_KEY = "sc" +DEFAULT_MODEL_KEY = "sc2" MODEL_KEY_CANONICAL_MAP = { - "sc2": "sc", + "sc": DEFAULT_MODEL_KEY, } CANCEL_DOWNLOAD_PARAM = "CancelModelDownload" @@ -34,6 +34,32 @@ def _clean_model_name(name: str) -> str: return re.sub(r"[πŸ—ΊοΈπŸ‘€πŸ“‘]", "", str(name or "")).strip() +def canonical_model_key(model_key: str) -> str: + key = (model_key or "").strip() + return MODEL_KEY_CANONICAL_MAP.get(key, key) + + +def is_builtin_model_key(model_key: str) -> bool: + return canonical_model_key(model_key) == DEFAULT_MODEL_KEY + + +def model_key_aliases(model_key: str) -> list[str]: + canonical_key = canonical_model_key(model_key) + aliases = [canonical_key] + + for alias, canonical in MODEL_KEY_CANONICAL_MAP.items(): + if canonical == canonical_key: + aliases.append(alias) + + if model_key.endswith("_default"): + aliases.append(model_key[:-8]) + + if model_key and not model_key.endswith("2"): + aliases.append(f"{model_key}2") + + return [alias for alias in dict.fromkeys(alias for alias in aliases if alias)] + + class ModelManager: def __init__(self, params, params_memory, boot_run=False): self.params = params @@ -51,8 +77,7 @@ class ModelManager: @staticmethod def _canonical_model_key(model_key: str) -> str: - key = (model_key or "").strip() - return MODEL_KEY_CANONICAL_MAP.get(key, key) + return canonical_model_key(model_key) def _param_text(self, key: str) -> str: raw = self.params.get(key) @@ -99,18 +124,7 @@ class ModelManager: self._set_model_param_keys(selected_model, selected_name, current_version) def _model_key_aliases(self, model_key: str) -> list[str]: - canonical_key = self._canonical_model_key(model_key) - aliases = [canonical_key] - # Preserve legacy alias lookups (e.g. sc2) even when canonicalized to sc. - for alias, canonical in MODEL_KEY_CANONICAL_MAP.items(): - if canonical == canonical_key: - aliases.append(alias) - if model_key.endswith("_default"): - aliases.append(model_key[:-8]) - # v21 manifest uses legacy IDs with a trailing "2" (e.g. sc -> sc2). - if model_key and not model_key.endswith("2"): - aliases.append(f"{model_key}2") - return [alias for alias in dict.fromkeys(aliases) if alias] + return model_key_aliases(model_key) def _model_version_map(self) -> dict[str, str]: return { @@ -148,6 +162,9 @@ class ModelManager: return filenames def _is_model_downloaded(self, model_key: str, model_version: str) -> bool: + if is_builtin_model_key(model_key): + return True + required_files = self._required_files(model_key, model_version) if not required_files: return False @@ -284,6 +301,12 @@ class ModelManager: def download_model(self, model_to_download: str): self.downloading_model = True + if is_builtin_model_key(model_to_download): + self.params_memory.put(DOWNLOAD_PROGRESS_PARAM, "Built-in model already downloaded.") + self.params_memory.remove(MODEL_DOWNLOAD_PARAM) + self.downloading_model = False + return + repo_url = get_repository_url() if not repo_url: handle_error(None, "GitHub and GitLab are offline...", "Repository unavailable", MODEL_DOWNLOAD_PARAM, DOWNLOAD_PROGRESS_PARAM, self.params_memory) diff --git a/frogpilot/common/frogpilot_variables.py b/frogpilot/common/frogpilot_variables.py index cd8305bb..a452e0ff 100644 --- a/frogpilot/common/frogpilot_variables.py +++ b/frogpilot/common/frogpilot_variables.py @@ -752,9 +752,9 @@ class FrogPilotVariables: toggle.stop_distance = self.get_value("StopDistance", cast=float, condition=longitudinal_tuning, default=6.0) toggle.taco_tune = self.get_value("TacoTune", condition=longitudinal_tuning) - toggle.model = self.get_value("Model", cast=None, default="sc") + toggle.model = self.get_value("Model", cast=None, default="sc2") if not toggle.model: - toggle.model = self.get_value("DrivingModel", cast=None, default="sc") + toggle.model = self.get_value("DrivingModel", cast=None, default="sc2") toggle.model_name = self.get_value("DrivingModelName", cast=None, default="South Carolina") toggle.model_version = self.get_value("ModelVersion", cast=None, default="v11") if not toggle.model_version: diff --git a/frogpilot/tinygrad_modeld/tinygrad_modeld.py b/frogpilot/tinygrad_modeld/tinygrad_modeld.py index 544df28c..12a25776 100755 --- a/frogpilot/tinygrad_modeld/tinygrad_modeld.py +++ b/frogpilot/tinygrad_modeld/tinygrad_modeld.py @@ -37,6 +37,9 @@ from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles PROCESS_NAME = "frogpilot.tinygrad_modeld.tinygrad_modeld" SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') +BUILTIN_MODEL_KEY = "sc2" +BUILTIN_MODEL_ALIASES = {BUILTIN_MODEL_KEY, "sc"} + LAT_SMOOTH_SECONDS = 0.0 LONG_SMOOTH_SECONDS = 0.3 @@ -60,6 +63,11 @@ def _get_param_str(params: Params, key: str, default: str = "") -> str: return str(val) +def _canonical_model_id(model_id: str) -> str: + key = (model_id or "").strip().lower() + return BUILTIN_MODEL_KEY if key in BUILTIN_MODEL_ALIASES else key + + def get_action_from_model(model_output: dict[str, np.ndarray], prev_action: log.ModelDataV2.Action, lat_action_t: float, long_action_t: float, v_ego: float, mlsim: bool, is_v9: bool, frogpilot_toggles) -> log.ModelDataV2.Action: plan = model_output['plan'][0] @@ -138,17 +146,18 @@ class ModelState: params = Params() model_id_raw = _get_param_str(params, "Model") if not model_id_raw: - model_id_raw = _get_param_str(params, "DrivingModel", "sc") - model_id = (model_id_raw.strip() or "sc").lower() + model_id_raw = _get_param_str(params, "DrivingModel", BUILTIN_MODEL_KEY) + model_id = _canonical_model_id(model_id_raw) model_version = _get_param_str(params, "ModelVersion") if not model_version: model_version = _get_param_str(params, "DrivingModelVersion") model_dir = MODELS_PATH - use_builtin_model = model_id == "sc" + use_builtin_model = model_id == BUILTIN_MODEL_KEY model_download_id = model_id - if use_builtin_model and (model_id_raw != model_id or _get_param_str(params, "DrivingModel") != model_id): + if use_builtin_model and (_canonical_model_id(_get_param_str(params, "Model")) != model_id or + _canonical_model_id(_get_param_str(params, "DrivingModel")) != model_id): params.put("Model", model_id) params.put("DrivingModel", model_id) diff --git a/panda/board/obj/body_h7.bin.signed b/panda/board/obj/body_h7.bin.signed index a3e68e3e..d8e5f0c8 100644 Binary files a/panda/board/obj/body_h7.bin.signed and b/panda/board/obj/body_h7.bin.signed differ diff --git a/panda/board/obj/body_h7/bootstub.elf b/panda/board/obj/body_h7/bootstub.elf index cac4a78d..3e210982 100755 Binary files a/panda/board/obj/body_h7/bootstub.elf and b/panda/board/obj/body_h7/bootstub.elf differ diff --git a/panda/board/obj/body_h7/main.bin b/panda/board/obj/body_h7/main.bin index 31768d37..69cd2529 100755 Binary files a/panda/board/obj/body_h7/main.bin and b/panda/board/obj/body_h7/main.bin differ diff --git a/panda/board/obj/body_h7/main.elf b/panda/board/obj/body_h7/main.elf index 6c9b758c..7972e759 100755 Binary files a/panda/board/obj/body_h7/main.elf and b/panda/board/obj/body_h7/main.elf differ diff --git a/panda/board/obj/bootstub.body_h7.bin b/panda/board/obj/bootstub.body_h7.bin index 84613e93..9a577c0a 100755 Binary files a/panda/board/obj/bootstub.body_h7.bin and b/panda/board/obj/bootstub.body_h7.bin differ diff --git a/panda/board/obj/bootstub.panda.bin b/panda/board/obj/bootstub.panda.bin index cad857d0..291b8c09 100755 Binary files a/panda/board/obj/bootstub.panda.bin and b/panda/board/obj/bootstub.panda.bin differ diff --git a/panda/board/obj/bootstub.panda_h7.bin b/panda/board/obj/bootstub.panda_h7.bin index 3e36b90f..260b83e6 100755 Binary files a/panda/board/obj/bootstub.panda_h7.bin and b/panda/board/obj/bootstub.panda_h7.bin differ diff --git a/panda/board/obj/bootstub.panda_h7_remote.bin b/panda/board/obj/bootstub.panda_h7_remote.bin index 3e36b90f..260b83e6 100755 Binary files a/panda/board/obj/bootstub.panda_h7_remote.bin and b/panda/board/obj/bootstub.panda_h7_remote.bin differ diff --git a/panda/board/obj/bootstub.panda_jungle_h7.bin b/panda/board/obj/bootstub.panda_jungle_h7.bin index 64485a81..8d893184 100755 Binary files a/panda/board/obj/bootstub.panda_jungle_h7.bin and b/panda/board/obj/bootstub.panda_jungle_h7.bin differ diff --git a/panda/board/obj/bootstub.panda_remote.bin b/panda/board/obj/bootstub.panda_remote.bin index cad857d0..291b8c09 100755 Binary files a/panda/board/obj/bootstub.panda_remote.bin and b/panda/board/obj/bootstub.panda_remote.bin differ diff --git a/panda/board/obj/gitversion.h b/panda/board/obj/gitversion.h index 03921a5f..de8f829e 100644 --- a/panda/board/obj/gitversion.h +++ b/panda/board/obj/gitversion.h @@ -1,2 +1,2 @@ extern const uint8_t gitversion[19]; -const uint8_t gitversion[19] = "DEV-0f4bae1c-DEBUG"; +const uint8_t gitversion[19] = "DEV-be385576-DEBUG"; diff --git a/panda/board/obj/panda.bin.signed b/panda/board/obj/panda.bin.signed index bdc6f953..70a6e28f 100644 Binary files a/panda/board/obj/panda.bin.signed and b/panda/board/obj/panda.bin.signed differ diff --git a/panda/board/obj/panda/bootstub.elf b/panda/board/obj/panda/bootstub.elf index 5d321438..903501a1 100755 Binary files a/panda/board/obj/panda/bootstub.elf and b/panda/board/obj/panda/bootstub.elf differ diff --git a/panda/board/obj/panda/main.bin b/panda/board/obj/panda/main.bin index 540ad3bb..e0d384db 100755 Binary files a/panda/board/obj/panda/main.bin and b/panda/board/obj/panda/main.bin differ diff --git a/panda/board/obj/panda/main.elf b/panda/board/obj/panda/main.elf index e8be8985..f3a2a320 100755 Binary files a/panda/board/obj/panda/main.elf and b/panda/board/obj/panda/main.elf differ diff --git a/panda/board/obj/panda_h7.bin.signed b/panda/board/obj/panda_h7.bin.signed index c7036437..22302862 100644 Binary files a/panda/board/obj/panda_h7.bin.signed and b/panda/board/obj/panda_h7.bin.signed differ diff --git a/panda/board/obj/panda_h7/bootstub.elf b/panda/board/obj/panda_h7/bootstub.elf index 9c3b27a8..f10442c5 100755 Binary files a/panda/board/obj/panda_h7/bootstub.elf and b/panda/board/obj/panda_h7/bootstub.elf differ diff --git a/panda/board/obj/panda_h7/main.bin b/panda/board/obj/panda_h7/main.bin index cb597ecb..5fe80ee7 100755 Binary files a/panda/board/obj/panda_h7/main.bin and b/panda/board/obj/panda_h7/main.bin differ diff --git a/panda/board/obj/panda_h7/main.elf b/panda/board/obj/panda_h7/main.elf index b4e29314..d27e2793 100755 Binary files a/panda/board/obj/panda_h7/main.elf and b/panda/board/obj/panda_h7/main.elf differ diff --git a/panda/board/obj/panda_h7_remote.bin.signed b/panda/board/obj/panda_h7_remote.bin.signed index b6e4692d..790770e5 100644 Binary files a/panda/board/obj/panda_h7_remote.bin.signed and b/panda/board/obj/panda_h7_remote.bin.signed differ diff --git a/panda/board/obj/panda_h7_remote/bootstub.elf b/panda/board/obj/panda_h7_remote/bootstub.elf index 406bb448..43bb574d 100755 Binary files a/panda/board/obj/panda_h7_remote/bootstub.elf and b/panda/board/obj/panda_h7_remote/bootstub.elf differ diff --git a/panda/board/obj/panda_h7_remote/main.bin b/panda/board/obj/panda_h7_remote/main.bin index 056d093c..3107fbec 100755 Binary files a/panda/board/obj/panda_h7_remote/main.bin and b/panda/board/obj/panda_h7_remote/main.bin differ diff --git a/panda/board/obj/panda_h7_remote/main.elf b/panda/board/obj/panda_h7_remote/main.elf index c063ee3f..49413b2b 100755 Binary files a/panda/board/obj/panda_h7_remote/main.elf and b/panda/board/obj/panda_h7_remote/main.elf differ diff --git a/panda/board/obj/panda_jungle_h7.bin.signed b/panda/board/obj/panda_jungle_h7.bin.signed index 8da07f9e..3f4d47aa 100644 Binary files a/panda/board/obj/panda_jungle_h7.bin.signed and b/panda/board/obj/panda_jungle_h7.bin.signed differ diff --git a/panda/board/obj/panda_jungle_h7/bootstub.elf b/panda/board/obj/panda_jungle_h7/bootstub.elf index 93e53b09..28641fdd 100755 Binary files a/panda/board/obj/panda_jungle_h7/bootstub.elf and b/panda/board/obj/panda_jungle_h7/bootstub.elf differ diff --git a/panda/board/obj/panda_jungle_h7/main.bin b/panda/board/obj/panda_jungle_h7/main.bin index eef6755d..5c9f17a5 100755 Binary files a/panda/board/obj/panda_jungle_h7/main.bin and b/panda/board/obj/panda_jungle_h7/main.bin differ diff --git a/panda/board/obj/panda_jungle_h7/main.elf b/panda/board/obj/panda_jungle_h7/main.elf index 497f6343..cfc0e87b 100755 Binary files a/panda/board/obj/panda_jungle_h7/main.elf and b/panda/board/obj/panda_jungle_h7/main.elf differ diff --git a/panda/board/obj/panda_remote.bin.signed b/panda/board/obj/panda_remote.bin.signed index 950328fc..b9d8cfde 100644 Binary files a/panda/board/obj/panda_remote.bin.signed and b/panda/board/obj/panda_remote.bin.signed differ diff --git a/panda/board/obj/panda_remote/bootstub.elf b/panda/board/obj/panda_remote/bootstub.elf index 3f0d2403..0bb2c764 100755 Binary files a/panda/board/obj/panda_remote/bootstub.elf and b/panda/board/obj/panda_remote/bootstub.elf differ diff --git a/panda/board/obj/panda_remote/main.bin b/panda/board/obj/panda_remote/main.bin index 727a1f4d..0d8b710b 100755 Binary files a/panda/board/obj/panda_remote/main.bin and b/panda/board/obj/panda_remote/main.bin differ diff --git a/panda/board/obj/panda_remote/main.elf b/panda/board/obj/panda_remote/main.elf index 24970ff6..76885c61 100755 Binary files a/panda/board/obj/panda_remote/main.elf and b/panda/board/obj/panda_remote/main.elf differ diff --git a/panda/board/obj/version b/panda/board/obj/version index dc8124d7..69314a8a 100644 --- a/panda/board/obj/version +++ b/panda/board/obj/version @@ -1 +1 @@ -DEV-0f4bae1c-DEBUG \ No newline at end of file +DEV-be385576-DEBUG \ No newline at end of file diff --git a/scripts/host_tool_runner.sh b/scripts/host_tool_runner.sh index d6c8d16f..0b6d4e00 100755 --- a/scripts/host_tool_runner.sh +++ b/scripts/host_tool_runner.sh @@ -14,7 +14,7 @@ HOST_LOCK_DIR="" HOST_LOCK_PID_FILE="" HOST_LOCK_CMD_FILE="" HOST_LOCK_HELD=0 -HOST_BUCKETS=(shared cabana plotjuggler) +HOST_BUCKETS=(shared cabana) usage() { cat <<'EOF' @@ -37,7 +37,7 @@ Commands: Notes: - Host-tool builds happen under ./.host_runtime/ and do not touch the main tree. - - `cabana` and `plotjuggler` use their own host-runtime buckets and can run together. + - `cabana` uses its own host-runtime bucket, so it can run together with `plotjuggler`. - Other commands that share a bucket still wait on that bucket's lock. - `./build` remains the device-target flow. - For c3/c4/raybig, pass the jobs count first to preserve existing shorthand: @@ -68,7 +68,7 @@ resolve_host_bucket() { echo "cabana" ;; plotjuggler|juggle) - echo "plotjuggler" + echo "shared" ;; *) return 1 @@ -305,9 +305,14 @@ setup_build_env() { export PATH="/opt/homebrew/bin:${PATH}" fi + mkdir -p "${HOST_ROOT}/scons_cache" + export SP_SCONS_CACHE_DIR="${HOST_ROOT}/scons_cache" + if [[ "$(uname -s)" == "Darwin" ]]; then export CC="/usr/bin/clang" export CXX="/usr/bin/clang++" + export AR="/usr/bin/ar" + export RANLIB="/usr/bin/ranlib" fi unset CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH CPPFLAGS CFLAGS CXXFLAGS LDFLAGS @@ -477,14 +482,14 @@ main() { acquire_host_lock "${command} $*" ;; plotjuggler|juggle) - set_host_bucket "plotjuggler" + set_host_bucket "shared" acquire_host_lock "${command} $*" ;; sync) if [[ $# -gt 0 ]]; then bucket="$(resolve_host_bucket "${1}")" || { echo "Unknown host bucket for sync: ${1}" >&2 - echo "Valid sync buckets: shared, cabana, plotjuggler" >&2 + echo "Valid sync buckets: shared, cabana" >&2 exit 1 } shift || true diff --git a/selfdrive/pandad/pandad b/selfdrive/pandad/pandad index acfc5148..ec96de12 100755 Binary files a/selfdrive/pandad/pandad and b/selfdrive/pandad/pandad differ diff --git a/selfdrive/ui/ui b/selfdrive/ui/ui index cf8f53e8..b5f099b5 100755 Binary files a/selfdrive/ui/ui and b/selfdrive/ui/ui differ diff --git a/system/camerad/camerad b/system/camerad/camerad index 29777620..956a56ca 100755 Binary files a/system/camerad/camerad and b/system/camerad/camerad differ diff --git a/system/loggerd/bootlog b/system/loggerd/bootlog index be5da2c8..69890e08 100755 Binary files a/system/loggerd/bootlog and b/system/loggerd/bootlog differ diff --git a/system/loggerd/encoderd b/system/loggerd/encoderd index be0a7528..92411a51 100755 Binary files a/system/loggerd/encoderd and b/system/loggerd/encoderd differ diff --git a/system/loggerd/loggerd b/system/loggerd/loggerd index a63c4372..0187bc55 100755 Binary files a/system/loggerd/loggerd and b/system/loggerd/loggerd differ diff --git a/tools/STARPILOT_DEVELOPMENT.md b/tools/STARPILOT_DEVELOPMENT.md index f9cf71be..cad6f266 100644 --- a/tools/STARPILOT_DEVELOPMENT.md +++ b/tools/STARPILOT_DEVELOPMENT.md @@ -109,9 +109,8 @@ Host-native artifacts live under: That host area contains: -- `worktree/` and `venv/` for the shared bucket used by UI/replay commands +- `worktree/` and `venv/` for the shared bucket used by UI, replay, and PlotJuggler - `cabana/worktree/` and `cabana/venv/` for Cabana -- `plotjuggler/worktree/` and `plotjuggler/venv/` for PlotJuggler - host-built binaries, static libs, objects, and Python extensions for each bucket Because `.host_runtime/` is git-ignored, running host tools no longer churns tracked files in the main repo. @@ -141,9 +140,8 @@ That means: Current bucket split: -- shared bucket: `./c3`, `./c4`, `./raybig`, `./dev replay`, `./dev shell` +- shared bucket: `./c3`, `./c4`, `./raybig`, `./dev replay`, `./dev plotjuggler`, `./dev juggle`, `./dev shell` - cabana bucket: `./dev cabana` -- plotjuggler bucket: `./dev plotjuggler`, `./dev juggle` This prevents one command from syncing or rebuilding over another live host session while still allowing the common Cabana + PlotJuggler pairing. @@ -197,7 +195,6 @@ To refresh one bucket only: ```bash ./dev sync cabana -./dev sync plotjuggler ./dev sync shared ```