escobar 0.1.74__py3-none-any.whl → 0.1.76__py3-none-any.whl

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.
Files changed (27) hide show
  1. escobar/_version.py +1 -1
  2. escobar/handlers.py +49 -19
  3. escobar/labextension/package.json +2 -2
  4. escobar/labextension/schemas/escobar/package.json.orig +1 -1
  5. escobar-0.1.74.data/data/share/jupyter/labextensions/escobar/static/589.f8dc01ae6841c48d5bdb.js → escobar/labextension/static/589.5dd88277ccef02cff4da.js +1 -1
  6. escobar/labextension/static/{remoteEntry.ffdf5783302f3ef7c627.js → remoteEntry.1ddb124918df1bafad93.js} +1 -1
  7. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/package.json +2 -2
  8. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/schemas/escobar/package.json.orig +1 -1
  9. escobar/labextension/static/589.f8dc01ae6841c48d5bdb.js → escobar-0.1.76.data/data/share/jupyter/labextensions/escobar/static/589.5dd88277ccef02cff4da.js +1 -1
  10. escobar-0.1.74.data/data/share/jupyter/labextensions/escobar/static/remoteEntry.ffdf5783302f3ef7c627.js → escobar-0.1.76.data/data/share/jupyter/labextensions/escobar/static/remoteEntry.1ddb124918df1bafad93.js +1 -1
  11. {escobar-0.1.74.dist-info → escobar-0.1.76.dist-info}/METADATA +1 -1
  12. {escobar-0.1.74.dist-info → escobar-0.1.76.dist-info}/RECORD +27 -27
  13. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/install.json +0 -0
  14. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/schemas/escobar/plugin.json +0 -0
  15. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/static/304.bf7e91be734e5b36cdc9.js +0 -0
  16. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/static/346.8a1e61ca6789b6fddfa7.js +0 -0
  17. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/static/379.40dd59dc19d4a6b42d25.js +0 -0
  18. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/static/57.17e53b4b9a954f39c4d8.js +0 -0
  19. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/static/648.a7d314faeacc762d891d.js +0 -0
  20. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/static/666.3bc65aac3a3be183ee19.js +0 -0
  21. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/static/874.c539726f31a1baa0267e.js +0 -0
  22. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/static/986.cbcf9d7c1cd8d06be435.js +0 -0
  23. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/static/style.js +0 -0
  24. {escobar-0.1.74.data → escobar-0.1.76.data}/data/share/jupyter/labextensions/escobar/static/third-party-licenses.json +0 -0
  25. {escobar-0.1.74.dist-info → escobar-0.1.76.dist-info}/WHEEL +0 -0
  26. {escobar-0.1.74.dist-info → escobar-0.1.76.dist-info}/entry_points.txt +0 -0
  27. {escobar-0.1.74.dist-info → escobar-0.1.76.dist-info}/licenses/LICENSE +0 -0
escobar/_version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '0.1.74'
4
+ __version__ = VERSION = '0.1.76'
escobar/handlers.py CHANGED
@@ -159,12 +159,41 @@ class WebSocketProxyHandler(tornado.websocket.WebSocketHandler):
159
159
  Resolve target URL for Docker environment.
160
160
  Replace localhost/127.0.0.1 with Docker host IP when running in container.
161
161
  """
162
- if not os.path.exists('/.dockerenv'):
162
+ # Enhanced Docker detection with multiple methods
163
+ docker_indicators = []
164
+
165
+ # Method 1: Check for /.dockerenv file
166
+ dockerenv_exists = os.path.exists('/.dockerenv')
167
+ docker_indicators.append(f"/.dockerenv exists: {dockerenv_exists}")
168
+
169
+ # Method 2: Check environment variable
170
+ docker_env = os.getenv('DOCKER_CONTAINER') == 'true'
171
+ docker_indicators.append(f"DOCKER_CONTAINER env: {docker_env}")
172
+
173
+ # Method 3: Check /proc/1/cgroup for docker
174
+ cgroup_docker = False
175
+ try:
176
+ if os.path.exists('/proc/1/cgroup'):
177
+ with open('/proc/1/cgroup', 'r') as f:
178
+ cgroup_content = f.read()
179
+ cgroup_docker = 'docker' in cgroup_content or 'containerd' in cgroup_content
180
+ docker_indicators.append(f"/proc/1/cgroup contains docker/containerd: {cgroup_docker}")
181
+ except Exception as e:
182
+ docker_indicators.append(f"/proc/1/cgroup check failed: {e}")
183
+
184
+ # Determine if we're in Docker
185
+ is_docker = dockerenv_exists or docker_env or cgroup_docker
186
+
187
+ print(f"[ESCOBAR-WS] Docker detection indicators: {docker_indicators}")
188
+ print(f"[ESCOBAR-WS] Final Docker detection result: {is_docker}")
189
+
190
+ if not is_docker:
163
191
  print(f"[ESCOBAR-WS] Not in Docker container, using original URL: {url}")
164
- return url # Not in Docker, return original URL
192
+ return url
165
193
 
166
194
  # Parse the URL to extract components
167
195
  parsed = urlparse(url)
196
+ print(f"[ESCOBAR-WS] Parsed URL - hostname: '{parsed.hostname}', netloc: '{parsed.netloc}'")
168
197
 
169
198
  # Check if hostname is localhost or 127.0.0.1
170
199
  if parsed.hostname in ['localhost', '127.0.0.1']:
@@ -193,13 +222,10 @@ class WebSocketProxyHandler(tornado.websocket.WebSocketHandler):
193
222
  except:
194
223
  print(f"[ESCOBAR-WS] Could not get hostname")
195
224
 
196
- # Read target URL from environment variable
197
- raw_target_url = os.getenv('WEBSOCKET_PROXY_TARGET', 'ws://localhost:8777/ws')
198
- print(f"[ESCOBAR-WS] Raw target URL from environment: {raw_target_url}")
199
-
200
- # Apply Docker hostname resolution
201
- self.target_url = self._resolve_target_url_for_docker(raw_target_url)
202
- print(f"[ESCOBAR-WS] Resolved target URL: {self.target_url}")
225
+ # Store raw target URL from environment variable (resolve per-connection)
226
+ self.raw_target_url = os.getenv('WEBSOCKET_PROXY_TARGET', 'ws://localhost:8777/ws')
227
+ print(f"[ESCOBAR-WS] Raw target URL stored: {self.raw_target_url}")
228
+ print(f"[ESCOBAR-WS] Docker resolution will be applied per-connection")
203
229
 
204
230
  # Debug all WebSocket-related environment variables
205
231
  websocket_env_vars = [(k, v) for k, v in os.environ.items() if 'WEBSOCKET' in k.upper()]
@@ -215,11 +241,15 @@ class WebSocketProxyHandler(tornado.websocket.WebSocketHandler):
215
241
  """Called when websocket connection is opened"""
216
242
  start_time = time.time()
217
243
 
244
+ # Apply Docker hostname resolution for this connection
245
+ target_url = self._resolve_target_url_for_docker(self.raw_target_url)
246
+
218
247
  # Log which endpoint was accessed and path normalization
219
248
  request_path = self.request.path
220
249
  print(f"[ESCOBAR-WS] === CLIENT CONNECTION OPENED ===")
221
250
  print(f"[ESCOBAR-WS] Client connected via: {request_path}")
222
- print(f"[ESCOBAR-WS] Target remains: {self.target_url}")
251
+ print(f"[ESCOBAR-WS] Raw target URL: {self.raw_target_url}")
252
+ print(f"[ESCOBAR-WS] Resolved target URL for this connection: {target_url}")
223
253
  if request_path != "/ws":
224
254
  print(f"[ESCOBAR-WS] Path normalization: {request_path} → /ws")
225
255
 
@@ -227,9 +257,9 @@ class WebSocketProxyHandler(tornado.websocket.WebSocketHandler):
227
257
  print(f"[ESCOBAR-WS] Client origin: {self.request.headers.get('Origin', 'NO_ORIGIN')}")
228
258
  print(f"[ESCOBAR-WS] Client remote IP: {self.request.remote_ip}")
229
259
  print(f"[ESCOBAR-WS] Request headers: {dict(self.request.headers)}")
230
- print(f"[ESCOBAR-WS] Attempting to connect to target: {self.target_url}")
260
+ print(f"[ESCOBAR-WS] Attempting to connect to target: {target_url}")
231
261
 
232
- logging.info(f"WebSocket connection opened, proxying to {self.target_url}")
262
+ logging.info(f"WebSocket connection opened, proxying to {target_url}")
233
263
 
234
264
  try:
235
265
  # Establish connection to target websocket server
@@ -247,15 +277,15 @@ class WebSocketProxyHandler(tornado.websocket.WebSocketHandler):
247
277
  print(f"[ESCOBAR-WS] Headers to forward: {headers}")
248
278
 
249
279
  # Determine if we need SSL based on URL scheme
250
- use_ssl = self.target_url.startswith('wss://')
280
+ use_ssl = target_url.startswith('wss://')
251
281
  ssl_context = ssl.create_default_context() if use_ssl else None
252
282
  print(f"[ESCOBAR-WS] Using SSL: {use_ssl}")
253
283
 
254
- print(f"[ESCOBAR-WS] Attempting websockets.connect() to {self.target_url}")
284
+ print(f"[ESCOBAR-WS] Attempting websockets.connect() to {target_url}")
255
285
 
256
286
  # Connect to target websocket (works with both ws:// and wss://)
257
287
  self.target_ws = await websockets.connect(
258
- self.target_url,
288
+ target_url,
259
289
  additional_headers=headers,
260
290
  ssl=ssl_context,
261
291
  ping_interval=20,
@@ -270,7 +300,7 @@ class WebSocketProxyHandler(tornado.websocket.WebSocketHandler):
270
300
  asyncio.create_task(self._forward_from_target())
271
301
 
272
302
  print(f"[ESCOBAR-WS] === CONNECTION SETUP COMPLETE ===")
273
- logging.info(f"Successfully connected to target websocket server: {self.target_url}")
303
+ logging.info(f"Successfully connected to target websocket server: {target_url}")
274
304
 
275
305
  except Exception as e:
276
306
  end_time = time.time()
@@ -278,15 +308,15 @@ class WebSocketProxyHandler(tornado.websocket.WebSocketHandler):
278
308
  print(f"[ESCOBAR-WS] Connection failed after {end_time - start_time:.2f} seconds")
279
309
  print(f"[ESCOBAR-WS] Error: {str(e)}")
280
310
  print(f"[ESCOBAR-WS] Error type: {type(e).__name__}")
281
- print(f"[ESCOBAR-WS] Target URL: {self.target_url}")
311
+ print(f"[ESCOBAR-WS] Target URL: {target_url}")
282
312
  if hasattr(e, 'errno'):
283
313
  print(f"[ESCOBAR-WS] Errno: {e.errno}")
284
314
  if hasattr(e, 'strerror'):
285
315
  print(f"[ESCOBAR-WS] Strerror: {e.strerror}")
286
316
  print(f"[ESCOBAR-WS] === END CONNECTION FAILED ===")
287
317
 
288
- logging.error(f"Failed to connect to target websocket {self.target_url}: {str(e)}")
289
- self.close(code=1011, reason=f"Failed to connect to target server: {self.target_url}")
318
+ logging.error(f"Failed to connect to target websocket {target_url}: {str(e)}")
319
+ self.close(code=1011, reason=f"Failed to connect to target server: {target_url}")
290
320
 
291
321
  async def on_message(self, message):
292
322
  """Called when a message is received from the client"""
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "escobar",
3
- "version": "0.1.74",
3
+ "version": "0.1.76",
4
4
  "description": "AI CHAT EXTENSION",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -123,7 +123,7 @@
123
123
  "outputDir": "escobar/labextension",
124
124
  "schemaDir": "schema",
125
125
  "_build": {
126
- "load": "static/remoteEntry.ffdf5783302f3ef7c627.js",
126
+ "load": "static/remoteEntry.1ddb124918df1bafad93.js",
127
127
  "extension": "./extension",
128
128
  "style": "./style"
129
129
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "escobar",
3
- "version": "0.1.74",
3
+ "version": "0.1.76",
4
4
  "description": "AI CHAT EXTENSION",
5
5
  "keywords": [
6
6
  "jupyter",