Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
471 commits
Select commit Hold shift + click to select a range
0082cca
fix: preserve RpcCall._timeout across pickle (rpc_calls)
jeff-hykin Mar 14, 2026
7f0dbd3
test: add goal navigation and agentic integration tests for ROSNav
jeff-hykin Mar 14, 2026
9ac3945
fix: mark start pose immediately in agentic test
jeff-hykin Mar 14, 2026
1ec4227
fix(deps): skip pyrealsense2 on macOS (#1556)
jeff-hykin Mar 14, 2026
178feca
works, could use a bit of cleaning
jeff-hykin Mar 14, 2026
05dd65a
add g1_nav_onboard blueprint
jeff-hykin Mar 14, 2026
8fb6b7c
g1_nav_onboard: use rosnav lidar IPs, set vehicleHeight=1.2
jeff-hykin Mar 14, 2026
d0cfc0d
hardware setup
jeff-hykin Mar 14, 2026
a07e9f2
-
jeff-hykin Mar 15, 2026
46365ba
better logging
jeff-hykin Mar 15, 2026
2266139
fix path
jeff-hykin Mar 15, 2026
0da363f
better lidar ip error
jeff-hykin Mar 15, 2026
af40b77
default
jeff-hykin Mar 15, 2026
cbc4617
fix: address review comments on hello_docker example
jeff-hykin Mar 15, 2026
b3177fd
Feat/memory2 (#1536)
leshy Mar 15, 2026
8ecd772
Merge dev into jeff/fix/rosnav4
jeff-hykin Mar 15, 2026
42366e1
fix: resolve merge conflict with dev (uv.lock)
jeff-hykin Mar 15, 2026
e6267e1
docs(readme): add Trendshift trending badge (#1563)
spomichter Mar 15, 2026
8b3bbc5
fixup agentic test
jeff-hykin Mar 15, 2026
780736c
make timeout not hardcoded
jeff-hykin Mar 15, 2026
66a6567
docs: add clarifying comment for deploy_parallel lambda tuple
jeff-hykin Mar 15, 2026
1d3f123
feat: port rpc_timeouts system from jeff/fix/rosnav3
jeff-hykin Mar 15, 2026
cc2212c
Merge branch 'jeff/fix/docker3' of github.com:dimensionalOS/dimos int…
jeff-hykin Mar 15, 2026
747bbe2
CI code cleanup
jeff-hykin Mar 15, 2026
c2d2643
fixup rpc timeouts, cause they matter for docker
jeff-hykin Mar 15, 2026
427949f
Merge branch 'dev' of github.com:dimensionalOS/dimos into jeff/fix/do…
jeff-hykin Mar 15, 2026
54d4592
better matching logic for rpc_timeouts
jeff-hykin Mar 15, 2026
1598545
enforce RPCSpec's to have rpc_timeouts in constructor
jeff-hykin Mar 15, 2026
8a36843
Remove pr-name-check from this branch
jeff-hykin Mar 15, 2026
7ad090f
fixup rpc timeouts
jeff-hykin Mar 15, 2026
d0563a8
mypy issue on dev
jeff-hykin Mar 15, 2026
639e90c
equality
jeff-hykin Mar 15, 2026
5a41e06
Merge branch 'jeff/fix/docker3' of github.com:dimensionalOS/dimos int…
jeff-hykin Mar 15, 2026
646e54f
might revert, debugging onboard g1
jeff-hykin Mar 15, 2026
8b5a71e
-
jeff-hykin Mar 15, 2026
5c85dc2
fix: docker module init + rpc timeout bugs
jeff-hykin Mar 15, 2026
d2e9446
feat(native): add rebuild-on-change for NativeModule
jeff-hykin Mar 15, 2026
9668e3a
fix(example): use 'cowsay' not '/usr/games/cowsay' per review
jeff-hykin Mar 15, 2026
9486a90
fix(ci): limit tests to 60 minutes max (#1557)
paul-nechifor Mar 16, 2026
90b15d3
Merge remote-tracking branch 'origin/jeff/feat/native_rebuild' into j…
jeff-hykin Mar 16, 2026
798b183
feat: add rebuild_on_change to all smartnav native modules
jeff-hykin Mar 16, 2026
3a5f000
fix(old-scripts): remove (#1561)
paul-nechifor Mar 16, 2026
ab081c1
docs: add Spec issue template (#1574)
spomichter Mar 16, 2026
fdcd2d8
python 3.10 typing issue
jeff-hykin Mar 16, 2026
fba0a71
CI code cleanup
jeff-hykin Mar 16, 2026
bc5b44b
fix: resolve relative rebuild_on_change paths against module cwd and …
jeff-hykin Mar 16, 2026
f2b7b0a
improve native build
jeff-hykin Mar 16, 2026
8299e74
pgo global map working
jeff-hykin Mar 16, 2026
e95e0d7
feat(patrol): add patrolling module (#1488)
paul-nechifor Mar 17, 2026
f6a5602
Merge origin/dev into jeff/fix/docker3
jeff-hykin Mar 17, 2026
18c56ea
CI code cleanup
jeff-hykin Mar 17, 2026
6b6641d
Merge branch 'jeff/fix/docker3' into jeff/fix/rosnav3
jeff-hykin Mar 17, 2026
e01688c
fixup pathing
jeff-hykin Mar 19, 2026
3afde01
fix: rename teleop blueprints, remove VisualizingTeleopModule (#1602)
ruthwikdasyam Mar 19, 2026
c6f1842
feat(test): add leaderboard (#1580)
paul-nechifor Mar 19, 2026
bdd06d4
fix(florence): fix text failure (#1582)
paul-nechifor Mar 19, 2026
b9cca6c
event based sub callback collector for tests (#1605)
leshy Mar 19, 2026
cb648f5
refactor: split control blueprints + added env variables (#1601)
ruthwikdasyam Mar 19, 2026
593c418
fix: address Paul's PR review comments
jeff-hykin Mar 17, 2026
4278166
fix(ci): fix _DummyRPC init and mypy type-ignore for rpc_transport kw…
jeff-hykin Mar 19, 2026
47737b0
fix(mypy): add __all__ to vl/create.py for explicit VlModelName export
jeff-hykin Mar 19, 2026
157ce93
fix(test): wrap coordinator in try/finally for proper cleanup on test…
jeff-hykin Mar 19, 2026
cdac06e
- (#1610)
jeff-hykin Mar 19, 2026
9ec44ec
Merge branch 'jeff/feat/native_rebuild' of github.com:dimensionalOS/d…
jeff-hykin Mar 19, 2026
cb5041b
-
jeff-hykin Mar 19, 2026
c7bc6b4
make all modules local
jeff-hykin Mar 19, 2026
57f6871
clean
jeff-hykin Mar 19, 2026
29253ca
add e2e test
jeff-hykin Mar 19, 2026
07b33dd
add build
jeff-hykin Mar 19, 2026
a5c7ecc
Merge branch 'dev' of github.com:dimensionalOS/dimos into jeff/fix/do…
jeff-hykin Mar 19, 2026
63f02cd
Merge remote-tracking branch 'origin/dev' into jeff/fix/rosnav3
jeff-hykin Mar 19, 2026
7926153
-
jeff-hykin Mar 19, 2026
c8a7b7d
fix(cli): fix `dimos --help` (both bad imports and speed) (#1571)
jeff-hykin Mar 20, 2026
ffd65f1
Merge origin/dev into jeff/fix/docker3
jeff-hykin Mar 20, 2026
dc331b7
chore(blueprints): remove aliases (#1606)
paul-nechifor Mar 20, 2026
30793a5
Merge remote-tracking branch 'origin/dev' into jeff/fix/docker3
jeff-hykin Mar 20, 2026
97b7e0d
fix: thread leak in native module test + show docker pull output
jeff-hykin Mar 20, 2026
fbc146a
CI code cleanup
jeff-hykin Mar 20, 2026
53a2fce
Merge branch 'main' into dev
spomichter Mar 21, 2026
174fcb1
Merge branch 'jeff/fix/docker3' of https://github.com/dimensionalOS/d…
jeff-hykin Mar 21, 2026
d37401a
Merge branch 'dev' of https://github.com/dimensionalOS/dimos into jef…
jeff-hykin Mar 21, 2026
1924b61
Feature: go2 webrtc TwistBase adapter for control coordinator (#1362)
mustafab0 Mar 21, 2026
349fc0b
merge: resolve all_blueprints.py conflict with dev
jeff-hykin Mar 21, 2026
c24c51c
data: add sim assets for xArm6 and Piper (#1642)
ruthwikdasyam Mar 21, 2026
957c26e
switch to websocket
jeff-hykin Mar 21, 2026
bb16ea2
fix(unity-sim): use RerunBridgeModule.blueprint() after rerun_bridge …
jeff-hykin Mar 21, 2026
f5a35bb
cleanup
jeff-hykin Mar 21, 2026
e67ae72
improvements
jeff-hykin Mar 21, 2026
b7bfb40
fix: ruff formatting + consistent error handling in websocket_server
jeff-hykin Mar 21, 2026
885b729
fix: update all_blueprints.py to include unity-bridge-module
jeff-hykin Mar 21, 2026
fe46e82
Merge remote-tracking branch 'origin/dev' into jeff/feat/untiy_sim
jeff-hykin Mar 21, 2026
49c5142
merge: pull latest dev
jeff-hykin Mar 21, 2026
7cbe1b7
make it easy to use
jeff-hykin Mar 21, 2026
0fe29f0
fix: remove @dataclass from UnityBridgeConfig (Pydantic compat), clea…
jeff-hykin Mar 21, 2026
fa94c2e
cleanup
jeff-hykin Mar 21, 2026
42f2f38
consolidate viewer usage
jeff-hykin Mar 22, 2026
23d1d88
consolidate WebsocketVisModule
jeff-hykin Mar 22, 2026
7e69093
MuJoCo sim support for Manipulation (#1639)
ruthwikdasyam Mar 22, 2026
e693ca2
merge: resolve conflict with dev (test_sim_module.py deleted in #1639)
jeff-hykin Mar 22, 2026
b627eb3
Merge branch 'jeff/fix/rosnav3' of github.com:dimensionalOS/dimos int…
jeff-hykin Mar 22, 2026
fbb0ca7
Merge branch 'dev' of github.com:dimensionalOS/dimos into jeff/fix/ro…
jeff-hykin Mar 22, 2026
dd5ff29
Merge branch 'dev' of github.com:dimensionalOS/dimos into jeff/fix/rc…
jeff-hykin Mar 22, 2026
78f6582
style: auto-fix ruff format and json formatting
jeff-hykin Mar 22, 2026
645cb0d
fix: address greptile review comments
jeff-hykin Mar 22, 2026
27e66be
fix: address PR review - server ready race, path filter, skip guard
jeff-hykin Mar 22, 2026
fe84b4d
fix: set explicit ping interval/timeout on WebSocket server
jeff-hykin Mar 22, 2026
eca1705
chore: stage remaining files from dev merge
jeff-hykin Mar 22, 2026
c080036
Merge remote-tracking branch 'origin/jeff/fix/docker3' into jeff/fix/…
jeff-hykin Mar 22, 2026
5d461c6
fix: address all paul-review issues on unity simulator
jeff-hykin Mar 22, 2026
7f8bc12
fix: resolve broken blueprint aliases, RpcCall timeout, and rosnav bugs
jeff-hykin Mar 22, 2026
387b8f1
fix: remove __init__.py (project policy), fix section markers, update…
jeff-hykin Mar 22, 2026
fc65956
Merge remote-tracking branch 'origin/dev' into jeff/feat/untiy_sim
jeff-hykin Mar 22, 2026
c9fac15
Merge remote-tracking branch 'origin/dev' into jeff/feat/native_rebuild
jeff-hykin Mar 22, 2026
d12407a
Merge remote-tracking branch 'origin/dev' into jeff/feat/untiy_sim
jeff-hykin Mar 22, 2026
ff34882
Merge remote-tracking branch 'origin/dev' into jeff/fix/docker3
jeff-hykin Mar 22, 2026
7f8401a
Merge remote-tracking branch 'origin/dev' into jeff/fix/rosnav3
jeff-hykin Mar 22, 2026
ee8e936
chore: regenerate uv.lock after merge with dev
jeff-hykin Mar 22, 2026
f09875c
chore: regenerate uv.lock after merge with dev
jeff-hykin Mar 22, 2026
ebaa672
chore: regenerate uv.lock after merge with dev
jeff-hykin Mar 22, 2026
002a419
fix: resolve merge conflicts + address Paul's review comments
jeff-hykin Mar 22, 2026
9c1a963
fix(g1): send Move() before starting timeout timer
jeff-hykin Mar 22, 2026
317c487
fix(docker): include stdout/stderr in pull error message
jeff-hykin Mar 22, 2026
91a13f1
fix(tests): import ExceptionGroup in test_parallel_deploy_cleanup
jeff-hykin Mar 22, 2026
a194cb9
docs: add changes.md with fix descriptions and revert instructions
jeff-hykin Mar 22, 2026
42f3797
docs: add changes.md with fix descriptions and revert instructions
jeff-hykin Mar 22, 2026
bbd1c27
merge in rconnect
jeff-hykin Mar 22, 2026
182cf28
refactor: remove unnecessary __getstate__/__setstate__ from UnityBrid…
jeff-hykin Mar 22, 2026
9b609bd
fix(unity): launch Unity in thread to avoid blocking start()
jeff-hykin Mar 22, 2026
47d99da
fix(unity): pipe Unity stderr to logger instead of discarding
jeff-hykin Mar 22, 2026
9f0f7b9
fix(unity): clear _unity_ready on disconnect
jeff-hykin Mar 22, 2026
0355176
Merge remote-tracking branch 'origin/jeff/feat/untiy_sim' into jeff/f…
jeff-hykin Mar 22, 2026
258b0cc
test: remove pickle test (follows __getstate__/__setstate__ removal)
jeff-hykin Mar 22, 2026
1503034
tele_cmd_vel is relayed to cmd_vel, but cmd_vel is ignored by the sim…
jeff-hykin Mar 22, 2026
66e1819
fix(unity): thread safety for _unity_process and stderr drain
jeff-hykin Mar 22, 2026
d6bf9fb
fix(lfs): repack unity_sim_x86 tarball with correct directory name
jeff-hykin Mar 22, 2026
be5666c
fix default environment
jeff-hykin Mar 22, 2026
830895e
works with external sim
jeff-hykin Mar 22, 2026
428f7f3
merge: accept incoming LFS pointer for unity_sim_x86.tar.gz
jeff-hykin Mar 22, 2026
cf99e6d
clean up wiring and terrain map
jeff-hykin Mar 22, 2026
92e42e4
Merge jeff/feat/untiy_sim into jeff/fix/rosnav4
jeff-hykin Mar 23, 2026
cf17091
fixup
jeff-hykin Mar 23, 2026
ba62164
merge: resolve rconnect conflicts into rosnav4
jeff-hykin Mar 23, 2026
e0b4582
wip: add CmdVelMux, vis_module with RerunWebSocketServer, nav sim blu…
jeff-hykin Mar 23, 2026
da647fb
fix: resolve merge conflicts in native_module, change_detect, uv.lock
jeff-hykin Mar 23, 2026
0bfc694
chore: gitignore smartnav result symlinks and flake.lock files
jeff-hykin Mar 23, 2026
2a55500
fix: re-track flake.lock files, only ignore result symlinks
jeff-hykin Mar 23, 2026
cbad625
-
jeff-hykin Mar 23, 2026
26495bf
fix: use Glob() for wildcard patterns in rebuild_on_change
jeff-hykin Mar 23, 2026
a412536
fix terrain map
jeff-hykin Mar 23, 2026
ae12c7e
feat: split nav sim into basic (local only) and advanced (FAR planner)
jeff-hykin Mar 23, 2026
0c515ef
far planner works, some rough edges
jeff-hykin Mar 23, 2026
d53fd09
fixup FAR planner. Still some rough edges
jeff-hykin Mar 23, 2026
1d693e5
feat: add TARE exploration sim blueprint, quiet FAR planner logging
jeff-hykin Mar 23, 2026
f6eed35
feat: add AriseSLAM sim blueprint with synthetic IMU adapter
jeff-hykin Mar 23, 2026
4668b63
refactor: merge scan transform into AriseSimAdapter, remove SensorSca…
jeff-hykin Mar 23, 2026
e35f196
arise_slam not correctly working in sim
jeff-hykin Mar 23, 2026
0ed9545
feat: rewrite GO2 smartnav blueprint with native SmartNav modules
jeff-hykin Mar 23, 2026
e6377c8
refactor: ClickToGoal uses clicked_point stream instead of raw LCM
jeff-hykin Mar 23, 2026
144b14b
refactor: replace rerun_bridge/odom_adapter shortcuts with vis_module…
jeff-hykin Mar 23, 2026
d7b809f
fix: route corrected_odometry to global planners, raw odom to local m…
jeff-hykin Mar 23, 2026
e89b88b
fix: add TerrainAnalysis to corrected_odometry consumers
jeff-hykin Mar 23, 2026
0d98442
still floats everywhere after getting on a table
jeff-hykin Mar 23, 2026
3d759b1
fix: pre-commit auto-fixes (license headers, ruff format, ruff check)
jeff-hykin Mar 23, 2026
cfd79d2
fix: address all PR review issues
jeff-hykin Mar 23, 2026
b697a5d
fix init
jeff-hykin Mar 24, 2026
b4cacfb
keyboard controls rconnect working, little laggy
jeff-hykin Mar 24, 2026
8af9391
better rerun connect UX
jeff-hykin Mar 24, 2026
11cc7b5
Merge branch 'jeff/fix/docker3' of github.com:dimensionalOS/dimos int…
jeff-hykin Mar 25, 2026
30d87a6
cleanup g passing
jeff-hykin Mar 25, 2026
89b2033
merge: pull latest dev, resolve conflict in test_native_module.py
jeff-hykin Mar 25, 2026
bbffeee
switch to websocket
jeff-hykin Mar 21, 2026
f99b2d4
cleanup
jeff-hykin Mar 21, 2026
26273d7
improvements
jeff-hykin Mar 21, 2026
62fb365
fix: ruff formatting + consistent error handling in websocket_server
jeff-hykin Mar 21, 2026
238b3de
make it easy to use
jeff-hykin Mar 21, 2026
5c14fe2
cleanup
jeff-hykin Mar 21, 2026
ab4daea
consolidate viewer usage
jeff-hykin Mar 22, 2026
dc5f2f8
consolidate WebsocketVisModule
jeff-hykin Mar 22, 2026
ba14725
fix: address PR review - server ready race, path filter, skip guard
jeff-hykin Mar 22, 2026
f670f12
fix: set explicit ping interval/timeout on WebSocket server
jeff-hykin Mar 22, 2026
7545a5a
fix(rerun-ws): log exception and unblock stop() on server startup fai…
jeff-hykin Mar 22, 2026
204d8b7
docs: add changes.md with fix descriptions and revert instructions
jeff-hykin Mar 22, 2026
8f23d09
cleanup
jeff-hykin Mar 25, 2026
d37a922
combine docker_build and runner
jeff-hykin Mar 25, 2026
79d7817
rename docker_runner to module
jeff-hykin Mar 25, 2026
25f07b3
add ModuleCoordinator docstring
jeff-hykin Mar 26, 2026
2d321e3
use threading utils
jeff-hykin Mar 26, 2026
0bff0cf
proper design of WorkerManagers
jeff-hykin Mar 26, 2026
7eeee40
better module count handling
jeff-hykin Mar 26, 2026
6994dbc
revert changes to simplify PR
jeff-hykin Mar 26, 2026
8b627f8
formatting
jeff-hykin Mar 26, 2026
36f033a
revert worker_python.py rename back to worker.py
jeff-hykin Mar 26, 2026
0d58ab0
revert WorkerManager ratio
jeff-hykin Mar 26, 2026
affc851
rename DockerModuleOuter to DockerModuleProxy
jeff-hykin Mar 26, 2026
c764314
docker container survies if reconnect is true
jeff-hykin Mar 26, 2026
1896a58
test for prior change
jeff-hykin Mar 26, 2026
6380b84
use dimos_cluster and simplify tests
jeff-hykin Mar 26, 2026
506b1c9
remove fluff
jeff-hykin Mar 26, 2026
bdbdad7
fix printout
jeff-hykin Mar 26, 2026
25dc263
simplify
jeff-hykin Mar 26, 2026
4535c7b
important cleanup change
jeff-hykin Mar 26, 2026
66ccf91
show image pull progress
jeff-hykin Mar 26, 2026
d069a10
simplify dramatically
jeff-hykin Mar 26, 2026
0ee80ba
simplify
jeff-hykin Mar 26, 2026
a6e37b7
fixup
jeff-hykin Mar 26, 2026
95fc178
improve
jeff-hykin Mar 26, 2026
2fac566
-
jeff-hykin Mar 26, 2026
fff6a60
Merge branch 'jeff/fix/rosnav3' of github.com:dimensionalos/dimos int…
jeff-hykin Mar 26, 2026
5e7ca3f
merge docker3
jeff-hykin Mar 26, 2026
c1ad052
fix: auto-format lint fixes from pre-commit
jeff-hykin Mar 26, 2026
1a439e2
fix: correct docker_runner import and mypy ignore codes in rosnav_module
jeff-hykin Mar 26, 2026
4011e4e
make unity sim tests deterministic
jeff-hykin Mar 26, 2026
dfc4a23
Merge branch 'jeff/fix/unity_sim' of github.com:dimensionalOS/dimos i…
jeff-hykin Mar 26, 2026
5f86379
-
jeff-hykin Mar 26, 2026
29ebda8
fixup for onboard
jeff-hykin Mar 26, 2026
7b00db6
fix grpc rerun onboard
jeff-hykin Mar 26, 2026
8f2fcd1
clean up transform frames
jeff-hykin Mar 26, 2026
3a76a34
better logging
jeff-hykin Mar 26, 2026
de11edd
works, but map fills up over time
jeff-hykin Mar 26, 2026
6ebe517
-
jeff-hykin Mar 26, 2026
ab8889b
add trace
jeff-hykin Mar 30, 2026
329fd93
remove debug
jeff-hykin Mar 30, 2026
3ecf97f
Merge remote-tracking branch 'origin/jeff/fix/rosnav3' into jeff/fix/…
jeff-hykin Mar 30, 2026
a5788fd
fix lcm for macos
jeff-hykin Mar 30, 2026
bd77834
Merge branch 'dev' of github.com:dimensionalOS/dimos into jeff/fix/ro…
jeff-hykin Mar 30, 2026
16209da
cleaning
jeff-hykin Mar 30, 2026
2c39685
feat: vis_module helper + rerun bridge improvements
jeff-hykin Mar 30, 2026
7f063c6
Merge branch 'jeff/fix/rconnect' of github.com:dimensionalOS/dimos in…
jeff-hykin Mar 30, 2026
596d244
Merge remote-tracking branch 'origin/dev' into jeff/fix/rconnect
jeff-hykin Mar 30, 2026
3ecae4b
cleanup
jeff-hykin Mar 30, 2026
77e25eb
refine
jeff-hykin Mar 30, 2026
0a231d0
Merge branch 'dev' of github.com:dimensionalOS/dimos into jeff/fix/rc…
jeff-hykin Mar 30, 2026
3835a39
cleanup
jeff-hykin Mar 30, 2026
1c77b59
cleanup
jeff-hykin Mar 30, 2026
b1dcf0f
misc
jeff-hykin Mar 30, 2026
de37b65
Merge jeff/fix/vis_module: bridge improvements + vis_module consolida…
jeff-hykin Mar 30, 2026
7afcca3
dedup the simulator
jeff-hykin Mar 30, 2026
9705210
Merge remote-tracking branch 'origin/jeff/fix/rconnect' into jeff/fix…
jeff-hykin Mar 30, 2026
0201d88
move cpp files
jeff-hykin Mar 30, 2026
b3e68f8
restore
jeff-hykin Mar 30, 2026
4e407e8
fixup
jeff-hykin Mar 30, 2026
b5baec4
restore rerun_graph
jeff-hykin Mar 30, 2026
83a4b98
revert
jeff-hykin Mar 30, 2026
fad88c6
restore
jeff-hykin Mar 31, 2026
b56ef2c
make modules external
jeff-hykin Mar 31, 2026
829939a
rename repos
jeff-hykin Mar 31, 2026
127db6f
cleanup
jeff-hykin Mar 31, 2026
59e2d9f
clean
jeff-hykin Mar 31, 2026
b44076b
clean
jeff-hykin Mar 31, 2026
c3df19c
formatting
jeff-hykin Mar 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions data/.lfs/smartnav_paths.tar.gz
Git LFS file not shown
2 changes: 0 additions & 2 deletions dimos/agents_deprecated/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -897,5 +897,3 @@ def stream_query(self, query_text: str) -> Observable: # type: ignore[type-arg]
return create(
lambda observer, _: self._observable_query(observer, incoming_query=query_text) # type: ignore[arg-type]
)


4 changes: 2 additions & 2 deletions dimos/agents_deprecated/memory/spatial_vector_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,8 @@ def _process_query_results(self, results) -> list[dict]: # type: ignore[no-unty
)

# Get the image from visual memory
#image = self.visual_memory.get(lookup_id)
#result["image"] = image
# image = self.visual_memory.get(lookup_id)
# result["image"] = image

processed_results.append(result)

Expand Down
207 changes: 161 additions & 46 deletions dimos/core/native_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class MyCppModule(NativeModule):

from dimos.core.core import rpc
from dimos.core.module import Module, ModuleConfig
from dimos.utils.change_detect import PathEntry, did_change
from dimos.utils.logging_config import setup_logger

if sys.version_info < (3, 13):
Expand All @@ -81,9 +82,10 @@ class NativeModuleConfig(ModuleConfig):
extra_env: dict[str, str] = Field(default_factory=dict)
shutdown_timeout: float = 10.0
log_format: LogFormat = LogFormat.TEXT
rebuild_on_change: list[PathEntry] | None = None

# Override in subclasses to exclude fields from CLI arg generation
cli_exclude: frozenset[str] = frozenset()
cli_exclude: frozenset[str] = frozenset({"rebuild_on_change"})

def to_cli_args(self) -> list[str]:
"""Auto-convert subclass config fields to CLI args.
Expand Down Expand Up @@ -132,17 +134,31 @@ class NativeModule(Module[_NativeConfig]):
_process: subprocess.Popen[bytes] | None = None
_watchdog: threading.Thread | None = None
_stopping: bool = False
_last_stderr_lines: collections.deque[str]
_stderr_tail: list[str]
_stdout_tail: list[str]
_tail_lock: threading.Lock

@property
def _mod_label(self) -> str:
"""Short human-readable label: ClassName(executable_basename)."""
exe = Path(self.config.executable).name if self.config.executable else "?"
return f"{type(self).__name__}({exe})"

def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)
self._last_stderr_lines = collections.deque(maxlen=50)
self._stderr_tail: collections.deque[str] = collections.deque(maxlen=50)
self._stdout_tail: collections.deque[str] = collections.deque(maxlen=50)
self._tail_lock = threading.Lock()
self._resolve_paths()

@rpc
def start(self) -> None:
if self._process is not None and self._process.poll() is None:
logger.warning("Native process already running", pid=self._process.pid)
logger.warning(
"Native process already running",
module=self._mod_label,
pid=self._process.pid,
)
return

self._maybe_build()
Expand All @@ -158,10 +174,14 @@ def start(self) -> None:
env = {**os.environ, **self.config.extra_env}
cwd = self.config.cwd or str(Path(self.config.executable).resolve().parent)

module_name = type(self).__name__
# Reset tail buffers for this run.
with self._tail_lock:
self._stderr_tail.clear()
self._stdout_tail.clear()

logger.info(
f"Starting native process: {module_name}",
module=module_name,
"Starting native process",
module=self._mod_label,
cmd=" ".join(cmd),
cwd=cwd,
)
Expand All @@ -173,26 +193,36 @@ def start(self) -> None:
stderr=subprocess.PIPE,
)
logger.info(
f"Native process started: {module_name}",
module=module_name,
"Native process started",
module=self._mod_label,
pid=self._process.pid,
)

self._stopping = False
self._watchdog = threading.Thread(target=self._watch_process, daemon=True)
self._watchdog = threading.Thread(
target=self._watch_process,
daemon=True,
name=f"native-watchdog-{self._mod_label}",
)
self._watchdog.start()

@rpc
def stop(self) -> None:
self._stopping = True
if self._process is not None and self._process.poll() is None:
logger.info("Stopping native process", pid=self._process.pid)
logger.info(
"Stopping native process",
module=self._mod_label,
pid=self._process.pid,
)
self._process.send_signal(signal.SIGTERM)
try:
self._process.wait(timeout=self.config.shutdown_timeout)
except subprocess.TimeoutExpired:
logger.warning(
"Native process did not exit, sending SIGKILL", pid=self._process.pid
"Native process did not exit, sending SIGKILL",
module=self._mod_label,
pid=self._process.pid,
)
self._process.kill()
self._process.wait(timeout=5)
Expand All @@ -207,57 +237,110 @@ def _watch_process(self) -> None:
if self._process is None:
return

stdout_t = self._start_reader(self._process.stdout, "info")
stderr_t = self._start_reader(self._process.stderr, "warning")
stdout_t = self._start_reader(self._process.stdout, "info", self._stdout_tail)
stderr_t = self._start_reader(self._process.stderr, "warning", self._stderr_tail)
rc = self._process.wait()
stdout_t.join(timeout=2)
stderr_t.join(timeout=2)

if self._stopping:
logger.info(
"Native process exited (expected)",
module=self._mod_label,
pid=self._process.pid,
returncode=rc,
)
return

module_name = type(self).__name__
exe_name = Path(self.config.executable).name if self.config.executable else "unknown"

# Use buffered stderr lines from the reader thread for the crash report.
last_stderr = "\n".join(self._last_stderr_lines)
# Grab the tail for diagnostics.
with self._tail_lock:
stderr_snapshot = list(self._stderr_tail)
stdout_snapshot = list(self._stdout_tail)

logger.error(
f"Native process crashed: {module_name} ({exe_name})",
module=module_name,
executable=exe_name,
"Native process died unexpectedly",
module=self._mod_label,
pid=self._process.pid,
returncode=rc,
last_stderr=last_stderr[:500] if last_stderr else None,
)

# Log the last stderr/stdout lines so the cause is visible.
if stderr_snapshot:
logger.error(
f"Last {len(stderr_snapshot)} stderr lines from {self._mod_label}:",
module=self._mod_label,
pid=self._process.pid,
)
for line in stderr_snapshot:
logger.error(f" stderr| {line}", module=self._mod_label)

if stdout_snapshot and not stderr_snapshot:
# Only dump stdout if stderr was empty (avoid double-noise).
logger.error(
f"Last {len(stdout_snapshot)} stdout lines from {self._mod_label}:",
module=self._mod_label,
pid=self._process.pid,
)
for line in stdout_snapshot:
logger.error(f" stdout| {line}", module=self._mod_label)

if not stderr_snapshot and not stdout_snapshot:
logger.error(
"No output captured from native process — "
"binary may have crashed before producing any output",
module=self._mod_label,
pid=self._process.pid,
)

self.stop()

def _start_reader(self, stream: IO[bytes] | None, level: str) -> threading.Thread:
def _start_reader(
self,
stream: IO[bytes] | None,
level: str,
tail_buf: list[str],
) -> threading.Thread:
"""Spawn a daemon thread that pipes a subprocess stream through the logger."""
t = threading.Thread(target=self._read_log_stream, args=(stream, level), daemon=True)
t = threading.Thread(
target=self._read_log_stream,
args=(stream, level, tail_buf),
daemon=True,
name=f"native-reader-{level}-{self._mod_label}",
)
t.start()
return t

def _read_log_stream(self, stream: IO[bytes] | None, level: str) -> None:
def _read_log_stream(
self,
stream: IO[bytes] | None,
level: str,
tail_buf: list[str],
) -> None:
if stream is None:
return
log_fn = getattr(logger, level)
is_stderr = level == "warning"
for raw in stream:
line = raw.decode("utf-8", errors="replace").rstrip()
if not line:
continue
if is_stderr:
self._last_stderr_lines.append(line)

# Keep a rolling tail buffer for crash diagnostics.
with self._tail_lock:
tail_buf.append(line)

if self.config.log_format == LogFormat.JSON:
try:
data = json.loads(line)
event = data.pop("event", line)
log_fn(event, **data)
log_fn(event, module=self._mod_label, **data)
continue
except (json.JSONDecodeError, TypeError):
logger.warning("malformed JSON from native module", raw=line)
log_fn(line, pid=self._process.pid if self._process else None)
logger.warning(
"malformed JSON from native module",
module=self._mod_label,
raw=line,
)
log_fn(line, module=self._mod_label, pid=self._process.pid if self._process else None)
stream.close()

def _resolve_paths(self) -> None:
Expand All @@ -269,18 +352,39 @@ def _resolve_paths(self) -> None:
if not Path(self.config.executable).is_absolute() and self.config.cwd is not None:
self.config.executable = str(Path(self.config.cwd) / self.config.executable)

def _build_cache_name(self) -> str:
"""Return a stable, unique cache name for this module's build state."""
source_file = Path(inspect.getfile(type(self))).resolve()
return f"native_{source_file}"

def _maybe_build(self) -> None:
"""Run ``build_command`` if the executable does not exist."""
"""Run ``build_command`` if the executable does not exist or sources changed."""
exe = Path(self.config.executable)
if exe.exists():

# Check if rebuild needed due to source changes
needs_rebuild = False
if self.config.rebuild_on_change and exe.exists():
if did_change(
self._build_cache_name(), self.config.rebuild_on_change, cwd=self.config.cwd
):
logger.info("Source files changed, triggering rebuild", executable=str(exe))
needs_rebuild = True

if exe.exists() and not needs_rebuild:
return

if self.config.build_command is None:
raise FileNotFoundError(
f"Executable not found: {exe}. "
f"[{self._mod_label}] Executable not found: {exe}. "
"Set build_command in config to auto-build, or build it manually."
)

# Don't unlink the exe before rebuilding — the build command is
# responsible for replacing it. For nix builds the exe lives inside
# a read-only store; `nix build -o` atomically swaps the output
# symlink without touching store contents.
logger.info(
"Executable not found, running build",
"Rebuilding" if needs_rebuild else "Executable not found, building",
executable=str(exe),
build_command=self.config.build_command,
)
Expand All @@ -293,25 +397,36 @@ def _maybe_build(self) -> None:
stderr=subprocess.PIPE,
)
stdout, stderr = proc.communicate()
for line in stdout.decode("utf-8", errors="replace").splitlines():

stdout_lines = stdout.decode("utf-8", errors="replace").splitlines()
stderr_lines = stderr.decode("utf-8", errors="replace").splitlines()

for line in stdout_lines:
if line.strip():
logger.info(line)
for line in stderr.decode("utf-8", errors="replace").splitlines():
logger.info(line, module=self._mod_label)
for line in stderr_lines:
if line.strip():
logger.warning(line)
logger.warning(line, module=self._mod_label)

if proc.returncode != 0:
stderr_tail = stderr.decode("utf-8", errors="replace").strip()[-1000:]
# Include the last stderr lines in the exception for RPC callers.
tail = [l for l in stderr_lines if l.strip()][-20:]
tail_str = "\n".join(tail) if tail else "(no stderr output)"
raise RuntimeError(
f"Build command failed (exit {proc.returncode}): {self.config.build_command}\n"
f"stderr: {stderr_tail}"
f"[{self._mod_label}] Build command failed "
f"(exit {proc.returncode}): {self.config.build_command}\n"
f"--- last stderr ---\n{tail_str}"
)
if not exe.exists():
raise FileNotFoundError(
f"Build command succeeded but executable still not found: {exe}\n"
f"Build output may have been written to a different path. "
f"Check that build_command produces the executable at the expected location."
f"[{self._mod_label}] Build command succeeded but executable still not found: {exe}"
)

# Seed the cache after a successful build so the next check has a baseline
# (needed for the initial build when the pre-build change check was skipped)
if self.config.rebuild_on_change:
did_change(self._build_cache_name(), self.config.rebuild_on_change, cwd=self.config.cwd)

def _collect_topics(self) -> dict[str, str]:
"""Extract LCM topic strings from blueprint-assigned stream transports."""
topics: dict[str, str] = {}
Expand Down
Loading