osiris-agent 0.1.3__tar.gz → 0.1.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/PKG-INFO +1 -1
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/osiris_agent/agent_node.py +4 -19
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/osiris_agent/bt_collector.py +12 -19
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/osiris_agent.egg-info/PKG-INFO +1 -1
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/setup.py +1 -1
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/LICENSE +0 -0
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/README.md +0 -0
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/osiris_agent/__init__.py +0 -0
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/osiris_agent.egg-info/SOURCES.txt +0 -0
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/osiris_agent.egg-info/dependency_links.txt +0 -0
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/osiris_agent.egg-info/entry_points.txt +0 -0
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/osiris_agent.egg-info/requires.txt +0 -0
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/osiris_agent.egg-info/top_level.txt +0 -0
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/setup.cfg +0 -0
- {osiris_agent-0.1.3 → osiris_agent-0.1.4}/tests/test_agent_node.py +0 -0
|
@@ -34,6 +34,7 @@ class WebBridge(Node):
|
|
|
34
34
|
raise ValueError("OSIRIS_AUTH_TOKEN environment variable must be set")
|
|
35
35
|
|
|
36
36
|
self.ws_url = f'wss://osiris-gateway.fly.dev?robot=true&token={auth_token}'
|
|
37
|
+
# self.ws_url = f'ws://host.docker.internal:8080?robot=true&token={auth_token}'
|
|
37
38
|
self.ws = None
|
|
38
39
|
self._topic_subs = {}
|
|
39
40
|
self._topic_subs_lock = threading.Lock()
|
|
@@ -76,10 +77,10 @@ class WebBridge(Node):
|
|
|
76
77
|
logger=self.get_logger()
|
|
77
78
|
)
|
|
78
79
|
self._bt_collector.start()
|
|
79
|
-
self.get_logger().info("BT Collector started")
|
|
80
80
|
else:
|
|
81
81
|
self._bt_collector = None
|
|
82
|
-
|
|
82
|
+
|
|
83
|
+
self.get_logger().info("🚀 Osiris agent running")
|
|
83
84
|
|
|
84
85
|
# Create event loop and queue, run websocket client
|
|
85
86
|
def _run_ws_client(self):
|
|
@@ -95,12 +96,10 @@ class WebBridge(Node):
|
|
|
95
96
|
|
|
96
97
|
while True:
|
|
97
98
|
try:
|
|
98
|
-
self.get_logger().info("Attempting to connect to gateway...")
|
|
99
99
|
await self._client_loop()
|
|
100
100
|
except Exception as e:
|
|
101
|
-
|
|
101
|
+
pass # Silent retry
|
|
102
102
|
|
|
103
|
-
self.get_logger().info(f"Reconnecting in {reconnect_delay} seconds...")
|
|
104
103
|
await asyncio.sleep(reconnect_delay)
|
|
105
104
|
|
|
106
105
|
reconnect_delay = min(reconnect_delay * 2, RECONNECT_MAX_DELAY)
|
|
@@ -112,12 +111,10 @@ class WebBridge(Node):
|
|
|
112
111
|
send_task = None
|
|
113
112
|
try:
|
|
114
113
|
async with websockets.connect(self.ws_url) as ws:
|
|
115
|
-
self.get_logger().info("Connected to gateway (socket opened)")
|
|
116
114
|
# Wait for gateway auth response before sending initial state
|
|
117
115
|
try:
|
|
118
116
|
auth_msg = await ws.recv()
|
|
119
117
|
except Exception as e:
|
|
120
|
-
self.get_logger().error(f"Failed to receive auth message: {e}")
|
|
121
118
|
return
|
|
122
119
|
|
|
123
120
|
try:
|
|
@@ -125,14 +122,9 @@ class WebBridge(Node):
|
|
|
125
122
|
except Exception:
|
|
126
123
|
auth_data = None
|
|
127
124
|
|
|
128
|
-
self.get_logger().debug(f"Gateway auth message received: {auth_msg}")
|
|
129
|
-
|
|
130
125
|
if not auth_data or auth_data.get('type') != 'auth_success':
|
|
131
|
-
self.get_logger().error(f"Gateway did not authenticate: parsed={auth_data}")
|
|
132
126
|
return
|
|
133
127
|
|
|
134
|
-
self.get_logger().info("Authenticated with gateway")
|
|
135
|
-
|
|
136
128
|
self.ws = ws
|
|
137
129
|
|
|
138
130
|
send_task = asyncio.create_task(self._send_loop(ws))
|
|
@@ -141,7 +133,6 @@ class WebBridge(Node):
|
|
|
141
133
|
|
|
142
134
|
await self._receive_loop(ws)
|
|
143
135
|
except Exception as e:
|
|
144
|
-
self.get_logger().error(f"Error in client loop: {e}")
|
|
145
136
|
raise
|
|
146
137
|
finally:
|
|
147
138
|
if send_task and not send_task.done():
|
|
@@ -980,15 +971,11 @@ class WebBridge(Node):
|
|
|
980
971
|
def _on_bt_event(self, event):
|
|
981
972
|
"""Handle behavior tree events from BTCollector and forward to websocket."""
|
|
982
973
|
event_type = event.get('type')
|
|
983
|
-
self.get_logger().info(f"BT event received: {event_type}")
|
|
984
974
|
|
|
985
975
|
# Cache tree events if WS not connected yet
|
|
986
976
|
if not self.ws or not self.loop:
|
|
987
977
|
if event_type == 'bt_tree':
|
|
988
978
|
self._cached_bt_tree_event = event
|
|
989
|
-
self.get_logger().info("BT tree event cached (WS not connected yet)")
|
|
990
|
-
else:
|
|
991
|
-
self.get_logger().warn(f"Dropping BT event {event_type} (WS not connected)")
|
|
992
979
|
return
|
|
993
980
|
|
|
994
981
|
try:
|
|
@@ -996,7 +983,6 @@ class WebBridge(Node):
|
|
|
996
983
|
self._send_queue.put(json.dumps(event)),
|
|
997
984
|
self.loop
|
|
998
985
|
)
|
|
999
|
-
self.get_logger().info(f"BT event {event_type} queued for sending")
|
|
1000
986
|
except Exception as e:
|
|
1001
987
|
self.get_logger().error(f"Failed to queue BT event: {e}")
|
|
1002
988
|
|
|
@@ -1005,7 +991,6 @@ class WebBridge(Node):
|
|
|
1005
991
|
# Stop BT collector
|
|
1006
992
|
if self._bt_collector:
|
|
1007
993
|
self._bt_collector.stop()
|
|
1008
|
-
self.get_logger().info("BT Collector stopped")
|
|
1009
994
|
|
|
1010
995
|
super().destroy_node()
|
|
1011
996
|
|
|
@@ -22,9 +22,9 @@ import zmq
|
|
|
22
22
|
import random # added to support unique_id generation in requests
|
|
23
23
|
|
|
24
24
|
# Default Groot2 configuration (industry standard)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
DEFAULT_SERVER_PORT = 1667 # REQ/REP for tree structure and status polling
|
|
26
|
+
DEFAULT_PUBLISHER_PORT = 1668 # PUB/SUB for breakpoint notifications only
|
|
27
|
+
DEFAULT_HOST = "127.0.0.1"
|
|
28
28
|
|
|
29
29
|
# ZMQ timeouts
|
|
30
30
|
ZMQ_RECV_TIMEOUT_MS = 2000
|
|
@@ -94,16 +94,16 @@ class BTCollector:
|
|
|
94
94
|
|
|
95
95
|
Args:
|
|
96
96
|
event_callback: Function to call with parsed events (dict)
|
|
97
|
-
host: Groot2 host address (default: from
|
|
98
|
-
server_port: Groot2 server port (default: from
|
|
99
|
-
publisher_port: Groot2 publisher port (default: from
|
|
97
|
+
host: Groot2 host address (default: from BT_HOST env or 127.0.0.1)
|
|
98
|
+
server_port: Groot2 server port (default: from BT_SERVER_PORT env or 1667)
|
|
99
|
+
publisher_port: Groot2 publisher port (default: from BT_PUBLISHER_PORT env or 1668)
|
|
100
100
|
logger: Optional logger (uses print if None)
|
|
101
101
|
"""
|
|
102
102
|
self._event_callback = event_callback
|
|
103
103
|
# Read from environment variables with fallback to defaults
|
|
104
|
-
self._host = host or os.environ.get('
|
|
105
|
-
self._server_port = server_port or int(os.environ.get('
|
|
106
|
-
self._publisher_port = publisher_port or int(os.environ.get('
|
|
104
|
+
self._host = host or os.environ.get('OSIRIS_BT_HOST', DEFAULT_HOST)
|
|
105
|
+
self._server_port = server_port or int(os.environ.get('OSIRIS_BT_SERVER_PORT', str(DEFAULT_SERVER_PORT)))
|
|
106
|
+
self._publisher_port = publisher_port or int(os.environ.get('OSIRIS_BT_PUBLISHER_PORT', str(DEFAULT_PUBLISHER_PORT)))
|
|
107
107
|
self._logger = logger
|
|
108
108
|
|
|
109
109
|
self._running = False
|
|
@@ -114,14 +114,10 @@ class BTCollector:
|
|
|
114
114
|
self._last_statuses: Dict[int, str] = {}
|
|
115
115
|
|
|
116
116
|
def _log_info(self, msg: str):
|
|
117
|
-
|
|
118
|
-
self._logger.info(msg)
|
|
119
|
-
else:
|
|
120
|
-
print(f"[BTCollector INFO] {msg}")
|
|
117
|
+
pass # Logging disabled
|
|
121
118
|
|
|
122
119
|
def _log_debug(self, msg: str):
|
|
123
|
-
|
|
124
|
-
self._logger.debug(msg)
|
|
120
|
+
pass # Logging disabled
|
|
125
121
|
|
|
126
122
|
def _log_error(self, msg: str):
|
|
127
123
|
if self._logger:
|
|
@@ -130,10 +126,7 @@ class BTCollector:
|
|
|
130
126
|
print(f"[BTCollector ERROR] {msg}")
|
|
131
127
|
|
|
132
128
|
def _log_warn(self, msg: str):
|
|
133
|
-
|
|
134
|
-
self._logger.warn(msg)
|
|
135
|
-
else:
|
|
136
|
-
print(f"[BTCollector WARN] {msg}")
|
|
129
|
+
pass # Logging disabled
|
|
137
130
|
|
|
138
131
|
def start(self):
|
|
139
132
|
"""Start the collector in a background thread."""
|
|
@@ -6,7 +6,7 @@ long_description = (HERE / "README.md").read_text(encoding="utf-8")
|
|
|
6
6
|
|
|
7
7
|
setup(
|
|
8
8
|
name='osiris_agent',
|
|
9
|
-
version='0.1.
|
|
9
|
+
version='0.1.4',
|
|
10
10
|
description='OSIRIS agent for ROS2/Humble',
|
|
11
11
|
long_description=long_description,
|
|
12
12
|
long_description_content_type="text/markdown",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|