[object Object]

← back to Exo Keepalive

exo cluster keepalive: always-on launchd agent + portable node-bind script

a2f326340ba84a6119f48330b1400857688b0a40 · 2026-07-06 20:22:14 -0700 · steve

Files touched

Diff

commit a2f326340ba84a6119f48330b1400857688b0a40
Author: steve <steve@designerwallcoverings.com>
Date:   Mon Jul 6 20:22:14 2026 -0700

    exo cluster keepalive: always-on launchd agent + portable node-bind script
---
 bind-exo-node.sh |    82 +
 exo.log          | 27444 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 launchd.err.log  |     0
 launchd.out.log  |     0
 run-exo.sh       |    12 +
 5 files changed, 27538 insertions(+)

diff --git a/bind-exo-node.sh b/bind-exo-node.sh
new file mode 100755
index 0000000..cdbd03d
--- /dev/null
+++ b/bind-exo-node.sh
@@ -0,0 +1,82 @@
+#!/usr/bin/env bash
+# bind-exo-node.sh — make THIS Mac Studio a permanent exo cluster node.
+# Portable: uses $HOME + the local user, so it works on any studio
+# (macstudio3 / stevestudio2 / steveabramsdesignsgmail.com / etc).
+# Run it ON the node you want to bind. Idempotent — safe to re-run.
+#
+#   Steve's rule: the exo cluster is ALWAYS on. This installs a launchd
+#   KeepAlive agent so exo (master+worker, API :52415) survives crash/logout/reboot
+#   and auto-joins the LAN cluster via exo's zero-config peer discovery.
+set -uo pipefail
+
+USER_HOME="$HOME"
+UV="$(command -v uv || echo "$USER_HOME/.local/bin/uv")"
+EXO_DIR="$USER_HOME/exo"
+KA_DIR="$USER_HOME/Projects/exo-keepalive"
+PLIST="$USER_HOME/Library/LaunchAgents/com.steve.exo-keepalive.plist"
+UID_N="$(id -u)"
+
+echo "== binding exo node: user=$(whoami) home=$USER_HOME =="
+
+# 0. sanity
+[ -x "$UV" ] || { echo "!! uv not found ($UV). Install uv first: curl -LsSf https://astral.sh/uv/install.sh | sh"; exit 1; }
+[ -d "$EXO_DIR" ] || { echo "!! ~/exo not present. Clone it first: git clone <exo-repo> ~/exo"; exit 1; }
+
+# 1. dashboard build (exo hard-requires ~/exo/dashboard/build/index.html)
+if [ ! -f "$EXO_DIR/dashboard/build/index.html" ]; then
+  echo "== building dashboard (one-time; needs npm install/build) =="
+  ( cd "$EXO_DIR/dashboard" && npm install && npm run build ) || {
+    echo "!! dashboard build failed. If it's the npm allow-scripts gate, run:"
+    echo "   cd ~/exo/dashboard && npm approve-scripts --all && npm run build"; exit 1; }
+else
+  echo "== dashboard already built =="
+fi
+
+# 2. keepalive runner (portable)
+mkdir -p "$KA_DIR"
+cat > "$KA_DIR/run-exo.sh" <<EOF
+#!/usr/bin/env bash
+set -uo pipefail
+export HOME="$USER_HOME"
+export PATH="$USER_HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
+cd "$EXO_DIR" || exit 1
+echo "[\$(date +%FT%T%z)] === exo start (pid \$\$) ===" >> "$KA_DIR/exo.log"
+exec "$UV" run exo >> "$KA_DIR/exo.log" 2>&1
+EOF
+chmod +x "$KA_DIR/run-exo.sh"
+
+# 3. launchd plist (portable paths)
+mkdir -p "$USER_HOME/Library/LaunchAgents"
+cat > "$PLIST" <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0"><dict>
+  <key>Label</key><string>com.steve.exo-keepalive</string>
+  <key>ProgramArguments</key><array>
+    <string>/bin/bash</string><string>$KA_DIR/run-exo.sh</string>
+  </array>
+  <key>EnvironmentVariables</key><dict>
+    <key>HOME</key><string>$USER_HOME</string>
+    <key>PATH</key><string>$USER_HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
+  </dict>
+  <key>RunAtLoad</key><true/>
+  <key>KeepAlive</key><true/>
+  <key>ThrottleInterval</key><integer>15</integer>
+  <key>StandardOutPath</key><string>$KA_DIR/launchd.out.log</string>
+  <key>StandardErrorPath</key><string>$KA_DIR/launchd.err.log</string>
+</dict></plist>
+EOF
+
+# 4. (re)bootstrap
+launchctl bootout "gui/$UID_N/com.steve.exo-keepalive" 2>/dev/null || true
+launchctl bootstrap "gui/$UID_N" "$PLIST" 2>&1 || launchctl load -w "$PLIST" 2>&1
+launchctl kickstart -k "gui/$UID_N/com.steve.exo-keepalive" 2>/dev/null || true
+
+# 5. verify
+echo "== waiting for :52415 =="
+for i in $(seq 1 25); do
+  code=$(curl -s -o /dev/null -w "%{http_code}" -m3 http://localhost:52415/v1/models 2>/dev/null)
+  [ "$code" = "200" ] && { echo "✅ exo UP on $(hostname) :52415 — node bound, permanent across reboot"; exit 0; }
+  sleep 6
+done
+echo "⚠️ exo not up yet — check $KA_DIR/exo.log"; exit 1
diff --git a/exo.log b/exo.log
new file mode 100644
index 0000000..0d193a4
--- /dev/null
+++ b/exo.log
@@ -0,0 +1,27444 @@
+[2026-07-06T20:09:11-0700] === exo start (pid 31582) ===
+Downloading cpython-3.13.14-macos-aarch64-none (download) (24.0MiB)
+ Downloaded cpython-3.13.14-macos-aarch64-none (download)
+[2026-07-06T20:09:26-0700] === exo start (pid 31774) ===
+Using CPython 3.13.14
+Creating virtual environment at: .venv
+   Building exo-rs @ file:///Users/macstudio3/exo/rust/exo_rs
+   Building exo @ file:///Users/macstudio3/exo
+Downloading setuptools (1.1MiB)
+Downloading pygments (1.2MiB)
+Downloading rustworkx (1.9MiB)
+Downloading ruff (11.7MiB)
+Downloading playwright (39.1MiB)
+Downloading basedpyright (11.7MiB)
+Downloading pydantic-core (1.8MiB)
+Downloading openai-harmony (2.5MiB)
+Downloading hf-xet (3.4MiB)
+Downloading numpy (5.0MiB)
+Downloading transformers (9.9MiB)
+Downloading tokenizers (2.8MiB)
+Downloading nodejs-wheel-binaries (53.5MiB)
+ Downloaded pygments
+ Downloaded setuptools
+ Downloaded pydantic-core
+ Downloaded rustworkx
+ Downloaded openai-harmony
+ Downloaded tokenizers
+      Built exo @ file:///Users/macstudio3/exo
+ Downloaded hf-xet
+ Downloaded numpy
+ Downloaded transformers
+ Downloaded ruff
+ Downloaded basedpyright
+ Downloaded playwright
+ Downloaded nodejs-wheel-binaries
+      Built exo-rs @ file:///Users/macstudio3/exo/rust/exo_rs
+Installed 82 packages in 187ms
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:11:09-0700] === exo start (pid 35053) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:11:25-0700] === exo start (pid 35499) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:11:41-0700] === exo start (pid 38176) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:11:57-0700] === exo start (pid 40783) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:12:13-0700] === exo start (pid 41014) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:12:28-0700] === exo start (pid 42929) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:12:43-0700] === exo start (pid 48795) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:12:59-0700] === exo start (pid 52766) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:13:15-0700] === exo start (pid 52837) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:13:31-0700] === exo start (pid 53021) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:13:47-0700] === exo start (pid 53162) ===
+Traceback (most recent call last):
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 4, in <module>
+    from exo.main import main
+  File "/Users/macstudio3/exo/src/exo/main.py", line 17, in <module>
+    import exo.routing.topics as topics
+  File "/Users/macstudio3/exo/src/exo/routing/topics.py", line 5, in <module>
+    from exo.shared.election import ElectionMessage
+  File "/Users/macstudio3/exo/src/exo/shared/election.py", line 12, in <module>
+    from exo.shared.types.commands import ForwarderCommand
+  File "/Users/macstudio3/exo/src/exo/shared/types/commands.py", line 3, in <module>
+    from exo.api.types import (
+    ...<2 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/api/types/__init__.py", line 1, in <module>
+    from .api import AddCustomModelParams as AddCustomModelParams
+  File "/Users/macstudio3/exo/src/exo/api/types/api.py", line 8, in <module>
+    from exo.shared.models.model_cards import ModelCard, ModelId
+  File "/Users/macstudio3/exo/src/exo/shared/models/model_cards.py", line 23, in <module>
+    from exo.shared.constants import (
+    ...<4 lines>...
+    )
+  File "/Users/macstudio3/exo/src/exo/shared/constants.py", line 65, in <module>
+    find_dashboard() if _DASHBOARD_DIR_ENV is None else Path.home() / _DASHBOARD_DIR_ENV
+    ~~~~~~~~~~~~~~^^
+  File "/Users/macstudio3/exo/src/exo/utils/dashboard_path.py", line 37, in find_dashboard
+    raise FileNotFoundError(
+        "Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`"
+    )
+FileNotFoundError: Unable to locate dashboard assets - you probably forgot to run `cd dashboard && npm install && npm run build && cd ..`
+[2026-07-06T20:14:03-0700] === exo start (pid 53291) ===
+[ 08:14:06.4376PM | INFO    ] pid = 53293
+[ 08:14:06.4379PM | INFO    ] EXO_ZENOH_NAMESPACE: None
+[ 08:14:06.4545PM | INFO    ] Using ZID: 3962a17e4e64575e61bba645dcab7303
+[ 08:14:06.4563PM | INFO    ] Starting required plugin "storage_manager"
+[ 08:14:06.9662PM | INFO    ] Starting node 3962a17e4e64575e61bba645dcab7303
+[ 08:14:07.1164PM | INFO    ] Starting Election
+
+╔═══════════════════════════════════════════════════════════════════════╗
+║                                                                       ║
+║   ███████╗██╗  ██╗ ██████╗                                            ║
+║   ██╔════╝╚██╗██╔╝██╔═══██╗                                           ║
+║   █████╗   ╚███╔╝ ██║   ██║                                           ║
+║   ██╔══╝   ██╔██╗ ██║   ██║                                           ║
+║   ███████╗██╔╝ ██╗╚██████╔╝                                           ║
+║   ╚══════╝╚═╝  ╚═╝ ╚═════╝                                            ║
+║                                                                       ║
+║   Distributed AI Inference Cluster                                    ║
+║                                                                       ║
+╚═══════════════════════════════════════════════════════════════════════╝
+
+╔═══════════════════════════════════════════════════════════════════════╗
+║                                                                       ║
+║  Dashboard & API Ready                                                ║
+║                                                                       ║
+║  http://localhost:52415                                               ║
+║                                                                       ║
+║  Click the URL above to open the dashboard in your browser            ║
+║                                                                       ║
+╚═══════════════════════════════════════════════════════════════════════╝
+
+
+[ 08:14:07.1166PM | INFO    ] Starting DownloadCoordinator
+[ 08:14:07.1167PM | INFO    ] Starting Worker
+[ 08:14:07.1168PM | INFO    ] Starting Master
+[ 08:14:07.1169PM | INFO    ] Starting API
+[ 08:14:07.2280PM | INFO    ] First run detected — opening dashboard in browser
+[ 08:14:07.2302PM | INFO    ] discovered: Some("3962a17e4e64575e61bba645dcab7303")
+[ 08:14:07.2486PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319960>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319960>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319960>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319960>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:07.2556PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a9b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a9b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a9b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a9b0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10c01e200>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10c01c5e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10912ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:07.2681PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a1a0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a1a0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a1a0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a1a0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10c01da80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10c01d9e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:07.2738PM | WARNING ] Error gathering misc data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a500>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a500>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a500>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a500>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 480, in _monitor_misc
+    await self.info_sender.send(await MiscData.gather())
+          │    │           │          │        └ <classmethod(<function MiscData.gather at 0x10c01e5c0>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10913cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 320, in gather
+    return cls(friendly_name=await get_friendly_name())
+           │                       └ <function get_friendly_name at 0x10c01d940>
+           └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 52, in get_friendly_name
+    process = await run_process(["scutil", "--get", "ComputerName"])
+                    └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('scutil', '--get', 'ComputerName')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('scutil', '--get', 'ComputerName')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('scutil', '--get', 'ComputerName')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('scutil', '--get', 'ComputerName')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'scutil'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'scutil'
+[ 08:14:07.2788PM | WARNING ] Error gathering static node info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a5f0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a5f0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a5f0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a5f0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 471, in _monitor_static_info
+    await self.info_sender.send(await StaticNodeInformation.gather())
+          │    │           │          │                     └ <classmethod(<function StaticNodeInformation.gather at 0x10c01dda0>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.StaticNodeInformation'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10913cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 192, in gather
+    model, chip = await get_model_and_chip()
+                        └ <function get_model_and_chip at 0x10c01db20>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 130, in get_model_and_chip
+    process = await run_process(
+                    └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('system_profiler', 'SPHardwareDataType')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('system_profiler', 'SPHardwareDataType')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'system_profiler'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'system_profiler'
+[ 08:14:07.2825PM | INFO    ] Node elected Master - maintaining self
+[ 08:14:07.2827PM | INFO    ] Unpausing API
+[ 08:14:07.2830PM | INFO    ] Running on http://0.0.0.0:52415 (CTRL + C to quit)
+[ 08:14:07.2830PM | INFO    ] Running on http://0.0.0.0:52415 (CTRL + C to quit)
+[ 08:14:07.2835PM | INFO    ] Subscribed to global_events
+[ 08:14:07.2836PM | INFO    ] Subscribed to local_events
+[ 08:14:07.2844PM | INFO    ] Subscribed to commands
+[ 08:14:07.2845PM | INFO    ] Subscribed to election_messages
+[ 08:14:07.2847PM | INFO    ] Subscribed to connection_messages
+[ 08:14:07.2851PM | INFO    ] Subscribed to download_commands
+[ 08:14:07.4796PM | WARNING ] macmon preflight failed with return code 1: Error: Os { code: 2, kind: NotFound, message: "No such file or directory" }
+[ 08:14:07.4798PM | WARNING ] macmon at /opt/homebrew/bin/macmon is unusable, falling back to psutil memory monitoring
+[ 08:14:07.4823PM | INFO    ] Waiting for other campaign to finish
+[ 08:14:10.4831PM | INFO    ] Node elected Master - maintaining self
+[ 08:14:10.4832PM | INFO    ] Unpausing API
+[ 08:14:12.2642PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319960>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319960>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319960>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319960>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:17.2708PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d632da0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d632da0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d632da0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d632da0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10c01e200>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10c01c5e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10912ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:17.3057PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319bd0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319bd0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319bd0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d319bd0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10c01da80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10c01d9e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:17.3264PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d69b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d69b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d69b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d69b0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:22.3474PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69f8b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69f8b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69f8b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69f8b0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:27.3113PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d7c10>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d7c10>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d7c10>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d7c10>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10c01e200>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10c01c5e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10912ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:27.3472PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a500>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a500>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a500>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d31a500>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10c01da80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10c01d9e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:27.3799PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d633b50>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d633b50>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d633b50>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d633b50>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:32.4032PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d741330>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d741330>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d741330>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d741330>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:37.3518PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d633b50>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d633b50>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d633b50>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d633b50>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10c01e200>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10c01c5e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10912ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:37.3871PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6339d0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6339d0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6339d0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6339d0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10c01da80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10c01d9e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:37.4353PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d631de0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d631de0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d631de0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d631de0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:42.4605PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d219390>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d219390>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d219390>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d219390>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:47.3880PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d743970>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d743970>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d743970>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d743970>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10c01e200>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10c01c5e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10912ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:47.4084PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6330a0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6330a0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6330a0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6330a0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10c01da80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10c01d9e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:47.4937PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69c2b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69c2b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69c2b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69c2b0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:52.5180PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69c970>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69c970>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69c970>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69c970>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:57.4191PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d3dbaf0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d3dbaf0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d3dbaf0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d3dbaf0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10c01e200>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10c01c5e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10912ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:57.4548PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d6bf0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d6bf0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d6bf0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d6bf0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10c01da80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10c01d9e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:14:57.5410PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d632c50>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d632c50>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d632c50>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d632c50>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:02.5691PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d7d90>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d7d90>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d7d90>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d7d90>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:07.2862PM | WARNING ] Error gathering misc data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d4fa0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d4fa0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d4fa0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d4fa0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 480, in _monitor_misc
+    await self.info_sender.send(await MiscData.gather())
+          │    │           │          │        └ <classmethod(<function MiscData.gather at 0x10c01e5c0>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10913cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 320, in gather
+    return cls(friendly_name=await get_friendly_name())
+           │                       └ <function get_friendly_name at 0x10c01d940>
+           └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 52, in get_friendly_name
+    process = await run_process(["scutil", "--get", "ComputerName"])
+                    └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('scutil', '--get', 'ComputerName')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('scutil', '--get', 'ComputerName')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('scutil', '--get', 'ComputerName')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('scutil', '--get', 'ComputerName')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'scutil'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'scutil'
+[ 08:15:07.3142PM | WARNING ] Error gathering static node info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69fa90>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69fa90>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69fa90>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d69fa90>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 471, in _monitor_static_info
+    await self.info_sender.send(await StaticNodeInformation.gather())
+          │    │           │          │                     └ <classmethod(<function StaticNodeInformation.gather at 0x10c01dda0>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.StaticNodeInformation'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10913cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 192, in gather
+    model, chip = await get_model_and_chip()
+                        └ <function get_model_and_chip at 0x10c01db20>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 130, in get_model_and_chip
+    process = await run_process(
+                    └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('system_profiler', 'SPHardwareDataType')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('system_profiler', 'SPHardwareDataType')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'system_profiler'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'system_profiler'
+[ 08:15:07.4608PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d431840>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d431840>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d431840>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d431840>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10c01e200>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10c01c5e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10912ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:07.4966PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d75e0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d75e0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d75e0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d75e0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10c01da80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10c01d9e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10912ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:07.6061PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x108af40e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10d189b20>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10d091580>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x108f94220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10d1fdd30>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10d25b420>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10d1c6a20>
+           │      └ <function Runner.run at 0x1092349a0>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10922e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10d43a0d0>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10922e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x109234040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1091c8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d4c40>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d4c40>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d4c40>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10d6d4c40>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10c01dd00>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10912ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10913d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x108f94ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x109237ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10922fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x109297380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x109298e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x109170b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:12.4060PM | INFO    ] Rotated event log: /Users/macstudio3/.exo/event_log/master/events.bin -> /Users/macstudio3/.exo/event_log/master/events.2026-07-07_03-15-12_402640.bin.zst
+[ 08:15:12.4083PM | INFO    ] Stopping Worker
+[ 08:15:12.4139PM | INFO    ] Rotated event log: /Users/macstudio3/.exo/event_log/api/events.bin -> /Users/macstudio3/.exo/event_log/api/events.2026-07-07_03-15-12_411809.bin.zst
+[ 08:15:13.4068PM | INFO    ] EXO Shutdown complete
+[2026-07-06T20:15:13-0700] === exo start (pid 53967) ===
+[ 08:15:14.7405PM | INFO    ] pid = 53977
+[ 08:15:14.7407PM | INFO    ] EXO_ZENOH_NAMESPACE: None
+[ 08:15:14.7441PM | INFO    ] Using ZID: 5ebce362f8fe0ce4723a977e3b597712
+[ 08:15:14.7447PM | INFO    ] Starting required plugin "storage_manager"
+[ 08:15:15.2539PM | INFO    ] Starting node 5ebce362f8fe0ce4723a977e3b597712
+[ 08:15:15.3144PM | INFO    ] Starting Election
+
+╔═══════════════════════════════════════════════════════════════════════╗
+║                                                                       ║
+║   ███████╗██╗  ██╗ ██████╗                                            ║
+║   ██╔════╝╚██╗██╔╝██╔═══██╗                                           ║
+║   █████╗   ╚███╔╝ ██║   ██║                                           ║
+║   ██╔══╝   ██╔██╗ ██║   ██║                                           ║
+║   ███████╗██╔╝ ██╗╚██████╔╝                                           ║
+║   ╚══════╝╚═╝  ╚═╝ ╚═════╝                                            ║
+║                                                                       ║
+║   Distributed AI Inference Cluster                                    ║
+║                                                                       ║
+╚═══════════════════════════════════════════════════════════════════════╝
+
+╔═══════════════════════════════════════════════════════════════════════╗
+║                                                                       ║
+║  Dashboard & API Ready                                                ║
+║                                                                       ║
+║  http://localhost:52415                                               ║
+║                                                                       ║
+║  Click the URL above to open the dashboard in your browser            ║
+║                                                                       ║
+╚═══════════════════════════════════════════════════════════════════════╝
+
+
+[ 08:15:15.3146PM | INFO    ] Starting DownloadCoordinator
+[ 08:15:15.3147PM | INFO    ] Starting Worker
+[ 08:15:15.3149PM | INFO    ] Starting Master
+[ 08:15:15.3151PM | INFO    ] Starting API
+[ 08:15:15.3164PM | INFO    ] discovered: Some("5ebce362f8fe0ce4723a977e3b597712")
+[ 08:15:15.3261PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e10>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e10>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e10>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e10>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:15.3332PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5d20>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5d20>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5d20>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5d20>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:15.3402PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5c00>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5c00>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5c00>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5c00>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:15.3445PM | WARNING ] Error gathering misc data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5ba0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5ba0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5ba0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5ba0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 480, in _monitor_misc
+    await self.info_sender.send(await MiscData.gather())
+          │    │           │          │        └ <classmethod(<function MiscData.gather at 0x10b821120>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 320, in gather
+    return cls(friendly_name=await get_friendly_name())
+           │                       └ <function get_friendly_name at 0x10b8204a0>
+           └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 52, in get_friendly_name
+    process = await run_process(["scutil", "--get", "ComputerName"])
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('scutil', '--get', 'ComputerName')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('scutil', '--get', 'ComputerName')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('scutil', '--get', 'ComputerName')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('scutil', '--get', 'ComputerName')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'scutil'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'scutil'
+[ 08:15:15.3491PM | WARNING ] Error gathering static node info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf54b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf54b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf54b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf54b0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 471, in _monitor_static_info
+    await self.info_sender.send(await StaticNodeInformation.gather())
+          │    │           │          │                     └ <classmethod(<function StaticNodeInformation.gather at 0x10b820900>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.StaticNodeInformation'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 192, in gather
+    model, chip = await get_model_and_chip()
+                        └ <function get_model_and_chip at 0x10b820680>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 130, in get_model_and_chip
+    process = await run_process(
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('system_profiler', 'SPHardwareDataType')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('system_profiler', 'SPHardwareDataType')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'system_profiler'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'system_profiler'
+[ 08:15:15.3527PM | INFO    ] Node elected Master - maintaining self
+[ 08:15:15.3528PM | INFO    ] Unpausing API
+[ 08:15:15.3532PM | INFO    ] Running on http://0.0.0.0:52415 (CTRL + C to quit)
+[ 08:15:15.3532PM | INFO    ] Running on http://0.0.0.0:52415 (CTRL + C to quit)
+[ 08:15:15.3537PM | INFO    ] Subscribed to global_events
+[ 08:15:15.3545PM | INFO    ] Subscribed to local_events
+[ 08:15:15.3546PM | INFO    ] Subscribed to commands
+[ 08:15:15.3548PM | INFO    ] Subscribed to election_messages
+[ 08:15:15.3549PM | INFO    ] Subscribed to connection_messages
+[ 08:15:15.3550PM | INFO    ] Subscribed to download_commands
+[ 08:15:15.3574PM | WARNING ] macmon preflight failed with return code 1: Error: Os { code: 2, kind: NotFound, message: "No such file or directory" }
+[ 08:15:15.3574PM | WARNING ] macmon at /opt/homebrew/bin/macmon is unusable, falling back to psutil memory monitoring
+[ 08:15:15.5525PM | INFO    ] Waiting for other campaign to finish
+[ 08:15:18.5538PM | INFO    ] Node elected Master - maintaining self
+[ 08:15:18.5543PM | INFO    ] Unpausing API
+[ 08:15:20.3399PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc510c0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc510c0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc510c0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc510c0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:25.3492PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29630>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29630>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29630>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29630>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:25.3871PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51780>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51780>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51780>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51780>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:25.4065PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc510c0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc510c0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc510c0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc510c0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:30.4289PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf6980>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf6980>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf6980>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf6980>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:35.3905PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5510>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5510>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5510>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5510>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:35.4260PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce82b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce82b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce82b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce82b0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:35.4607PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf6170>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf6170>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf6170>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf6170>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:40.4837PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9f30>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9f30>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9f30>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9f30>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:45.4323PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d50>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d50>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d50>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d50>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:45.4676PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d20>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d20>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d20>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d20>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:45.5167PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc516f0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc516f0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc516f0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc516f0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:50.5422PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea980>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea980>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea980>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea980>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:55.4736PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a530>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a530>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a530>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a530>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:55.5110PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28820>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28820>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28820>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28820>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:15:55.5787PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b640>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b640>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b640>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b640>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:00.6024PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51510>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51510>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51510>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51510>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:05.5162PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9330>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9330>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9330>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9330>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:05.5531PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28820>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28820>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28820>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28820>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:05.6367PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2acb0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2acb0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2acb0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2acb0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:10.6602PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5750>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5750>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5750>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5750>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:15.3541PM | WARNING ] Error gathering misc data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b610>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b610>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b610>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b610>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 480, in _monitor_misc
+    await self.info_sender.send(await MiscData.gather())
+          │    │           │          │        └ <classmethod(<function MiscData.gather at 0x10b821120>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 320, in gather
+    return cls(friendly_name=await get_friendly_name())
+           │                       └ <function get_friendly_name at 0x10b8204a0>
+           └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 52, in get_friendly_name
+    process = await run_process(["scutil", "--get", "ComputerName"])
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('scutil', '--get', 'ComputerName')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('scutil', '--get', 'ComputerName')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('scutil', '--get', 'ComputerName')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('scutil', '--get', 'ComputerName')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'scutil'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'scutil'
+[ 08:16:15.3810PM | WARNING ] Error gathering static node info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf58d0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf58d0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf58d0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf58d0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 471, in _monitor_static_info
+    await self.info_sender.send(await StaticNodeInformation.gather())
+          │    │           │          │                     └ <classmethod(<function StaticNodeInformation.gather at 0x10b820900>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.StaticNodeInformation'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 192, in gather
+    model, chip = await get_model_and_chip()
+                        └ <function get_model_and_chip at 0x10b820680>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 130, in get_model_and_chip
+    process = await run_process(
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('system_profiler', 'SPHardwareDataType')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('system_profiler', 'SPHardwareDataType')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'system_profiler'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'system_profiler'
+[ 08:16:15.5577PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8e80>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8e80>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8e80>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8e80>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:15.5942PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9c90>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9c90>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9c90>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9c90>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:15.6958PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce91b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce91b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce91b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce91b0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:20.7228PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10b409ed0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10b409ed0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10b409ed0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10b409ed0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:25.6005PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28850>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28850>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28850>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28850>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:25.6383PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e87f0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e87f0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e87f0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e87f0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:25.7625PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7cd0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7cd0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7cd0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7cd0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:30.7924PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb287c0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb287c0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb287c0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb287c0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:35.6420PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5900>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5900>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5900>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5900>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:35.6796PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e40>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e40>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e40>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e40>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:35.8317PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e40>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e40>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e40>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5e40>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:40.8663PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29300>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29300>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29300>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29300>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:45.6808PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf67d0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf67d0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf67d0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf67d0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:45.7151PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39600>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39600>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39600>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39600>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:45.9084PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5b10>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5b10>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5b10>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5b10>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:50.9514PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39ba0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39ba0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39ba0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39ba0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:55.7224PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e8550>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e8550>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e8550>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e8550>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:55.7566PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a410>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a410>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a410>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a410>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:16:55.9932PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b610>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b610>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b610>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b610>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:01.0309PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b670>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b670>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b670>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b670>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:05.7593PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9360>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9360>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9360>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9360>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:05.7884PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8940>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8940>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8940>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8940>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:06.0642PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38970>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38970>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38970>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38970>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:11.1016PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7700>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7700>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7700>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7700>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:15.3827PM | WARNING ] Error gathering misc data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9480>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9480>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9480>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9480>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 480, in _monitor_misc
+    await self.info_sender.send(await MiscData.gather())
+          │    │           │          │        └ <classmethod(<function MiscData.gather at 0x10b821120>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 320, in gather
+    return cls(friendly_name=await get_friendly_name())
+           │                       └ <function get_friendly_name at 0x10b8204a0>
+           └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 52, in get_friendly_name
+    process = await run_process(["scutil", "--get", "ComputerName"])
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('scutil', '--get', 'ComputerName')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('scutil', '--get', 'ComputerName')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('scutil', '--get', 'ComputerName')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('scutil', '--get', 'ComputerName')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'scutil'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'scutil'
+[ 08:17:15.4127PM | WARNING ] Error gathering static node info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b490>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b490>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b490>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b490>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 471, in _monitor_static_info
+    await self.info_sender.send(await StaticNodeInformation.gather())
+          │    │           │          │                     └ <classmethod(<function StaticNodeInformation.gather at 0x10b820900>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.StaticNodeInformation'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 192, in gather
+    model, chip = await get_model_and_chip()
+                        └ <function get_model_and_chip at 0x10b820680>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 130, in get_model_and_chip
+    process = await run_process(
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('system_profiler', 'SPHardwareDataType')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('system_profiler', 'SPHardwareDataType')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'system_profiler'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'system_profiler'
+[ 08:17:15.7956PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8790>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8790>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8790>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8790>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:15.8242PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9570>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9570>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9570>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9570>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:16.1378PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb760>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb760>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb760>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb760>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:21.1745PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29ff0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29ff0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29ff0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29ff0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:25.8300PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce87f0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce87f0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce87f0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce87f0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:25.8618PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b610>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b610>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b610>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b610>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:26.2053PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cac52a0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cac52a0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cac52a0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cac52a0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:31.2347PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc537f0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc537f0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc537f0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc537f0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:35.8680PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb2b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb2b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb2b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb2b0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:35.8983PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8340>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8340>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8340>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8340>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:36.2697PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a9b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a9b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a9b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a9b0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:41.3041PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52d70>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52d70>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52d70>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52d70>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:45.9039PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a950>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a950>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a950>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a950>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:45.9329PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba00>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba00>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba00>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba00>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:46.3271PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ab90>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ab90>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ab90>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ab90>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:51.3656PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39ff0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39ff0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39ff0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39ff0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:55.9400PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8700>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8700>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8700>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8700>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:55.9692PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce93c0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce93c0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce93c0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce93c0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:17:56.4014PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8580>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8580>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8580>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8580>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:01.4430PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39390>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39390>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39390>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd39390>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:05.9777PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b370>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b370>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b370>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b370>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:06.0138PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a9e0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a9e0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a9e0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a9e0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:06.4865PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b100>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b100>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b100>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b100>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:11.5285PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8cd0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8cd0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8cd0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8cd0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:15.4226PM | WARNING ] Error gathering misc data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10b409ed0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10b409ed0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10b409ed0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10b409ed0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 480, in _monitor_misc
+    await self.info_sender.send(await MiscData.gather())
+          │    │           │          │        └ <classmethod(<function MiscData.gather at 0x10b821120>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 320, in gather
+    return cls(friendly_name=await get_friendly_name())
+           │                       └ <function get_friendly_name at 0x10b8204a0>
+           └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 52, in get_friendly_name
+    process = await run_process(["scutil", "--get", "ComputerName"])
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('scutil', '--get', 'ComputerName')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('scutil', '--get', 'ComputerName')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('scutil', '--get', 'ComputerName')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('scutil', '--get', 'ComputerName')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'scutil'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'scutil'
+[ 08:18:15.4605PM | WARNING ] Error gathering static node info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf4130>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf4130>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf4130>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf4130>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 471, in _monitor_static_info
+    await self.info_sender.send(await StaticNodeInformation.gather())
+          │    │           │          │                     └ <classmethod(<function StaticNodeInformation.gather at 0x10b820900>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.StaticNodeInformation'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 192, in gather
+    model, chip = await get_model_and_chip()
+                        └ <function get_model_and_chip at 0x10b820680>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 130, in get_model_and_chip
+    process = await run_process(
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('system_profiler', 'SPHardwareDataType')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('system_profiler', 'SPHardwareDataType')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'system_profiler'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'system_profiler'
+[ 08:18:16.0189PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5f00>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5f00>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5f00>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5f00>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:16.0574PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8250>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8250>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8250>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8250>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:16.5694PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf4490>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf4490>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf4490>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf4490>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:21.6110PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd395d0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd395d0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd395d0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd395d0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:26.0603PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50ca0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50ca0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50ca0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50ca0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:26.0916PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd397e0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd397e0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd397e0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd397e0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:26.6511PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51ae0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51ae0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51ae0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51ae0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:31.6880PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a410>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a410>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a410>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a410>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:36.1023PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3ab30>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3ab30>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3ab30>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3ab30>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:36.1377PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea9e0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea9e0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea9e0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea9e0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:36.7305PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea1d0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea1d0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea1d0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea1d0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:41.7745PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc53a30>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc53a30>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc53a30>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc53a30>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:46.1453PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51390>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51390>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51390>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51390>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:46.1825PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc53df0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc53df0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc53df0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc53df0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:46.8191PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38130>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38130>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38130>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38130>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:51.8625PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccb2590>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccb2590>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccb2590>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccb2590>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:56.1873PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5de0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5de0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5de0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5de0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:56.2241PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea680>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea680>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea680>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea680>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:18:56.9049PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea080>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea080>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea080>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea080>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:01.9462PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc524a0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc524a0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc524a0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc524a0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:06.2320PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29270>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29270>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29270>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29270>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:06.2675PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9870>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9870>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9870>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9870>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:06.9856PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29d80>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29d80>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29d80>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29d80>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:12.0314PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28850>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28850>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28850>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28850>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:15.4630PM | WARNING ] Error gathering misc data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c390af0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c390af0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c390af0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c390af0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 480, in _monitor_misc
+    await self.info_sender.send(await MiscData.gather())
+          │    │           │          │        └ <classmethod(<function MiscData.gather at 0x10b821120>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 320, in gather
+    return cls(friendly_name=await get_friendly_name())
+           │                       └ <function get_friendly_name at 0x10b8204a0>
+           └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 52, in get_friendly_name
+    process = await run_process(["scutil", "--get", "ComputerName"])
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('scutil', '--get', 'ComputerName')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('scutil', '--get', 'ComputerName')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('scutil', '--get', 'ComputerName')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('scutil', '--get', 'ComputerName')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'scutil'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'scutil'
+[ 08:19:15.4981PM | WARNING ] Error gathering static node info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29c60>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29c60>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29c60>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29c60>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 471, in _monitor_static_info
+    await self.info_sender.send(await StaticNodeInformation.gather())
+          │    │           │          │                     └ <classmethod(<function StaticNodeInformation.gather at 0x10b820900>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.StaticNodeInformation'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 192, in gather
+    model, chip = await get_model_and_chip()
+                        └ <function get_model_and_chip at 0x10b820680>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 130, in get_model_and_chip
+    process = await run_process(
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('system_profiler', 'SPHardwareDataType')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('system_profiler', 'SPHardwareDataType')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'system_profiler'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'system_profiler'
+[ 08:19:16.2711PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc511b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc511b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc511b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc511b0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:16.3047PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50bb0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50bb0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50bb0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50bb0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:17.0560PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10dc7a4a0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10dc7a4a0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10dc7a4a0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10dc7a4a0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:22.0799PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7b20>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7b20>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7b20>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7b20>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:26.3045PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc524d0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc524d0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc524d0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc524d0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:26.3338PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5fc0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5fc0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5fc0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5fc0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:27.0972PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc525c0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc525c0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc525c0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc525c0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:32.1202PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf55d0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf55d0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf55d0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf55d0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:36.3437PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52ce0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52ce0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52ce0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52ce0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:36.3807PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc525c0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc525c0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc525c0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc525c0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:37.1463PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc520b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc520b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc520b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc520b0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:42.1706PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29510>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29510>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29510>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29510>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:46.3849PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba90>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba90>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba90>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba90>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:46.4220PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2afb0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2afb0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2afb0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2afb0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:47.2005PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8ebc10>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8ebc10>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8ebc10>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8ebc10>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:52.2357PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51a50>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51a50>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51a50>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51a50>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:56.4260PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a290>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a290>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a290>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2a290>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:56.4626PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7e80>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7e80>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7e80>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf7e80>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:19:57.2720PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc534f0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc534f0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc534f0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc534f0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:02.3007PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba90>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba90>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba90>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ba90>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:06.4628PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38b50>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38b50>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38b50>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38b50>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:06.4949PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a980>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a980>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a980>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a980>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:07.3405PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29330>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29330>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29330>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29330>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:12.3842PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb370>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb370>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb370>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb370>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:15.5035PM | WARNING ] Error gathering misc data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8700>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8700>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8700>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8700>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 480, in _monitor_misc
+    await self.info_sender.send(await MiscData.gather())
+          │    │           │          │        └ <classmethod(<function MiscData.gather at 0x10b821120>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 320, in gather
+    return cls(friendly_name=await get_friendly_name())
+           │                       └ <function get_friendly_name at 0x10b8204a0>
+           └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 52, in get_friendly_name
+    process = await run_process(["scutil", "--get", "ComputerName"])
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('scutil', '--get', 'ComputerName')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('scutil', '--get', 'ComputerName')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('scutil', '--get', 'ComputerName')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('scutil', '--get', 'ComputerName')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'scutil'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'scutil'
+[ 08:20:15.5394PM | WARNING ] Error gathering static node info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8e80>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8e80>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8e80>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8e80>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 471, in _monitor_static_info
+    await self.info_sender.send(await StaticNodeInformation.gather())
+          │    │           │          │                     └ <classmethod(<function StaticNodeInformation.gather at 0x10b820900>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.StaticNodeInformation'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 192, in gather
+    model, chip = await get_model_and_chip()
+                        └ <function get_model_and_chip at 0x10b820680>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 130, in get_model_and_chip
+    process = await run_process(
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('system_profiler', 'SPHardwareDataType')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('system_profiler', 'SPHardwareDataType')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'system_profiler'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'system_profiler'
+[ 08:20:16.5007PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38b80>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38b80>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38b80>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38b80>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:16.5370PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb700>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb700>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb700>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb700>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:17.4254PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea200>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea200>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea200>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccea200>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:22.4653PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb760>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb760>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb760>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb760>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:26.5383PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b190>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b190>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b190>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b190>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:26.5688PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceaa70>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceaa70>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceaa70>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceaa70>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:27.5049PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50640>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50640>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50640>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc50640>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:32.5455PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29330>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29330>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29330>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29330>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:36.5719PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e8700>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e8700>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e8700>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8e8700>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:36.6078PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5c00>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5c00>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5c00>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5c00>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:37.5874PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf51e0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf51e0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf51e0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf51e0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:42.6231PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28550>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28550>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28550>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28550>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:46.6100PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38fa0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38fa0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38fa0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38fa0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:46.6440PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ae60>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ae60>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ae60>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2ae60>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:47.6544PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28b50>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28b50>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28b50>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28b50>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:52.6974PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28dc0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28dc0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28dc0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28dc0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:56.6523PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b6d0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b6d0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b6d0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b6d0>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:56.6876PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29a80>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29a80>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29a80>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29a80>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:20:57.7372PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b7f0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b7f0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b7f0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b7f0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:02.7785PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bd00>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bd00>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bd00>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bd00>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:06.6925PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b910>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b910>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b910>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2b910>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:06.7318PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38220>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38220>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38220>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38220>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:07.8183PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bee0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bee0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bee0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bee0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:12.8576PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86e2f0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86e2f0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86e2f0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86e2f0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:15.5363PM | WARNING ] Error gathering misc data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38400>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38400>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38400>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38400>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 480, in _monitor_misc
+    await self.info_sender.send(await MiscData.gather())
+          │    │           │          │        └ <classmethod(<function MiscData.gather at 0x10b821120>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 320, in gather
+    return cls(friendly_name=await get_friendly_name())
+           │                       └ <function get_friendly_name at 0x10b8204a0>
+           └ <class 'exo.utils.info_gatherer.info_gatherer.MiscData'>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 52, in get_friendly_name
+    process = await run_process(["scutil", "--get", "ComputerName"])
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('scutil', '--get', 'ComputerName')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('scutil', '--get', 'ComputerName')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('scutil', '--get', 'ComputerName')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('scutil', '--get', 'ComputerName')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'scutil'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'scutil'
+[ 08:21:15.5576PM | WARNING ] Error gathering static node info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86db10>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86db10>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86db10>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86db10>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 471, in _monitor_static_info
+    await self.info_sender.send(await StaticNodeInformation.gather())
+          │    │           │          │                     └ <classmethod(<function StaticNodeInformation.gather at 0x10b820900>)>
+          │    │           │          └ <class 'exo.utils.info_gatherer.info_gatherer.StaticNodeInformation'>
+          │    │           └ <function MemoryObjectSendStream.send at 0x10886cd60>
+          │    └ Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, open_receive_channels=1, w...
+          └ InfoGatherer(info_sender=Sender(_state=MemoryObjectStreamState(max_buffer_size=inf, buffer=deque([]), open_send_channels=1, o...
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 192, in gather
+    model, chip = await get_model_and_chip()
+                        └ <function get_model_and_chip at 0x10b820680>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 130, in get_model_and_chip
+    process = await run_process(
+                    └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('system_profiler', 'SPHardwareDataType')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('system_profiler', 'SPHardwareDataType')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('system_profiler', 'SPHardwareDataType')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'system_profiler'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'system_profiler'
+[ 08:21:16.7371PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3aa40>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3aa40>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3aa40>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3aa40>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:16.7766PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd387c0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd387c0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd387c0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd387c0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:17.8973PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5ae0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5ae0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5ae0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10caf5ae0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:22.9398PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bfa0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bfa0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bfa0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3bfa0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:26.7789PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x109bd8e50>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x109bd8e50>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x109bd8e50>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x109bd8e50>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:26.8109PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2add0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2add0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2add0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb2add0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:27.9783PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8ea2c0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8ea2c0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8ea2c0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c8ea2c0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:33.0172PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc508b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc508b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc508b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc508b0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:36.8202PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb250>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb250>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb250>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cceb250>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:36.8588PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8b80>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8b80>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8b80>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce8b80>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:38.0502PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38880>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38880>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38880>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd38880>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:43.0909PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51810>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51810>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51810>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51810>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:46.8660PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10dc79960>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10dc79960>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10dc79960>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10dc79960>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:46.9025PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d50>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d50>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d50>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc51d50>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:48.1326PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28df0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28df0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28df0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28df0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:53.1715PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc523b0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc523b0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc523b0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc523b0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:56.9069PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccb0d00>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccb0d00>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccb0d00>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10ccb0d00>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:56.9422PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29e40>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29e40>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29e40>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb29e40>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:21:58.2141PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28df0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28df0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28df0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cb28df0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:22:03.2587PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9570>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9570>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9570>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cce9570>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:22:06.9489PM | WARNING ] Failed to gather Thunderbolt Bridge info
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52080>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52080>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52080>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cc52080>()>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 546, in _monitor_thunderbolt_bridge_status
+    curr = await ThunderboltBridgeInfo.gather()
+                 │                     └ <classmethod(<function ThunderboltBridgeInfo.gather at 0x10b820d60>)>
+                 └ <class 'exo.utils.info_gatherer.info_gatherer.ThunderboltBridgeInfo'>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 261, in gather
+    tb_devices = await _get_thunderbolt_devices()
+                       └ <function _get_thunderbolt_devices at 0x10b776e80>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 51, in _get_thunderbolt_devices
+    result = await anyio.run_process(
+                   │     └ <function run_process at 0x10885ba60>
+                   └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:22:06.9831PM | WARNING ] Error gathering network interfaces
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b7c0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b7c0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b7c0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3b7c0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 534, in _watch_system_info
+    nics = await get_network_interfaces()
+                 └ <function get_network_interfaces at 0x10b8205e0>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 101, in get_network_interfaces
+    interface_types = await _get_interface_types_from_networksetup()
+                            └ <function _get_interface_types_from_networksetup at 0x10b820540>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/system_info.py", line 65, in _get_interface_types_from_networksetup
+    result = await run_process(["networksetup", "-listallhardwareports"])
+                   └ <function run_process at 0x10885ba60>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:22:08.3032PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a5c0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a5c0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a5c0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10cd3a5c0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
+[ 08:22:13.3437PM | WARNING ] Error gathering Thunderbolt data
+Traceback (most recent call last):
+
+  File "/Users/macstudio3/exo/.venv/bin/exo", line 10, in <module>
+    sys.exit(main())
+    │   │    └ <function main at 0x1082240e0>
+    │   └ <built-in function exit>
+    └ <module 'sys' (built-in)>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 327, in main
+    main_inner(args)
+    │          └ Args(verbosity=0, force_master=False, spawn_api=True, api_port=52415, tb_only=False, no_worker=False, no_downloads=False, off...
+    └ <function main_inner at 0x10c858400>
+
+  File "/Users/macstudio3/exo/src/exo/main.py", line 369, in main_inner
+    anyio.run(node.run)
+    │     │   │    └ <function Node.run at 0x10c830180>
+    │     │   └ Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=SessionId(master_node_id='...
+    │     └ <function run at 0x1086c4220>
+    └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 74, in run
+    return async_backend.run(func, args, {}, backend_options)
+           │             │   │     │         └ {}
+           │             │   │     └ ()
+           │             │   └ <bound method Node.run of Node(router=<exo.routing.router.Router object at 0x10c769fd0>, event_router=EventRouter(session_id=...
+           │             └ <classmethod(<function AsyncIOBackend.run at 0x10c8e07c0>)>
+           └ <class 'anyio._backends._asyncio.AsyncIOBackend'>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2325, in run
+    return runner.run(wrapper())
+           │      │   └ <function Node.run at 0x10c873f60>
+           │      └ <function Runner.run at 0x1089649a0>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/runners.py", line 119, in run
+    return self._loop.run_until_complete(task)
+           │    │     │                  └ <Task pending name='exo.main.Node.run' coro=<Node.run() running at /Users/macstudio3/exo/.venv/lib/python3.13/site-packages/a...
+           │    │     └ <function BaseEventLoop.run_until_complete at 0x10895e2a0>
+           │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+           └ <asyncio.runners.Runner object at 0x10cad8410>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete
+    self.run_forever()
+    │    └ <function BaseEventLoop.run_forever at 0x10895e200>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 683, in run_forever
+    self._run_once()
+    │    └ <function BaseEventLoop._run_once at 0x108964040>
+    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 2060, in _run_once
+    handle._run()
+    │      └ <function Handle._run at 0x1088f8860>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86e2f0>()>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/events.py", line 89, in _run
+    self._context.run(self._callback, *self._args)
+    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
+    │    │            │    │           └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86e2f0>()>
+    │    │            │    └ <member '_callback' of 'Handle' objects>
+    │    │            └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86e2f0>()>
+    │    └ <member '_context' of 'Handle' objects>
+    └ <Handle <_asyncio.TaskStepMethWrapper object at 0x10c86e2f0>()>
+
+> File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 491, in _monitor_system_profiler_thunderbolt_data
+    iface_map = await _gather_iface_map()
+                      └ <function _gather_iface_map at 0x10b820860>
+
+  File "/Users/macstudio3/exo/src/exo/utils/info_gatherer/info_gatherer.py", line 338, in _gather_iface_map
+    proc = await anyio.run_process(
+                 │     └ <function run_process at 0x10885ba60>
+                 └ <module 'anyio' from '/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/__init__.py'>
+
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 91, in run_process
+    async with await open_process(
+                     └ <function open_process at 0x10886d260>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 190, in open_process
+    return await get_async_backend().open_process(
+                 └ <function get_async_backend at 0x1086c4ea0>
+  File "/Users/macstudio3/exo/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2588, in open_process
+    process = await asyncio.create_subprocess_exec(
+                    │       └ <function create_subprocess_exec at 0x108967ec0>
+                    └ <module 'asyncio' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/__...
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
+    transport, protocol = await loop.subprocess_exec(
+                                │    └ <function BaseEventLoop.subprocess_exec at 0x10895fb00>
+                                └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_events.py", line 1812, in subprocess_exec
+    transport = await self._make_subprocess_transport(
+                      │    └ <function _UnixSelectorEventLoop._make_subprocess_transport at 0x1089c7380>
+                      └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 214, in _make_subprocess_transport
+    transp = _UnixSubprocessTransport(self, protocol, args, shell,
+             │                        │     │         │     └ False
+             │                        │     │         └ ('networksetup', '-listallhardwareports')
+             │                        │     └ <SubprocessStreamProtocol>
+             │                        └ <_UnixSelectorEventLoop running=True closed=False debug=False>
+             └ <class 'asyncio.unix_events._UnixSubprocessTransport'>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/base_subprocess.py", line 40, in __init__
+    self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
+    │    │           │           │            │             └ -1
+    │    │           │           │            └ None
+    │    │           │           └ False
+    │    │           └ ('networksetup', '-listallhardwareports')
+    │    └ <function _UnixSubprocessTransport._start at 0x1089c8e00>
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/asyncio/unix_events.py", line 856, in _start
+    self._proc = subprocess.Popen(
+    │    │       │          └ <class 'subprocess.Popen'>
+    │    │       └ <module 'subprocess' from '/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subproc...
+    │    └ None
+    └ <_UnixSubprocessTransport closed not started>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1039, in __init__
+    self._execute_child(args, executable, preexec_fn, close_fds,
+    │    │              │     │           │           └ True
+    │    │              │     │           └ None
+    │    │              │     └ None
+    │    │              └ ('networksetup', '-listallhardwareports')
+    │    └ <function Popen._execute_child at 0x1088a0b80>
+    └ <Popen: returncode: 255 args: ('networksetup', '-listallhardwareports')>
+  File "/Users/macstudio3/.local/share/uv/python/cpython-3.13.14-macos-aarch64-none/lib/python3.13/subprocess.py", line 1991, in _execute_child
+    raise child_exception_type(errno_num, err_msg, err_filename)
+          │                    │          │        └ 'networksetup'
+          │                    │          └ 'No such file or directory'
+          │                    └ 2
+          └ <class 'OSError'>
+
+FileNotFoundError: [Errno 2] No such file or directory: 'networksetup'
diff --git a/launchd.err.log b/launchd.err.log
new file mode 100644
index 0000000..e69de29
diff --git a/launchd.out.log b/launchd.out.log
new file mode 100644
index 0000000..e69de29
diff --git a/run-exo.sh b/run-exo.sh
new file mode 100755
index 0000000..ea2da22
--- /dev/null
+++ b/run-exo.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+# exo cluster keepalive runner — launched by com.steve.exo-keepalive (KeepAlive=true).
+# Starts the exo master+worker + OpenAI-compatible API at http://localhost:52415.
+# Steve's standing rule: the cluster is ALWAYS up. launchd respawns this if it exits.
+set -uo pipefail
+export HOME=/Users/macstudio3
+export PATH="/Users/macstudio3/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
+cd "$HOME/exo" || exit 1
+LOG="$HOME/Projects/exo-keepalive/exo.log"
+echo "[$(date +%FT%T%z)] === exo start (pid $$) ===" >> "$LOG"
+# exec so launchd tracks the real exo process (respawns on crash)
+exec /Users/macstudio3/.local/bin/uv run exo >> "$LOG" 2>&1

(oldest)  ·  back to Exo Keepalive  ·  exo keepalive: node-bind flow; bootstrap-peers reverted (rem 4ded18a →