Skip to content

dimos bake: compose rust native modules into one host binary - #3333

Open
leshy wants to merge 4 commits into
mainfrom
ivan/feat/dimos-bake
Open

dimos bake: compose rust native modules into one host binary#3333
leshy wants to merge 4 commits into
mainfrom
ivan/feat/dimos-bake

Conversation

@leshy

@leshy leshy commented Aug 2, 2026

Copy link
Copy Markdown
Member

One robot-side process per rust module means one zenoh listen port per module, annoying deploy mechanics, py deps

I present dimos bake

dimos bake ray-tracing mls-planner -o dist/go2-nav --suppress dimos/global_map

prints the derived wiring before building the autoconnect graph, computed from Cargo.toml metadata alone:

  • registry: crates self-declare ports via [package.metadata.dimos.module.<id>]; #[module(name = "...")] fails compilation if metadata drifts from the actual #[input]/#[output] fields

  • wiring: identical to python autoconnect but in-process. internal hops stay on zenoh (same-session delivery) so every intermediate topic is externally observable unless suppressed (Locality::SessionLocal), baked default overridable at runtime

  • scheduling: one tokio runtime per module (threads\ metadata knob), fail-fast supervision - first module death takes the host down

  • contract: the baked host speaks the NativeModule protocol (stdin JSON, `DIMOS_*` envs), nested per-module sections; baked_host() gives the python coordinator a drop-in module class with the union of member ports; --emit-config writes a fully-defaulted config for systemd deployments

First two commits are prerequisites from field-debugging the go2 zenoh link: worker processes now inherit the full host GlobalConfig (CLI --robot-ips never reached workers), and native processes get explicit DIMOS_ZENOH_CONNECT endpoints instead of relying on multicast scouting that LANs filter. The thin-obstacle raycaster fix rides in the same commit (repeatedly-seen thin clusters vanished from the emitted cloud after their first frame).

Solo per-module binaries are unchanged - bake is a deployment choice, not an architecture commitment.

Known wart (pre-existing): mls_planner.node_edges is nav_msgs.Path in rust vs LineSegments3D in the python wrapper; python wins when it drives (topics come over stdin), standalone hosts use the rust spelling.

leshy added 4 commits August 3, 2026 01:53
CLI overrides like --robot-ips never reached worker processes, so modules
deployed to workers opened zenoh sessions with no connect endpoints and
silently failed to dial the robot on multicast-filtered LANs. Same fix as
1ec9a6ec2 on ivan/feat/body_obstacle.
…itting

Ported from ivan/feat/body_obstacle (1ec9a6ec2): native rust processes get
DIMOS_ZENOH_CONNECT with the same endpoints the python sessions dial, so
the raycaster/MLS no longer depend on multicast scouting the LAN filters.
Also the voxel_ray_tracer emission fix -- repeatedly-hit thin clusters
(chair legs, box edges) stayed live-skipped below support_min and vanished
from the cloud after their first frame.
Groundwork for `dimos bake`, which links several native modules into one
binary. Three pieces, none of them useful alone:

Module structs move out of main.rs into their crate's lib (module.rs) so a
host can link them; main.rs is now a shim. pyo3/numpy go behind a `python`
feature (default on) so a host can drop them and keep libpython symbols out
of a static musl build.

Each crate declares its ports in [package.metadata.dimos.module.<id>]. bake
reads that as pure TOML, so it can draw and check the graph before compiling
anything. #[module(name = "<id>")] reads the same table at expansion time and
fails the build when the struct's #[input]/#[output] fields drift from it.

dimos_module::host runs N modules in one process: one shared transport
(type-erased through SharedTransport, since Transport returns impl Future and
each module is monomorphized separately), one thread and runtime per module,
configs all parsed and validated before anything spawns, and fail-fast when
any module stops. Topic suppression rides the existing QoS channel as zenoh
Locality::SessionLocal; LCM says so and ignores it. run_fallible now shares
its build/subscribe/teardown path with the host via run_module_core.
`dimos bake ray-tracing mls-planner -o dist/go2-nav` reads the Cargo.toml
registry, wires the modules the way autoconnect would, prints the graph,
generates a crate under target/dimos-bake/ and builds it.

The graph is drawn before anything compiles, so a bad composition costs a
second, not a build. Two deliberate differences from python autoconnect: a
same-name/different-type pair is an error (with the --remap that fixes it)
rather than a silent disconnect, and --suppress refuses a topic the host does
not publish. Topics carry the message type, matching the zenoh key a python
NativeModule actually hands its native process — without that a standalone
host sits on keys nobody else uses.

baked_host() gives the blueprint side one NativeModule whose ports are the
union of its members', so autoconnect, .remappings() and .namespace() are
unchanged; only the stdin blob nests, one section per member. NativeModule
grew a _stdin_blob() seam for it.

The zenoh runtime refuses a current_thread scheduler, so every module runtime
is multi-thread — `threads` sets its worker count rather than choosing a
flavour.
@codecov

codecov Bot commented Aug 2, 2026

Copy link
Copy Markdown

❌ 4 Tests Failed:

Tests completed Failed Passed Skipped
3426 4 3422 174
View the top 3 failed test(s) by shortest run time
dimos.experimental.security_demo.test_security_module::test_follow_step_publishes_twist_when_tracking
Stack Traces | 0.001s run time
@pytest.fixture(scope="session")
    def person_image():
>       return Image.from_file(get_data("security_detection.png"))


.../experimental/security_demo/conftest.py:36: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'security_detection.png'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/security_detection.png')
        name       = 'security_detection.png'
        nested_path = None
        path_parts = ('security_detection.png',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/security_detection.png.tar.gz')
        filename   = 'security_detection.png'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/security_detection.png.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/security_detection.png.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/security_detection.png.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/security_detection.png.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/security_detection.png.tar.gz'])
relative_path = PosixPath('data/.lfs/security_detection.png.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.experimental.security_demo.test_security_module::test_follow_step_transitions_to_patrolling_on_person_lost
Stack Traces | 0.001s run time
@pytest.fixture(scope="session")
    def person_image():
>       return Image.from_file(get_data("security_detection.png"))


.../experimental/security_demo/conftest.py:36: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'security_detection.png'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/security_detection.png')
        name       = 'security_detection.png'
        nested_path = None
        path_parts = ('security_detection.png',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/security_detection.png.tar.gz')
        filename   = 'security_detection.png'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/security_detection.png.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/security_detection.png.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/security_detection.png.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/security_detection.png.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/security_detection.png.tar.gz'])
relative_path = PosixPath('data/.lfs/security_detection.png.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.codebase_checks.test_no_init_files::test_no_init_files
Stack Traces | 0.022s run time
def test_no_init_files():
        dimos_dir = DIMOS_PROJECT_ROOT / "dimos"
        init_files = sorted(dimos_dir.rglob("__init__.py"))
        # The root dimos/__init__.py is allowed for the porcelain lazy import.
        init_files = [f for f in init_files if f != dimos_dir / "__init__.py"]
        if init_files:
            listing = "\n".join(f"  - {f.relative_to(dimos_dir)}" for f in init_files)
>           raise AssertionError(
                f"Found __init__.py files in dimos/:\n{listing}\n\n"
                "__init__.py files are not allowed because they lead to unnecessary "
                "extraneous imports. Everything should be imported straight from the "
                "source module."
            )
E           AssertionError: Found __init__.py files in dimos/:
E             - cli/bake/__init__.py
E           
E           __init__.py files are not allowed because they lead to unnecessary extraneous imports. Everything should be imported straight from the source module.

dimos_dir  = PosixPath('.../dimos/dimos/dimos')
init_files = [PosixPath('.../dimos/dimos/dimos/cli/bake/__init__.py')]
listing    = '  - cli/bake/__init__.py'

dimos/codebase_checks/test_no_init_files.py:25: AssertionError
dimos.mapping.occupancy.test_path_resampling::test_resample_path[smooth]
Stack Traces | 3.62s run time
@pytest.fixture
    def costmap() -> OccupancyGrid:
>       return gradient(OccupancyGrid(np.load(get_data("occupancy_simple.npy"))), max_distance=1.5)


.../mapping/occupancy/test_path_resampling.py:31: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_operations::test_overlay_occupied
Stack Traces | 3.64s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.navigation.replanning_a_star.test_goal_validator::test_find_safe_goal[input_pos0-expected_pos0]
Stack Traces | 3.64s run time
@pytest.fixture
    def costmap() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../navigation/replanning_a_star/test_goal_validator.py:26: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_path_mask::test_make_path_mask[0-inf-make_path_mask_full.png]
Stack Traces | 3.65s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_visualizations::test_visualize_occupancy_grid[turbo]
Stack Traces | 3.66s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_path_mask::test_make_path_mask[50-2-make_path_mask_two_meters.png]
Stack Traces | 3.66s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_inflation::test_inflation
Stack Traces | 3.66s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.navigation.replanning_a_star.test_goal_validator::test_find_safe_goal[input_pos1-expected_pos1]
Stack Traces | 3.66s run time
@pytest.fixture
    def costmap() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../navigation/replanning_a_star/test_goal_validator.py:26: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.msgs.sensor_msgs.test_image::test_lcm_encode_decode
Stack Traces | 3.67s run time
@pytest.fixture
    def img():
>       image_file_path = get_data("cafe.jpg")


.../msgs/sensor_msgs/test_image.py:27: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'cafe.jpg'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/cafe.jpg')
        name       = 'cafe.jpg'
        nested_path = None
        path_parts = ('cafe.jpg',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
        filename   = 'cafe.jpg'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/cafe.jpg.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/cafe.jpg.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/cafe.jpg.tar.gz'])
relative_path = PosixPath('data/.lfs/cafe.jpg.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_path_resampling::test_resample_path[simple]
Stack Traces | 3.67s run time
@pytest.fixture
    def costmap() -> OccupancyGrid:
>       return gradient(OccupancyGrid(np.load(get_data("occupancy_simple.npy"))), max_distance=1.5)


.../mapping/occupancy/test_path_resampling.py:31: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_visualizations::test_visualize_occupancy_grid[rainbow]
Stack Traces | 3.68s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.robot.unitree.type.test_odometry::test_odometry_conversion_and_count
Stack Traces | 3.68s run time
def test_odometry_conversion_and_count() -> None:
        """Each replay entry converts to :class:`Odometry` and count is correct."""
>       for raw in SensorReplay(name="raw_odometry_rotate_walk").iterate():


.../unitree/type/test_odometry.py:32: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../utils/timeseries/base.py:256: in iterate
    for _, data in self.iterate_items(
        duration   = None
        from_timestamp = None
        loop       = False
        seek       = None
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21cf110>
.../utils/timeseries/base.py:227: in iterate_items
    first = self.first_timestamp()
        duration   = None
        from_timestamp = None
        loop       = False
        seek       = None
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21cf110>
.../utils/timeseries/base.py:209: in first_timestamp
    for ts, _ in self._iter_items():
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21cf110>
.../utils/testing/legacy_pickle.py:157: in _iter_items
    for idx, filepath in enumerate(self._iter_files()):
        end        = None
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21cf110>
        start      = None
.../utils/testing/legacy_pickle.py:104: in _iter_files
    root_dir = self._get_root_dir()
        extract_number = <function LegacyPickleStore._iter_files.<locals>.extract_number at 0xff8fad3b4860>
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21cf110>
.../utils/testing/legacy_pickle.py:92: in _get_root_dir
    self._root_dir = get_data(self._name)
        for_write  = False
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21cf110>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'raw_odometry_rotate_walk'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/raw_odometry_rotate_walk')
        name       = 'raw_odometry_rotate_walk'
        nested_path = None
        path_parts = ('raw_odometry_rotate_walk',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz')
        filename   = 'raw_odometry_rotate_walk'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/raw_odometry_rotate_walk.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/raw_odometry_rotate_walk.tar.gz'])
relative_path = PosixPath('data/.lfs/raw_odometry_rotate_walk.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.utils.test_data::test_lfs_path_operations
Stack Traces | 3.68s run time
def test_lfs_path_operations() -> None:
        """Test various Path operations with LfsPath."""
        filename = "three_paths.png"
        lfs_path = LfsPath(filename)
    
        # Test is_file
>       assert lfs_path.is_file() is True

filename   = 'three_paths.png'
lfs_path   = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2f929f6d0>

dimos/utils/test_data.py:346: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = 'is_file'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2f929f6d0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'three_paths.png'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2f929f6d0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'three_paths.png'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/three_paths.png')
        name       = 'three_paths.png'
        nested_path = None
        path_parts = ('three_paths.png',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
        filename   = 'three_paths.png'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/three_paths.png.tar.gz'])
relative_path = PosixPath('data/.lfs/three_paths.png.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.robot.unitree.type.test_odometry::test_dataset_size
Stack Traces | 3.68s run time
def test_dataset_size() -> None:
        """Ensure the replay contains the expected number of messages."""
>       assert sum(1 for _ in SensorReplay(name="raw_odometry_rotate_walk").iterate()) == 179


.../unitree/type/test_odometry.py:27: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../unitree/type/test_odometry.py:27: in <genexpr>
    assert sum(1 for _ in SensorReplay(name="raw_odometry_rotate_walk").iterate()) == 179
        .0         = <generator object TimeSeriesStore.iterate at 0xff8fa21d28a0>
.../utils/timeseries/base.py:256: in iterate
    for _, data in self.iterate_items(
        duration   = None
        from_timestamp = None
        loop       = False
        seek       = None
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21c5820>
.../utils/timeseries/base.py:227: in iterate_items
    first = self.first_timestamp()
        duration   = None
        from_timestamp = None
        loop       = False
        seek       = None
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21c5820>
.../utils/timeseries/base.py:209: in first_timestamp
    for ts, _ in self._iter_items():
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21c5820>
.../utils/testing/legacy_pickle.py:157: in _iter_items
    for idx, filepath in enumerate(self._iter_files()):
        end        = None
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21c5820>
        start      = None
.../utils/testing/legacy_pickle.py:104: in _iter_files
    root_dir = self._get_root_dir()
        extract_number = <function LegacyPickleStore._iter_files.<locals>.extract_number at 0xff8fad3b4ea0>
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21c5820>
.../utils/testing/legacy_pickle.py:92: in _get_root_dir
    self._root_dir = get_data(self._name)
        for_write  = False
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fa21c5820>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'raw_odometry_rotate_walk'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/raw_odometry_rotate_walk')
        name       = 'raw_odometry_rotate_walk'
        nested_path = None
        path_parts = ('raw_odometry_rotate_walk',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz')
        filename   = 'raw_odometry_rotate_walk'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/raw_odometry_rotate_walk.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/raw_odometry_rotate_walk.tar.gz'])
relative_path = PosixPath('data/.lfs/raw_odometry_rotate_walk.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.navigation.replanning_a_star.test_min_cost_astar::test_astar_unknown_penalty_allows_with_low_penalty
Stack Traces | 3.69s run time
@pytest.fixture
    def costmap() -> PointCloud:
>       return gradient(OccupancyGrid(np.load(get_data("occupancy_simple.npy"))), max_distance=1.5)


.../navigation/replanning_a_star/test_min_cost_astar.py:32: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_path_map::test_make_navigation_map[mixed]
Stack Traces | 3.69s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_operations::test_smooth_occupied
Stack Traces | 3.69s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_extrude_occupancy::test_generate_mujoco_scene
Stack Traces | 3.69s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.navigation.replanning_a_star.test_min_cost_astar::test_astar
Stack Traces | 3.69s run time
@pytest.fixture
    def costmap() -> PointCloud:
>       return gradient(OccupancyGrid(np.load(get_data("occupancy_simple.npy"))), max_distance=1.5)


.../navigation/replanning_a_star/test_min_cost_astar.py:32: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.msgs.sensor_msgs.test_image::test_rgb_bgr_conversion
Stack Traces | 3.7s run time
@pytest.fixture
    def img():
>       image_file_path = get_data("cafe.jpg")


.../msgs/sensor_msgs/test_image.py:27: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'cafe.jpg'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/cafe.jpg')
        name       = 'cafe.jpg'
        nested_path = None
        path_parts = ('cafe.jpg',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
        filename   = 'cafe.jpg'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/cafe.jpg.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/cafe.jpg.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/cafe.jpg.tar.gz'])
relative_path = PosixPath('data/.lfs/cafe.jpg.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.experimental.security_demo.test_security_module::test_patrol_step_transitions_to_following_on_detection
Stack Traces | 3.7s run time
@pytest.fixture(scope="session")
    def person_image():
>       return Image.from_file(get_data("security_detection.png"))


.../experimental/security_demo/conftest.py:36: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'security_detection.png'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/security_detection.png')
        name       = 'security_detection.png'
        nested_path = None
        path_parts = ('security_detection.png',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/security_detection.png.tar.gz')
        filename   = 'security_detection.png'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/security_detection.png.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/security_detection.png.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/security_detection.png.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/security_detection.png.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/security_detection.png.tar.gz'])
relative_path = PosixPath('data/.lfs/security_detection.png.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.navigation.replanning_a_star.test_goal_validator::test_find_safe_goal[input_pos2-expected_pos2]
Stack Traces | 3.7s run time
@pytest.fixture
    def costmap() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../navigation/replanning_a_star/test_goal_validator.py:26: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_gradient::test_gradient[simple]
Stack Traces | 3.71s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.navigation.replanning_a_star.test_min_cost_astar::test_astar_corner
Stack Traces | 3.72s run time
@pytest.fixture
    def costmap_three_paths() -> PointCloud:
>       return voronoi_gradient(OccupancyGrid(np.load(get_data("three_paths.npy"))), max_distance=1.5)


.../navigation/replanning_a_star/test_min_cost_astar.py:37: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'three_paths.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/three_paths.npy')
        name       = 'three_paths.npy'
        nested_path = None
        path_parts = ('three_paths.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/three_paths.npy.tar.gz')
        filename   = 'three_paths.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/three_paths.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/three_paths.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/three_paths.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/three_paths.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/three_paths.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/three_paths.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.msgs.sensor_msgs.test_image::test_file_load
Stack Traces | 3.72s run time
@pytest.fixture
    def img():
>       image_file_path = get_data("cafe.jpg")


.../msgs/sensor_msgs/test_image.py:27: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'cafe.jpg'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/cafe.jpg')
        name       = 'cafe.jpg'
        nested_path = None
        path_parts = ('cafe.jpg',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
        filename   = 'cafe.jpg'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/cafe.jpg.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/cafe.jpg.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/cafe.jpg.tar.gz'])
relative_path = PosixPath('data/.lfs/cafe.jpg.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.utils.test_data::test_lfs_path_division_operator
Stack Traces | 3.73s run time
def test_lfs_path_division_operator() -> None:
        """Test path division operator with LfsPath."""
        # Use a directory for testing
        lfs_path = LfsPath("three_paths.png")
    
        # Test truediv - this should trigger download and return resolved path
        result = lfs_path / "subpath"
        assert isinstance(result, Path)
    
        # The result should be the resolved path with subpath appended
>       assert "three_paths.png" in str(result)

lfs_path   = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2eee5cc50>
result     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2eee5ce50>

dimos/utils/test_data.py:378: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2eee5ce50>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'three_paths.png/subpath'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2eee5ce50>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'three_paths.png'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/three_paths.png/subpath')
        name       = 'three_paths.png/subpath'
        nested_path = PosixPath('subpath')
        path_parts = ('three_paths.png', 'subpath')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
        filename   = 'three_paths.png'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/three_paths.png.tar.gz'])
relative_path = PosixPath('data/.lfs/three_paths.png.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_gradient::test_gradient[voronoi]
Stack Traces | 3.74s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.mapping.occupancy.test_path_map::test_make_navigation_map[simple]
Stack Traces | 3.74s run time
@pytest.fixture
    def occupancy() -> OccupancyGrid:
>       return OccupancyGrid(np.load(get_data("occupancy_simple.npy")))


.../mapping/occupancy/conftest.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.msgs.sensor_msgs.test_image::test_opencv_conversion
Stack Traces | 3.75s run time
@pytest.fixture
    def img():
>       image_file_path = get_data("cafe.jpg")


.../msgs/sensor_msgs/test_image.py:27: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'cafe.jpg'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/cafe.jpg')
        name       = 'cafe.jpg'
        nested_path = None
        path_parts = ('cafe.jpg',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
        filename   = 'cafe.jpg'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/cafe.jpg.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/cafe.jpg.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/cafe.jpg.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/cafe.jpg.tar.gz'])
relative_path = PosixPath('data/.lfs/cafe.jpg.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.utils.test_data::test_lfs_path_multiple_instances
Stack Traces | 3.8s run time
def test_lfs_path_multiple_instances() -> None:
        """Test that multiple LfsPath instances for same file work correctly."""
        filename = "three_paths.png"
    
        # Create two separate instances
        lfs_path_1 = LfsPath(filename)
        lfs_path_2 = LfsPath(filename)
    
        # Both should start with None cache
        cache_1 = object.__getattribute__(lfs_path_1, "_lfs_resolved_cache")
        cache_2 = object.__getattribute__(lfs_path_2, "_lfs_resolved_cache")
        assert cache_1 is None
        assert cache_2 is None
    
        # Access file through first instance
>       content_1 = lfs_path_1.read_bytes()

cache_1    = None
cache_2    = None
filename   = 'three_paths.png'
lfs_path_1 = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2f90bb450>
lfs_path_2 = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2f90babd0>

dimos/utils/test_data.py:396: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = 'read_bytes'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2f90bb450>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'three_paths.png'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2f90bb450>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'three_paths.png'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/three_paths.png')
        name       = 'three_paths.png'
        nested_path = None
        path_parts = ('three_paths.png',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
        filename   = 'three_paths.png'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/three_paths.png.tar.gz'])
relative_path = PosixPath('data/.lfs/three_paths.png.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.navigation.replanning_a_star.test_min_cost_astar::test_astar_python_and_cpp
Stack Traces | 3.8s run time
@pytest.fixture
    def costmap() -> PointCloud:
>       return gradient(OccupancyGrid(np.load(get_data("occupancy_simple.npy"))), max_distance=1.5)


.../navigation/replanning_a_star/test_min_cost_astar.py:32: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.navigation.replanning_a_star.test_min_cost_astar::test_astar_unknown_penalty_blocks_unknown_cells
Stack Traces | 3.81s run time
@pytest.fixture
    def costmap() -> PointCloud:
>       return gradient(OccupancyGrid(np.load(get_data("occupancy_simple.npy"))), max_distance=1.5)


.../navigation/replanning_a_star/test_min_cost_astar.py:32: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'occupancy_simple.npy'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/occupancy_simple.npy')
        name       = 'occupancy_simple.npy'
        nested_path = None
        path_parts = ('occupancy_simple.npy',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
        filename   = 'occupancy_simple.npy'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/occupancy_simple.npy.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/occupancy_simple.npy.tar.gz'])
relative_path = PosixPath('data/.lfs/occupancy_simple.npy.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.robot.unitree.type.test_odometry::test_total_rotation_travel_iterate
Stack Traces | 3.82s run time
def test_total_rotation_travel_iterate() -> None:
        total_rad = 0.0
        prev_yaw: float | None = None
    
>       for odom in SensorReplay(name="raw_odometry_rotate_walk", autocast=Odometry.from_msg).iterate():

prev_yaw   = None
total_rad  = 0.0

.../unitree/type/test_odometry.py:42: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../utils/timeseries/base.py:256: in iterate
    for _, data in self.iterate_items(
        duration   = None
        from_timestamp = None
        loop       = False
        seek       = None
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fad40a8a0>
.../utils/timeseries/base.py:227: in iterate_items
    first = self.first_timestamp()
        duration   = None
        from_timestamp = None
        loop       = False
        seek       = None
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fad40a8a0>
.../utils/timeseries/base.py:209: in first_timestamp
    for ts, _ in self._iter_items():
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fad40a8a0>
.../utils/testing/legacy_pickle.py:157: in _iter_items
    for idx, filepath in enumerate(self._iter_files()):
        end        = None
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fad40a8a0>
        start      = None
.../utils/testing/legacy_pickle.py:104: in _iter_files
    root_dir = self._get_root_dir()
        extract_number = <function LegacyPickleStore._iter_files.<locals>.extract_number at 0xff8fad3b4360>
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fad40a8a0>
.../utils/testing/legacy_pickle.py:92: in _get_root_dir
    self._root_dir = get_data(self._name)
        for_write  = False
        self       = <dimos.utils.testing.legacy_pickle.LegacyPickleStore object at 0xff8fad40a8a0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'raw_odometry_rotate_walk'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/raw_odometry_rotate_walk')
        name       = 'raw_odometry_rotate_walk'
        nested_path = None
        path_parts = ('raw_odometry_rotate_walk',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz')
        filename   = 'raw_odometry_rotate_walk'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/raw_odometry_rotate_walk.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/raw_odometry_rotate_walk.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/raw_odometry_rotate_walk.tar.gz'])
relative_path = PosixPath('data/.lfs/raw_odometry_rotate_walk.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.utils.test_data::test_lfs_path_with_real_file
Stack Traces | 4.24s run time
def test_lfs_path_with_real_file() -> None:
        """Test LfsPath with a real small LFS file."""
        # Use a small existing LFS file
        filename = "three_paths.png"
        lfs_path = LfsPath(filename)
    
        # Initially, cache should be None
        cache = object.__getattribute__(lfs_path, "_lfs_resolved_cache")
        assert cache is None
    
        # Access a Path method - this should trigger download
>       exists = lfs_path.exists()

cache      = None
filename   = 'three_paths.png'
lfs_path   = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2f90a7dd0>

dimos/utils/test_data.py:273: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = 'exists'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2f90a7dd0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'three_paths.png'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempt...a/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.") raised in repr()] LfsPath object at 0xfff2f90a7dd0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'three_paths.png'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/three_paths.png')
        name       = 'three_paths.png'
        nested_path = None
        path_parts = ('three_paths.png',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
        filename   = 'three_paths.png'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/data/.lfs/three_paths.png.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/three_paths.png.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/three_paths.png.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/three_paths.png.tar.gz'])
relative_path = PosixPath('data/.lfs/three_paths.png.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.msgs.nav_msgs.test_OccupancyGrid::test_from_pointcloud
Stack Traces | 4.71s run time
def test_from_pointcloud() -> None:
        """Test creating OccupancyGrid from PointCloud2."""
>       file_path = get_data("lcm_msgs") / "sensor_msgs/PointCloud2.pickle"


.../msgs/nav_msgs/test_OccupancyGrid.py:175: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'lcm_msgs'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/lcm_msgs')
        name       = 'lcm_msgs'
        nested_path = None
        path_parts = ('lcm_msgs',)
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/dimos/data/.lfs/lcm_msgs.tar.gz')
        filename   = 'lcm_msgs'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/dimos/data/.lfs/lcm_msgs.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/dimos/data/.lfs/lcm_msgs.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/lcm_msgs.tar.gz']' returned non-zero exit status 2.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '01f813de-a464-424b-86a0-eb976a8e1b60.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/dimos/data/.lfs/lcm_msgs.tar.gz')
last_err   = CalledProcessError(2, ['git', 'lfs', 'pull', '--include', 'data/.lfs/lcm_msgs.tar.gz'])
relative_path = PosixPath('data/.lfs/lcm_msgs.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.agents.mcp.test_mcp_client::test_image
Stack Traces | 12.6s run time
agent_setup = <function agent_setup.<locals>.fn at 0xffa96bd1f4c0>

    def test_image(agent_setup):
        history = agent_setup(
            blueprints=[Visualizer.blueprint()],
            messages=[
                HumanMessage(
                    "What do you see? Take a picture using your camera and describe it. "
                    "Please mention one of the words which best match the image: "
                    "'stadium', 'cafe', 'battleship'."
                )
            ],
            system_prompt="You are a helpful assistant that can use a camera to take pictures.",
        )
    
        response = history[-1].content.lower()
>       assert "cafe" in response
E       assert 'cafe' in "i've taken a picture. let me analyze and describe it for you.\nthe image features an expansive outdoor stadium. from the camera's perspective, the word 'stadium' best matches the image. is there anything else you'd like to know or do?"

agent_setup = <function agent_setup.<locals>.fn at 0xffa96bd1f4c0>
history    = [HumanMessage(content="What do you see? Take a picture using your camera and describe it. Please mention one of the wo...s={}, response_metadata={}, id='lc_run--019fc4ba-320c-70d2-a11f-0b430a74d4e1-0', tool_calls=[], invalid_tool_calls=[])]
response   = "i've taken a picture. let me analyze and describe it for you.\nthe image features an expansive outdoor stadium. from the camera's perspective, the word 'stadium' best matches the image. is there anything else you'd like to know or do?"

.../agents/mcp/test_mcp_client.py:197: AssertionError
dimos.agents.skills.test_google_maps_skill_container::test_get_gps_position_for_queries
Stack Traces | 67.1s run time
dimos.protocol.rpc.rpc_utils.RemoteError: [Remote builtins.RuntimeError] Failed to fetch tools from MCP server http://localhost:24932/mcp

Remote traceback:
Traceback (most recent call last):
  File ".../protocol/rpc/pubsubrpc.py", line 280, in execute_and_respond
    response = f(*args[0], **args[1])
               ^^^^^^^^^^^^^^^^^^^^^^
  File ".../protocol/rpc/spec.py", line 116, in override_f
    return getattr(module, fname)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 229, in on_system_modules
    tools = self._fetch_tools()
            ^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 152, in _fetch_tools
    raise RuntimeError(
RuntimeError: Failed to fetch tools from MCP server http://localhost:24932/mcp


The above exception was the direct cause of the following exception:

agent_setup = <function agent_setup.<locals>.fn at 0xff4d2c301120>

    def test_get_gps_position_for_queries(agent_setup) -> None:
>       history = agent_setup(
            blueprints=[FakeGPS.blueprint(), MockedPositionSkill.blueprint()],
            messages=[
                HumanMessage(
                    "What are the lat/lon for hyde park, regent park, russell park? "
                    "Use the get_gps_position_for_queries tool."
                )
            ],
        )

agent_setup = <function agent_setup.<locals>.fn at 0xff4d2c301120>

.../agents/skills/test_google_maps_skill_container.py:83: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/agents/conftest.py:90: in fn
    coordinator = ModuleCoordinator.build(blueprint)
        agent_kwargs = {'mcp_server_url': 'http://localhost:24932/mcp', 'model_fixture': '.../agents/fixtures/test_get_gps_position_for_queries.json', 'system_prompt': None}
        agent_transport = <dimos.core.transport.pLCMTransport object at 0xff4c403028d0>
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_google_maps_skill_container.Fak...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        blueprints = [Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_google_maps_skill_container.Fa...obal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())]
        coordinator = None
        finished_event = <threading.Event at 0xff4c40301d00: unset>
        finished_transport = <dimos.core.transport.pLCMTransport object at 0xff4c403009e0>
        fixture    = None
        fixture_path = PosixPath('.../agents/fixtures/test_get_gps_position_for_queries.json')
        history    = []
        lcm_url    = 'udpm://239.255.76.67:12632?ttl=0'
        mcp_url    = 'http://localhost:24932/mcp'
        messages   = [HumanMessage(content='What are the lat/lon for hyde park, regent park, russell park? Use the get_gps_position_for_queries tool.', additional_kwargs={}, response_metadata={})]
        on_message = <function agent_setup.<locals>.fn.<locals>.on_message at 0xff4d2c300fe0>
        recording  = False
        request    = <SubRequest 'agent_setup' for <Function test_get_gps_position_for_queries>>
        system_prompt = None
        transports = [<dimos.core.transport.pLCMTransport object at 0xff4c403028d0>, <dimos.core.transport.pLCMTransport object at 0xff4c403009e0>]
        unsubs     = [<function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff4d2c301440>, <function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff4d2c301800>]
.../core/coordination/module_coordinator.py:368: in build
    coordinator.start_all_modules()
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_google_maps_skill_container.Fak...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        cls        = <class 'dimos.core.coordination.module_coordinator.ModuleCoordinator'>
        coordinator = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff4c40300800>
        global_values = {}
        module_kwargs = {}
        parsed_config = None
        transport_overrides = {}
        transports = {}
.../core/coordination/module_coordinator.py:259: in start_all_modules
    self._send_on_system_modules()
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff4c40303da0>, <dimos.core.rpc_client.RPCClient object at 0xff4c40301940...<dimos.core.rpc_client.RPCClient object at 0xff4c40303170>, <dimos.core.rpc_client.RPCClient object at 0xff4c402b93a0>]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff4c40300800>
.../core/coordination/module_coordinator.py:299: in _send_on_system_modules
    module.on_system_modules(modules)
        module     = <dimos.core.rpc_client.RPCClient object at 0xff4c40303170>
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff4c40303da0>, <dimos.core.rpc_client.RPCClient object at 0xff4c40301940...<dimos.core.rpc_client.RPCClient object at 0xff4c40303170>, <dimos.core.rpc_client.RPCClient object at 0xff4c402b93a0>]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff4c40300800>
dimos/core/rpc_client.py:93: in __call__
    result, unsub_fn = self._rpc.call_sync(
        args       = ([<dimos.core.rpc_client.RPCClient object at 0xff4c40303da0>, <dimos.core.rpc_client.RPCClient object at 0xff4c4030194...imos.core.rpc_client.RPCClient object at 0xff4c40303170>, <dimos.core.rpc_client.RPCClient object at 0xff4c402b93a0>],)
        kwargs     = {}
        self       = <dimos.core.rpc_client.RpcCall object at 0xff4c402b8200>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff4c40300230>
name = 'McpClient/on_system_modules'
arguments = (([<dimos.core.rpc_client.RPCClient object at 0xff4c40303da0>, <dimos.core.rpc_client.RPCClient object at 0xff4c403019...core.rpc_client.RPCClient object at 0xff4c40303170>, <dimos.core.rpc_client.RPCClient object at 0xff4c402b93a0>],), {})
rpc_timeout = 120.0

    def call_sync(
        self, name: str, arguments: Args, rpc_timeout: float | None = None
    ) -> tuple[Any, Callable[[], None]]:
        if rpc_timeout is None:
            method = name.rsplit("/", 1)[-1]
            rpc_timeout = self.rpc_timeouts.get(name) or self.rpc_timeouts.get(
                method, self.default_rpc_timeout
            )
        event = threading.Event()
    
        def receive_value(val) -> None:  # type: ignore[no-untyped-def]
            event.result = val  # type: ignore[attr-defined]  # attach to event
            event.set()
    
        unsub_fn = self.call(name, arguments, receive_value)
        if not event.wait(rpc_timeout):
            # Retries register new callbacks. Remove this expired callback so
            # repeated timeouts do not accumulate entries in the shared response map.
            unsub_fn()
            raise TimeoutError(f"RPC call to '{name}' timed out after {rpc_timeout} seconds")
    
        # Check if the result is an exception and raise it
        result = event.result  # type: ignore[attr-defined]
        if isinstance(result, BaseException):
>           raise result
E           RuntimeError: Failed to fetch tools from MCP server http://localhost:24932/mcp

arguments  = (([<dimos.core.rpc_client.RPCClient object at 0xff4c40303da0>, <dimos.core.rpc_client.RPCClient object at 0xff4c403019...core.rpc_client.RPCClient object at 0xff4c40303170>, <dimos.core.rpc_client.RPCClient object at 0xff4c402b93a0>],), {})
event      = <threading.Event at 0xff4c4028f710: set>
method     = 'on_system_modules'
name       = 'McpClient/on_system_modules'
receive_value = <function RPCClient.call_sync.<locals>.receive_value at 0xff4d2bdda980>
result     = RuntimeError('Failed to fetch tools from MCP server http://localhost:24932/mcp')
rpc_timeout = 120.0
self       = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff4c40300230>
unsub_fn   = <function PubSubRPCMixin.call_cb.<locals>.unsubscribe_callback at 0xff4d2c34d300>

.../protocol/rpc/spec.py:88: RuntimeError
dimos.agents.skills.test_navigation::test_go_to_semantic_location
Stack Traces | 67.8s run time
dimos.protocol.rpc.rpc_utils.RemoteError: [Remote builtins.RuntimeError] Failed to fetch tools from MCP server http://localhost:23387/mcp

Remote traceback:
Traceback (most recent call last):
  File ".../protocol/rpc/pubsubrpc.py", line 280, in execute_and_respond
    response = f(*args[0], **args[1])
               ^^^^^^^^^^^^^^^^^^^^^^
  File ".../protocol/rpc/spec.py", line 116, in override_f
    return getattr(module, fname)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 229, in on_system_modules
    tools = self._fetch_tools()
            ^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 152, in _fetch_tools
    raise RuntimeError(
RuntimeError: Failed to fetch tools from MCP server http://localhost:23387/mcp


The above exception was the direct cause of the following exception:

agent_setup = <function agent_setup.<locals>.fn at 0xff22cd87a980>

    def test_go_to_semantic_location(agent_setup) -> None:
>       history = agent_setup(
            blueprints=[
                FakeCamera.blueprint(),
                FakeOdom.blueprint(),
                MockedSemanticNavSkill.blueprint(),
                *_STUB_BLUEPRINTS,
            ],
            messages=[HumanMessage("Go to the bookshelf. Use the navigate_with_text tool.")],
        )

agent_setup = <function agent_setup.<locals>.fn at 0xff22cd87a980>

.../agents/skills/test_navigation.py:151: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/agents/conftest.py:90: in fn
    coordinator = ModuleCoordinator.build(blueprint)
        agent_kwargs = {'mcp_server_url': 'http://localhost:23387/mcp', 'model_fixture': '.../agents/fixtures/test_go_to_semantic_location.json', 'system_prompt': None}
        agent_transport = <dimos.core.transport.pLCMTransport object at 0xff22cdaae5d0>
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_navigation.FakeCamera'>, stream...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        blueprints = [Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_navigation.FakeCamera'>, strea...obal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())]
        coordinator = None
        finished_event = <threading.Event at 0xff22cdaad550: unset>
        finished_transport = <dimos.core.transport.pLCMTransport object at 0xff22cdd1e000>
        fixture    = None
        fixture_path = PosixPath('.../agents/fixtures/test_go_to_semantic_location.json')
        history    = []
        lcm_url    = 'udpm://239.255.76.67:11087?ttl=0'
        mcp_url    = 'http://localhost:23387/mcp'
        messages   = [HumanMessage(content='Go to the bookshelf. Use the navigate_with_text tool.', additional_kwargs={}, response_metadata={})]
        on_message = <function agent_setup.<locals>.fn.<locals>.on_message at 0xff22cd87b560>
        recording  = False
        request    = <SubRequest 'agent_setup' for <Function test_go_to_semantic_location>>
        system_prompt = None
        transports = [<dimos.core.transport.pLCMTransport object at 0xff22cdaae5d0>, <dimos.core.transport.pLCMTransport object at 0xff22cdd1e000>]
        unsubs     = [<function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff22cd879080>, <function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff22cc229580>]
.../core/coordination/module_coordinator.py:368: in build
    coordinator.start_all_modules()
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_navigation.FakeCamera'>, stream...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        cls        = <class 'dimos.core.coordination.module_coordinator.ModuleCoordinator'>
        coordinator = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff22cda8eb40>
        global_values = {}
        module_kwargs = {}
        parsed_config = None
        transport_overrides = {}
        transports = {}
.../core/coordination/module_coordinator.py:259: in start_all_modules
    self._send_on_system_modules()
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff22cda82990>, <dimos.core.rpc_client.RPCClient object at 0xff22cda82390...s.core.rpc_client.RPCClient object at 0xff22cda984d0>, <dimos.core.rpc_client.RPCClient object at 0xff22cda98c50>, ...]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff22cda8eb40>
.../core/coordination/module_coordinator.py:299: in _send_on_system_modules
    module.on_system_modules(modules)
        module     = <dimos.core.rpc_client.RPCClient object at 0xff22cdb32450>
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff22cda82990>, <dimos.core.rpc_client.RPCClient object at 0xff22cda82390...s.core.rpc_client.RPCClient object at 0xff22cda984d0>, <dimos.core.rpc_client.RPCClient object at 0xff22cda98c50>, ...]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff22cda8eb40>
dimos/core/rpc_client.py:93: in __call__
    result, unsub_fn = self._rpc.call_sync(
        args       = ([<dimos.core.rpc_client.RPCClient object at 0xff22cda82990>, <dimos.core.rpc_client.RPCClient object at 0xff22cda8239...core.rpc_client.RPCClient object at 0xff22cda984d0>, <dimos.core.rpc_client.RPCClient object at 0xff22cda98c50>, ...],)
        kwargs     = {}
        self       = <dimos.core.rpc_client.RpcCall object at 0xff22cda9ae10>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff22cdb311f0>
name = 'McpClient/on_system_modules'
arguments = (([<dimos.core.rpc_client.RPCClient object at 0xff22cda82990>, <dimos.core.rpc_client.RPCClient object at 0xff22cda823...rpc_client.RPCClient object at 0xff22cda984d0>, <dimos.core.rpc_client.RPCClient object at 0xff22cda98c50>, ...],), {})
rpc_timeout = 120.0

    def call_sync(
        self, name: str, arguments: Args, rpc_timeout: float | None = None
    ) -> tuple[Any, Callable[[], None]]:
        if rpc_timeout is None:
            method = name.rsplit("/", 1)[-1]
            rpc_timeout = self.rpc_timeouts.get(name) or self.rpc_timeouts.get(
                method, self.default_rpc_timeout
            )
        event = threading.Event()
    
        def receive_value(val) -> None:  # type: ignore[no-untyped-def]
            event.result = val  # type: ignore[attr-defined]  # attach to event
            event.set()
    
        unsub_fn = self.call(name, arguments, receive_value)
        if not event.wait(rpc_timeout):
            # Retries register new callbacks. Remove this expired callback so
            # repeated timeouts do not accumulate entries in the shared response map.
            unsub_fn()
            raise TimeoutError(f"RPC call to '{name}' timed out after {rpc_timeout} seconds")
    
        # Check if the result is an exception and raise it
        result = event.result  # type: ignore[attr-defined]
        if isinstance(result, BaseException):
>           raise result
E           RuntimeError: Failed to fetch tools from MCP server http://localhost:23387/mcp

arguments  = (([<dimos.core.rpc_client.RPCClient object at 0xff22cda82990>, <dimos.core.rpc_client.RPCClient object at 0xff22cda823...rpc_client.RPCClient object at 0xff22cda984d0>, <dimos.core.rpc_client.RPCClient object at 0xff22cda98c50>, ...],), {})
event      = <threading.Event at 0xff22ce901fd0: set>
method     = 'on_system_modules'
name       = 'McpClient/on_system_modules'
receive_value = <function RPCClient.call_sync.<locals>.receive_value at 0xff22cc22ba60>
result     = RuntimeError('Failed to fetch tools from MCP server http://localhost:23387/mcp')
rpc_timeout = 120.0
self       = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff22cdb311f0>
unsub_fn   = <function PubSubRPCMixin.call_cb.<locals>.unsubscribe_callback at 0xff22cc0cd260>

.../protocol/rpc/spec.py:88: RuntimeError
dimos.agents.skills.test_navigation::test_start_exploration
Stack Traces | 67.8s run time
dimos.protocol.rpc.rpc_utils.RemoteError: [Remote builtins.RuntimeError] Failed to fetch tools from MCP server http://localhost:23387/mcp

Remote traceback:
Traceback (most recent call last):
  File ".../protocol/rpc/pubsubrpc.py", line 280, in execute_and_respond
    response = f(*args[0], **args[1])
               ^^^^^^^^^^^^^^^^^^^^^^
  File ".../protocol/rpc/spec.py", line 116, in override_f
    return getattr(module, fname)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 229, in on_system_modules
    tools = self._fetch_tools()
            ^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 152, in _fetch_tools
    raise RuntimeError(
RuntimeError: Failed to fetch tools from MCP server http://localhost:23387/mcp


The above exception was the direct cause of the following exception:

agent_setup = <function agent_setup.<locals>.fn at 0xff22cd838400>

    def test_start_exploration(agent_setup) -> None:
>       history = agent_setup(
            blueprints=[
                FakeCamera.blueprint(),
                FakeOdom.blueprint(),
                MockedExploreNavSkill.blueprint(),
                *_STUB_BLUEPRINTS,
            ],
            messages=[
                HumanMessage("Take a look around for 10 seconds. Use the start_exploration tool.")
            ],
        )

agent_setup = <function agent_setup.<locals>.fn at 0xff22cd838400>

.../agents/skills/test_navigation.py:135: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/agents/conftest.py:90: in fn
    coordinator = ModuleCoordinator.build(blueprint)
        agent_kwargs = {'mcp_server_url': 'http://localhost:23387/mcp', 'model_fixture': '.../agents/fixtures/test_start_exploration.json', 'system_prompt': None}
        agent_transport = <dimos.core.transport.pLCMTransport object at 0xff22cda98d40>
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_navigation.FakeCamera'>, stream...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        blueprints = [Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_navigation.FakeCamera'>, strea...obal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())]
        coordinator = None
        finished_event = <threading.Event at 0xff22cda9a3c0: unset>
        finished_transport = <dimos.core.transport.pLCMTransport object at 0xff22cda99820>
        fixture    = None
        fixture_path = PosixPath('.../agents/fixtures/test_start_exploration.json')
        history    = []
        lcm_url    = 'udpm://239.255.76.67:11087?ttl=0'
        mcp_url    = 'http://localhost:23387/mcp'
        messages   = [HumanMessage(content='Take a look around for 10 seconds. Use the start_exploration tool.', additional_kwargs={}, response_metadata={})]
        on_message = <function agent_setup.<locals>.fn.<locals>.on_message at 0xff22cd8382c0>
        recording  = False
        request    = <SubRequest 'agent_setup' for <Function test_start_exploration>>
        system_prompt = None
        transports = [<dimos.core.transport.pLCMTransport object at 0xff22cda98d40>, <dimos.core.transport.pLCMTransport object at 0xff22cda99820>]
        unsubs     = [<function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff22cd838720>, <function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff22cd838ae0>]
.../core/coordination/module_coordinator.py:368: in build
    coordinator.start_all_modules()
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_navigation.FakeCamera'>, stream...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        cls        = <class 'dimos.core.coordination.module_coordinator.ModuleCoordinator'>
        coordinator = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff22cda9b140>
        global_values = {}
        module_kwargs = {}
        parsed_config = None
        transport_overrides = {}
        transports = {}
.../core/coordination/module_coordinator.py:259: in start_all_modules
    self._send_on_system_modules()
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff22ce8ed040>, <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed220...s.core.rpc_client.RPCClient object at 0xff22cdd1e330>, <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed1f0>, ...]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff22cda9b140>
.../core/coordination/module_coordinator.py:299: in _send_on_system_modules
    module.on_system_modules(modules)
        module     = <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed490>
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff22ce8ed040>, <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed220...s.core.rpc_client.RPCClient object at 0xff22cdd1e330>, <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed1f0>, ...]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff22cda9b140>
dimos/core/rpc_client.py:93: in __call__
    result, unsub_fn = self._rpc.call_sync(
        args       = ([<dimos.core.rpc_client.RPCClient object at 0xff22ce8ed040>, <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed22...core.rpc_client.RPCClient object at 0xff22cdd1e330>, <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed1f0>, ...],)
        kwargs     = {}
        self       = <dimos.core.rpc_client.RpcCall object at 0xff22cdcb6c90>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff22cdf67770>
name = 'McpClient/on_system_modules'
arguments = (([<dimos.core.rpc_client.RPCClient object at 0xff22ce8ed040>, <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed2...rpc_client.RPCClient object at 0xff22cdd1e330>, <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed1f0>, ...],), {})
rpc_timeout = 120.0

    def call_sync(
        self, name: str, arguments: Args, rpc_timeout: float | None = None
    ) -> tuple[Any, Callable[[], None]]:
        if rpc_timeout is None:
            method = name.rsplit("/", 1)[-1]
            rpc_timeout = self.rpc_timeouts.get(name) or self.rpc_timeouts.get(
                method, self.default_rpc_timeout
            )
        event = threading.Event()
    
        def receive_value(val) -> None:  # type: ignore[no-untyped-def]
            event.result = val  # type: ignore[attr-defined]  # attach to event
            event.set()
    
        unsub_fn = self.call(name, arguments, receive_value)
        if not event.wait(rpc_timeout):
            # Retries register new callbacks. Remove this expired callback so
            # repeated timeouts do not accumulate entries in the shared response map.
            unsub_fn()
            raise TimeoutError(f"RPC call to '{name}' timed out after {rpc_timeout} seconds")
    
        # Check if the result is an exception and raise it
        result = event.result  # type: ignore[attr-defined]
        if isinstance(result, BaseException):
>           raise result
E           RuntimeError: Failed to fetch tools from MCP server http://localhost:23387/mcp

arguments  = (([<dimos.core.rpc_client.RPCClient object at 0xff22ce8ed040>, <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed2...rpc_client.RPCClient object at 0xff22cdd1e330>, <dimos.core.rpc_client.RPCClient object at 0xff22ce8ed1f0>, ...],), {})
event      = <threading.Event at 0xff22cdd1e210: set>
method     = 'on_system_modules'
name       = 'McpClient/on_system_modules'
receive_value = <function RPCClient.call_sync.<locals>.receive_value at 0xff22cd83b9c0>
result     = RuntimeError('Failed to fetch tools from MCP server http://localhost:23387/mcp')
rpc_timeout = 120.0
self       = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff22cdf67770>
unsub_fn   = <function PubSubRPCMixin.call_cb.<locals>.unsubscribe_callback at 0xff22cd8440e0>

.../protocol/rpc/spec.py:88: RuntimeError
dimos.agents.skills.test_unitree_skill_container::test_pounce
Stack Traces | 69.1s run time
dimos.protocol.rpc.rpc_utils.RemoteError: [Remote builtins.RuntimeError] Failed to fetch tools from MCP server http://localhost:24932/mcp

Remote traceback:
Traceback (most recent call last):
  File ".../protocol/rpc/pubsubrpc.py", line 280, in execute_and_respond
    response = f(*args[0], **args[1])
               ^^^^^^^^^^^^^^^^^^^^^^
  File ".../protocol/rpc/spec.py", line 116, in override_f
    return getattr(module, fname)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 229, in on_system_modules
    tools = self._fetch_tools()
            ^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 152, in _fetch_tools
    raise RuntimeError(
RuntimeError: Failed to fetch tools from MCP server http://localhost:24932/mcp


The above exception was the direct cause of the following exception:

agent_setup = <function agent_setup.<locals>.fn at 0xff4d2bddaa20>

    def test_pounce(agent_setup) -> None:
>       history = agent_setup(
            blueprints=[
                MockedUnitreeSkill.blueprint(),
                StubNavigation.blueprint(),
                StubGO2Connection.blueprint(),
            ],
            messages=[HumanMessage("Pounce! Use the execute_sport_command tool.")],
        )

agent_setup = <function agent_setup.<locals>.fn at 0xff4d2bddaa20>

.../agents/skills/test_unitree_skill_container.py:56: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/agents/conftest.py:90: in fn
    coordinator = ModuleCoordinator.build(blueprint)
        agent_kwargs = {'mcp_server_url': 'http://localhost:24932/mcp', 'model_fixture': '.../agents/fixtures/test_pounce.json', 'system_prompt': None}
        agent_transport = <dimos.core.transport.pLCMTransport object at 0xff4c40305d60>
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_unitree_skill_container.MockedU...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        blueprints = [Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_unitree_skill_container.Mocked...obal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())]
        coordinator = None
        finished_event = <threading.Event at 0xff4c403071a0: unset>
        finished_transport = <dimos.core.transport.pLCMTransport object at 0xff4d2bdb8d10>
        fixture    = None
        fixture_path = PosixPath('.../agents/fixtures/test_pounce.json')
        history    = []
        lcm_url    = 'udpm://239.255.76.67:12632?ttl=0'
        mcp_url    = 'http://localhost:24932/mcp'
        messages   = [HumanMessage(content='Pounce! Use the execute_sport_command tool.', additional_kwargs={}, response_metadata={})]
        on_message = <function agent_setup.<locals>.fn.<locals>.on_message at 0xff4d2bdd8ae0>
        recording  = False
        request    = <SubRequest 'agent_setup' for <Function test_pounce>>
        system_prompt = None
        transports = [<dimos.core.transport.pLCMTransport object at 0xff4c40305d60>, <dimos.core.transport.pLCMTransport object at 0xff4d2bdb8d10>]
        unsubs     = [<function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff4c403c13a0>, <function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff4c403c14e0>]
.../core/coordination/module_coordinator.py:368: in build
    coordinator.start_all_modules()
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_unitree_skill_container.MockedU...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        cls        = <class 'dimos.core.coordination.module_coordinator.ModuleCoordinator'>
        coordinator = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff4d2bf0f470>
        global_values = {}
        module_kwargs = {}
        parsed_config = None
        transport_overrides = {}
        transports = {}
.../core/coordination/module_coordinator.py:259: in start_all_modules
    self._send_on_system_modules()
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff4c49dbf830>, <dimos.core.rpc_client.RPCClient object at 0xff4c4028e5d0...<dimos.core.rpc_client.RPCClient object at 0xff4d2bf0dac0>, <dimos.core.rpc_client.RPCClient object at 0xff4d2c326510>]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff4d2bf0f470>
.../core/coordination/module_coordinator.py:299: in _send_on_system_modules
    module.on_system_modules(modules)
        module     = <dimos.core.rpc_client.RPCClient object at 0xff4d2bf0dac0>
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff4c49dbf830>, <dimos.core.rpc_client.RPCClient object at 0xff4c4028e5d0...<dimos.core.rpc_client.RPCClient object at 0xff4d2bf0dac0>, <dimos.core.rpc_client.RPCClient object at 0xff4d2c326510>]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff4d2bf0f470>
dimos/core/rpc_client.py:93: in __call__
    result, unsub_fn = self._rpc.call_sync(
        args       = ([<dimos.core.rpc_client.RPCClient object at 0xff4c49dbf830>, <dimos.core.rpc_client.RPCClient object at 0xff4c4028e5d...imos.core.rpc_client.RPCClient object at 0xff4d2bf0dac0>, <dimos.core.rpc_client.RPCClient object at 0xff4d2c326510>],)
        kwargs     = {}
        self       = <dimos.core.rpc_client.RpcCall object at 0xff4c40305b20>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff4d2c325610>
name = 'McpClient/on_system_modules'
arguments = (([<dimos.core.rpc_client.RPCClient object at 0xff4c49dbf830>, <dimos.core.rpc_client.RPCClient object at 0xff4c4028e5...core.rpc_client.RPCClient object at 0xff4d2bf0dac0>, <dimos.core.rpc_client.RPCClient object at 0xff4d2c326510>],), {})
rpc_timeout = 120.0

    def call_sync(
        self, name: str, arguments: Args, rpc_timeout: float | None = None
    ) -> tuple[Any, Callable[[], None]]:
        if rpc_timeout is None:
            method = name.rsplit("/", 1)[-1]
            rpc_timeout = self.rpc_timeouts.get(name) or self.rpc_timeouts.get(
                method, self.default_rpc_timeout
            )
        event = threading.Event()
    
        def receive_value(val) -> None:  # type: ignore[no-untyped-def]
            event.result = val  # type: ignore[attr-defined]  # attach to event
            event.set()
    
        unsub_fn = self.call(name, arguments, receive_value)
        if not event.wait(rpc_timeout):
            # Retries register new callbacks. Remove this expired callback so
            # repeated timeouts do not accumulate entries in the shared response map.
            unsub_fn()
            raise TimeoutError(f"RPC call to '{name}' timed out after {rpc_timeout} seconds")
    
        # Check if the result is an exception and raise it
        result = event.result  # type: ignore[attr-defined]
        if isinstance(result, BaseException):
>           raise result
E           RuntimeError: Failed to fetch tools from MCP server http://localhost:24932/mcp

arguments  = (([<dimos.core.rpc_client.RPCClient object at 0xff4c49dbf830>, <dimos.core.rpc_client.RPCClient object at 0xff4c4028e5...core.rpc_client.RPCClient object at 0xff4d2bf0dac0>, <dimos.core.rpc_client.RPCClient object at 0xff4d2c326510>],), {})
event      = <threading.Event at 0xff4d2bd9c5c0: set>
method     = 'on_system_modules'
name       = 'McpClient/on_system_modules'
receive_value = <function RPCClient.call_sync.<locals>.receive_value at 0xff4c403c1da0>
result     = RuntimeError('Failed to fetch tools from MCP server http://localhost:24932/mcp')
rpc_timeout = 120.0
self       = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff4d2c325610>
unsub_fn   = <function PubSubRPCMixin.call_cb.<locals>.unsubscribe_callback at 0xff4c402ac2c0>

.../protocol/rpc/spec.py:88: RuntimeError
dimos.agents.skills.test_navigation::test_stop_movement
Stack Traces | 71.1s run time
dimos.protocol.rpc.rpc_utils.RemoteError: [Remote builtins.RuntimeError] Failed to fetch tools from MCP server http://localhost:23387/mcp

Remote traceback:
Traceback (most recent call last):
  File ".../protocol/rpc/pubsubrpc.py", line 280, in execute_and_respond
    response = f(*args[0], **args[1])
               ^^^^^^^^^^^^^^^^^^^^^^
  File ".../protocol/rpc/spec.py", line 116, in override_f
    return getattr(module, fname)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 229, in on_system_modules
    tools = self._fetch_tools()
            ^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 152, in _fetch_tools
    raise RuntimeError(
RuntimeError: Failed to fetch tools from MCP server http://localhost:23387/mcp


The above exception was the direct cause of the following exception:

agent_setup = <function agent_setup.<locals>.fn at 0xff22cc22a700>

    def test_stop_movement(agent_setup) -> None:
>       history = agent_setup(
            blueprints=[
                FakeCamera.blueprint(),
                FakeOdom.blueprint(),
                MockedStopNavSkill.blueprint(),
                *_STUB_BLUEPRINTS,
            ],
            messages=[HumanMessage("Stop moving. Use the stop_movement tool.")],
        )

agent_setup = <function agent_setup.<locals>.fn at 0xff22cc22a700>

.../agents/skills/test_navigation.py:121: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/agents/conftest.py:90: in fn
    coordinator = ModuleCoordinator.build(blueprint)
        agent_kwargs = {'mcp_server_url': 'http://localhost:23387/mcp', 'model_fixture': '.../agents/fixtures/test_stop_movement.json', 'system_prompt': None}
        agent_transport = <dimos.core.transport.pLCMTransport object at 0xff22cda98e90>
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_navigation.FakeCamera'>, stream...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        blueprints = [Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_navigation.FakeCamera'>, strea...obal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())]
        coordinator = None
        finished_event = <threading.Event at 0xff22cda9b830: unset>
        finished_transport = <dimos.core.transport.pLCMTransport object at 0xff22cda8e150>
        fixture    = None
        fixture_path = PosixPath('.../agents/fixtures/test_stop_movement.json')
        history    = []
        lcm_url    = 'udpm://239.255.76.67:11087?ttl=0'
        mcp_url    = 'http://localhost:23387/mcp'
        messages   = [HumanMessage(content='Stop moving. Use the stop_movement tool.', additional_kwargs={}, response_metadata={})]
        on_message = <function agent_setup.<locals>.fn.<locals>.on_message at 0xff22cc229e40>
        recording  = False
        request    = <SubRequest 'agent_setup' for <Function test_stop_movement>>
        system_prompt = None
        transports = [<dimos.core.transport.pLCMTransport object at 0xff22cda98e90>, <dimos.core.transport.pLCMTransport object at 0xff22cda8e150>]
        unsubs     = [<function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff22cc229d00>, <function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff22cc229120>]
.../core/coordination/module_coordinator.py:368: in build
    coordinator.start_all_modules()
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_navigation.FakeCamera'>, stream...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        cls        = <class 'dimos.core.coordination.module_coordinator.ModuleCoordinator'>
        coordinator = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff22cdaafa40>
        global_values = {}
        module_kwargs = {}
        parsed_config = None
        transport_overrides = {}
        transports = {}
.../core/coordination/module_coordinator.py:259: in start_all_modules
    self._send_on_system_modules()
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff22cd30b230>, <dimos.core.rpc_client.RPCClient object at 0xff22cd308c80...s.core.rpc_client.RPCClient object at 0xff22cd30b440>, <dimos.core.rpc_client.RPCClient object at 0xff22cd308560>, ...]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff22cdaafa40>
.../core/coordination/module_coordinator.py:299: in _send_on_system_modules
    module.on_system_modules(modules)
        module     = <dimos.core.rpc_client.RPCClient object at 0xff22cd308530>
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff22cd30b230>, <dimos.core.rpc_client.RPCClient object at 0xff22cd308c80...s.core.rpc_client.RPCClient object at 0xff22cd30b440>, <dimos.core.rpc_client.RPCClient object at 0xff22cd308560>, ...]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff22cdaafa40>
dimos/core/rpc_client.py:93: in __call__
    result, unsub_fn = self._rpc.call_sync(
        args       = ([<dimos.core.rpc_client.RPCClient object at 0xff22cd30b230>, <dimos.core.rpc_client.RPCClient object at 0xff22cd308c8...core.rpc_client.RPCClient object at 0xff22cd30b440>, <dimos.core.rpc_client.RPCClient object at 0xff22cd308560>, ...],)
        kwargs     = {}
        self       = <dimos.core.rpc_client.RpcCall object at 0xff22cd30b530>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff22cdaafa10>
name = 'McpClient/on_system_modules'
arguments = (([<dimos.core.rpc_client.RPCClient object at 0xff22cd30b230>, <dimos.core.rpc_client.RPCClient object at 0xff22cd308c...rpc_client.RPCClient object at 0xff22cd30b440>, <dimos.core.rpc_client.RPCClient object at 0xff22cd308560>, ...],), {})
rpc_timeout = 120.0

    def call_sync(
        self, name: str, arguments: Args, rpc_timeout: float | None = None
    ) -> tuple[Any, Callable[[], None]]:
        if rpc_timeout is None:
            method = name.rsplit("/", 1)[-1]
            rpc_timeout = self.rpc_timeouts.get(name) or self.rpc_timeouts.get(
                method, self.default_rpc_timeout
            )
        event = threading.Event()
    
        def receive_value(val) -> None:  # type: ignore[no-untyped-def]
            event.result = val  # type: ignore[attr-defined]  # attach to event
            event.set()
    
        unsub_fn = self.call(name, arguments, receive_value)
        if not event.wait(rpc_timeout):
            # Retries register new callbacks. Remove this expired callback so
            # repeated timeouts do not accumulate entries in the shared response map.
            unsub_fn()
            raise TimeoutError(f"RPC call to '{name}' timed out after {rpc_timeout} seconds")
    
        # Check if the result is an exception and raise it
        result = event.result  # type: ignore[attr-defined]
        if isinstance(result, BaseException):
>           raise result
E           RuntimeError: Failed to fetch tools from MCP server http://localhost:23387/mcp

arguments  = (([<dimos.core.rpc_client.RPCClient object at 0xff22cd30b230>, <dimos.core.rpc_client.RPCClient object at 0xff22cd308c...rpc_client.RPCClient object at 0xff22cd30b440>, <dimos.core.rpc_client.RPCClient object at 0xff22cd308560>, ...],), {})
event      = <threading.Event at 0xff22cda71460: set>
method     = 'on_system_modules'
name       = 'McpClient/on_system_modules'
receive_value = <function RPCClient.call_sync.<locals>.receive_value at 0xff22cc22a200>
result     = RuntimeError('Failed to fetch tools from MCP server http://localhost:23387/mcp')
rpc_timeout = 120.0
self       = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff22cdaafa10>
unsub_fn   = <function PubSubRPCMixin.call_cb.<locals>.unsubscribe_callback at 0xff22cd87b420>

.../protocol/rpc/spec.py:88: RuntimeError
dimos.agents.skills.test_google_maps_skill_container::test_where_am_i
Stack Traces | 72.4s run time
dimos.protocol.rpc.rpc_utils.RemoteError: [Remote builtins.RuntimeError] Failed to fetch tools from MCP server http://localhost:24932/mcp

Remote traceback:
Traceback (most recent call last):
  File ".../protocol/rpc/pubsubrpc.py", line 280, in execute_and_respond
    response = f(*args[0], **args[1])
               ^^^^^^^^^^^^^^^^^^^^^^
  File ".../protocol/rpc/spec.py", line 116, in override_f
    return getattr(module, fname)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 229, in on_system_modules
    tools = self._fetch_tools()
            ^^^^^^^^^^^^^^^^^^^
  File ".../agents/mcp/mcp_client.py", line 152, in _fetch_tools
    raise RuntimeError(
RuntimeError: Failed to fetch tools from MCP server http://localhost:24932/mcp


The above exception was the direct cause of the following exception:

agent_setup = <function agent_setup.<locals>.fn at 0xff4c403c13a0>

    def test_where_am_i(agent_setup) -> None:
>       history = agent_setup(
            blueprints=[FakeGPS.blueprint(), MockedWhereAmISkill.blueprint()],
            messages=[HumanMessage("What street am I on? Use the where_am_i tool.")],
        )

agent_setup = <function agent_setup.<locals>.fn at 0xff4c403c13a0>

.../agents/skills/test_google_maps_skill_container.py:74: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/agents/conftest.py:90: in fn
    coordinator = ModuleCoordinator.build(blueprint)
        agent_kwargs = {'mcp_server_url': 'http://localhost:24932/mcp', 'model_fixture': '.../agents/fixtures/test_where_am_i.json', 'system_prompt': None}
        agent_transport = <dimos.core.transport.pLCMTransport object at 0xff4d2bd9d6d0>
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_google_maps_skill_container.Fak...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        blueprints = [Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_google_maps_skill_container.Fa...obal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())]
        coordinator = None
        finished_event = <threading.Event at 0xff4d2bd9f8f0: unset>
        finished_transport = <dimos.core.transport.pLCMTransport object at 0xff4d2bd9ed50>
        fixture    = None
        fixture_path = PosixPath('.../agents/fixtures/test_where_am_i.json')
        history    = []
        lcm_url    = 'udpm://239.255.76.67:12632?ttl=0'
        mcp_url    = 'http://localhost:24932/mcp'
        messages   = [HumanMessage(content='What street am I on? Use the where_am_i tool.', additional_kwargs={}, response_metadata={})]
        on_message = <function agent_setup.<locals>.fn.<locals>.on_message at 0xff4c403c0180>
        recording  = False
        request    = <SubRequest 'agent_setup' for <Function test_where_am_i>>
        system_prompt = None
        transports = [<dimos.core.transport.pLCMTransport object at 0xff4d2bd9d6d0>, <dimos.core.transport.pLCMTransport object at 0xff4d2bd9ed50>]
        unsubs     = [<function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff4c403c0d60>, <function LCMPubSubBase.subscribe.<locals>.unsubscribe at 0xff4c403c1440>]
.../core/coordination/module_coordinator.py:368: in build
    coordinator.start_all_modules()
        blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.agents.skills.test_google_maps_skill_container.Fak...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        cls        = <class 'dimos.core.coordination.module_coordinator.ModuleCoordinator'>
        coordinator = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff4d2e2b9250>
        global_values = {}
        module_kwargs = {}
        parsed_config = None
        transport_overrides = {}
        transports = {}
.../core/coordination/module_coordinator.py:259: in start_all_modules
    self._send_on_system_modules()
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff4c49d52150>, <dimos.core.rpc_client.RPCClient object at 0xff4d2be33260...<dimos.core.rpc_client.RPCClient object at 0xff4d2e340c50>, <dimos.core.rpc_client.RPCClient object at 0xff4c4028cd10>]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff4d2e2b9250>
.../core/coordination/module_coordinator.py:299: in _send_on_system_modules
    module.on_system_modules(modules)
        module     = <dimos.core.rpc_client.RPCClient object at 0xff4d2e340c50>
        modules    = [<dimos.core.rpc_client.RPCClient object at 0xff4c49d52150>, <dimos.core.rpc_client.RPCClient object at 0xff4d2be33260...<dimos.core.rpc_client.RPCClient object at 0xff4d2e340c50>, <dimos.core.rpc_client.RPCClient object at 0xff4c4028cd10>]
        self       = <dimos.core.coordination.module_coordinator.ModuleCoordinator object at 0xff4d2e2b9250>
dimos/core/rpc_client.py:93: in __call__
    result, unsub_fn = self._rpc.call_sync(
        args       = ([<dimos.core.rpc_client.RPCClient object at 0xff4c49d52150>, <dimos.core.rpc_client.RPCClient object at 0xff4d2be3326...imos.core.rpc_client.RPCClient object at 0xff4d2e340c50>, <dimos.core.rpc_client.RPCClient object at 0xff4c4028cd10>],)
        kwargs     = {}
        self       = <dimos.core.rpc_client.RpcCall object at 0xff4d2e35c2f0>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff4d2be30260>
name = 'McpClient/on_system_modules'
arguments = (([<dimos.core.rpc_client.RPCClient object at 0xff4c49d52150>, <dimos.core.rpc_client.RPCClient object at 0xff4d2be332...core.rpc_client.RPCClient object at 0xff4d2e340c50>, <dimos.core.rpc_client.RPCClient object at 0xff4c4028cd10>],), {})
rpc_timeout = 120.0

    def call_sync(
        self, name: str, arguments: Args, rpc_timeout: float | None = None
    ) -> tuple[Any, Callable[[], None]]:
        if rpc_timeout is None:
            method = name.rsplit("/", 1)[-1]
            rpc_timeout = self.rpc_timeouts.get(name) or self.rpc_timeouts.get(
                method, self.default_rpc_timeout
            )
        event = threading.Event()
    
        def receive_value(val) -> None:  # type: ignore[no-untyped-def]
            event.result = val  # type: ignore[attr-defined]  # attach to event
            event.set()
    
        unsub_fn = self.call(name, arguments, receive_value)
        if not event.wait(rpc_timeout):
            # Retries register new callbacks. Remove this expired callback so
            # repeated timeouts do not accumulate entries in the shared response map.
            unsub_fn()
            raise TimeoutError(f"RPC call to '{name}' timed out after {rpc_timeout} seconds")
    
        # Check if the result is an exception and raise it
        result = event.result  # type: ignore[attr-defined]
        if isinstance(result, BaseException):
>           raise result
E           RuntimeError: Failed to fetch tools from MCP server http://localhost:24932/mcp

arguments  = (([<dimos.core.rpc_client.RPCClient object at 0xff4c49d52150>, <dimos.core.rpc_client.RPCClient object at 0xff4d2be332...core.rpc_client.RPCClient object at 0xff4d2e340c50>, <dimos.core.rpc_client.RPCClient object at 0xff4c4028cd10>],), {})
event      = <threading.Event at 0xff4d2bdca330: set>
method     = 'on_system_modules'
name       = 'McpClient/on_system_modules'
receive_value = <function RPCClient.call_sync.<locals>.receive_value at 0xff4c403c00e0>
result     = RuntimeError('Failed to fetch tools from MCP server http://localhost:24932/mcp')
rpc_timeout = 120.0
self       = <dimos.protocol.rpc.pubsubrpc.LCMRPC object at 0xff4d2be30260>
unsub_fn   = <function PubSubRPCMixin.call_cb.<locals>.unsubscribe_callback at 0xff4d2bddb420>

.../protocol/rpc/spec.py:88: RuntimeError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant