portacode 1.3.28__py3-none-any.whl → 1.3.30__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.
Potentially problematic release.
This version of portacode might be problematic. Click here for more details.
- portacode/_version.py +2 -2
- portacode/connection/handlers/file_handlers.py +12 -4
- portacode/connection/handlers/terminal_handlers.py +21 -8
- {portacode-1.3.28.dist-info → portacode-1.3.30.dist-info}/METADATA +1 -1
- {portacode-1.3.28.dist-info → portacode-1.3.30.dist-info}/RECORD +9 -9
- {portacode-1.3.28.dist-info → portacode-1.3.30.dist-info}/WHEEL +0 -0
- {portacode-1.3.28.dist-info → portacode-1.3.30.dist-info}/entry_points.txt +0 -0
- {portacode-1.3.28.dist-info → portacode-1.3.30.dist-info}/licenses/LICENSE +0 -0
- {portacode-1.3.28.dist-info → portacode-1.3.30.dist-info}/top_level.txt +0 -0
portacode/_version.py
CHANGED
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '1.3.
|
|
32
|
-
__version_tuple__ = version_tuple = (1, 3,
|
|
31
|
+
__version__ = version = '1.3.30'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 3, 30)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -383,6 +383,7 @@ class ContentRequestHandler(AsyncHandler):
|
|
|
383
383
|
"""Return content by hash if available, chunked for large content."""
|
|
384
384
|
content_hash = message.get("content_hash")
|
|
385
385
|
source_client_session = message.get("source_client_session")
|
|
386
|
+
server_project_id = message.get("project_id")
|
|
386
387
|
|
|
387
388
|
if not content_hash:
|
|
388
389
|
raise ValueError("content_hash parameter is required")
|
|
@@ -391,23 +392,27 @@ class ContentRequestHandler(AsyncHandler):
|
|
|
391
392
|
content = _content_cache.get(content_hash)
|
|
392
393
|
|
|
393
394
|
if content is not None:
|
|
394
|
-
|
|
395
|
+
|
|
395
396
|
base_response = {
|
|
396
397
|
"event": "content_response",
|
|
397
398
|
"content_hash": content_hash,
|
|
398
399
|
"success": True,
|
|
399
400
|
}
|
|
401
|
+
|
|
402
|
+
# Add request_id if present in original message
|
|
403
|
+
if "request_id" in message:
|
|
404
|
+
base_response["request_id"] = message["request_id"]
|
|
400
405
|
|
|
401
406
|
# Create chunked responses
|
|
402
407
|
responses = create_chunked_response(base_response, "content", content)
|
|
403
408
|
|
|
404
409
|
# Send all responses
|
|
405
410
|
for response in responses:
|
|
406
|
-
await self.send_response(response, project_id=
|
|
411
|
+
await self.send_response(response, project_id=server_project_id)
|
|
407
412
|
|
|
408
413
|
logger.info(f"Sent content response in {len(responses)} chunk(s) for hash: {content_hash[:16]}...")
|
|
409
414
|
else:
|
|
410
|
-
|
|
415
|
+
|
|
411
416
|
response = {
|
|
412
417
|
"event": "content_response",
|
|
413
418
|
"content_hash": content_hash,
|
|
@@ -416,7 +421,10 @@ class ContentRequestHandler(AsyncHandler):
|
|
|
416
421
|
"error": "Content not found in cache",
|
|
417
422
|
"chunked": False,
|
|
418
423
|
}
|
|
419
|
-
|
|
424
|
+
# Add request_id if present in original message
|
|
425
|
+
if "request_id" in message:
|
|
426
|
+
base_response["request_id"] = message["request_id"]
|
|
427
|
+
await self.send_response(response, project_id=server_project_id)
|
|
420
428
|
|
|
421
429
|
|
|
422
430
|
def cache_content(content_hash: str, content: str) -> None:
|
|
@@ -218,24 +218,33 @@ class TerminalListHandler(AsyncHandler):
|
|
|
218
218
|
|
|
219
219
|
async def handle(self, message: Dict[str, Any], reply_channel: Optional[str] = None) -> None:
|
|
220
220
|
"""Handle the command by executing it and sending the response to the requesting client session."""
|
|
221
|
-
logger.info("handler: Processing command %s with reply_channel=%s",
|
|
221
|
+
logger.info("handler: Processing command %s with reply_channel=%s",
|
|
222
222
|
self.command_name, reply_channel)
|
|
223
|
-
|
|
223
|
+
|
|
224
224
|
try:
|
|
225
225
|
response = await self.execute(message)
|
|
226
226
|
logger.info("handler: Command %s executed successfully", self.command_name)
|
|
227
|
-
|
|
227
|
+
|
|
228
|
+
# Automatically copy request_id if present in the incoming message
|
|
229
|
+
if "request_id" in message and "request_id" not in response:
|
|
230
|
+
response["request_id"] = message["request_id"]
|
|
231
|
+
|
|
228
232
|
# Get the source client session from the message
|
|
229
233
|
source_client_session = message.get("source_client_session")
|
|
230
234
|
project_id = response.get("project_id")
|
|
231
|
-
|
|
232
|
-
logger.info("handler: %s response project_id=%s, source_client_session=%s",
|
|
235
|
+
|
|
236
|
+
logger.info("handler: %s response project_id=%s, source_client_session=%s",
|
|
233
237
|
self.command_name, project_id, source_client_session)
|
|
234
|
-
|
|
238
|
+
|
|
235
239
|
# Send response only to the requesting client session
|
|
236
240
|
if source_client_session:
|
|
237
241
|
# Add client_sessions field to target only the requesting session
|
|
238
242
|
response["client_sessions"] = [source_client_session]
|
|
243
|
+
|
|
244
|
+
import json
|
|
245
|
+
logger.info("handler: 📤 SENDING EVENT '%s' (via direct control_channel.send)", response.get("event", "unknown"))
|
|
246
|
+
logger.info("handler: 📤 FULL EVENT PAYLOAD: %s", json.dumps(response, indent=2, default=str))
|
|
247
|
+
|
|
239
248
|
await self.control_channel.send(response)
|
|
240
249
|
else:
|
|
241
250
|
# Fallback to original behavior if no source_client_session
|
|
@@ -249,15 +258,19 @@ class TerminalListHandler(AsyncHandler):
|
|
|
249
258
|
session_manager = self.context.get("session_manager")
|
|
250
259
|
if not session_manager:
|
|
251
260
|
raise RuntimeError("Session manager not available")
|
|
252
|
-
|
|
261
|
+
|
|
253
262
|
# Accept project_id argument: None (default) = only no project, 'all' = all, else = filter by project_id
|
|
254
263
|
requested_project_id = message.get("project_id")
|
|
264
|
+
logger.info("terminal_list: requested_project_id=%r (type: %s)", requested_project_id, type(requested_project_id))
|
|
255
265
|
|
|
256
266
|
if requested_project_id == "all":
|
|
267
|
+
logger.info("terminal_list: Using 'all' mode to list all terminals")
|
|
257
268
|
sessions = session_manager.list_sessions(project_id="all")
|
|
258
269
|
else:
|
|
270
|
+
logger.info("terminal_list: Filtering by project_id=%r", requested_project_id)
|
|
259
271
|
sessions = session_manager.list_sessions(project_id=requested_project_id)
|
|
260
|
-
|
|
272
|
+
|
|
273
|
+
logger.info("terminal_list: Found %d sessions, returning with project_id=%r", len(sessions), requested_project_id)
|
|
261
274
|
return {
|
|
262
275
|
"event": "terminal_list",
|
|
263
276
|
"sessions": sessions,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
portacode/README.md,sha256=4dKtpvR8LNgZPVz37GmkQCMWIr_u25Ao63iW56s7Ke4,775
|
|
2
2
|
portacode/__init__.py,sha256=oB3sV1wXr-um-RXio73UG8E5Xx6cF2ZVJveqjNmC-vQ,1086
|
|
3
3
|
portacode/__main__.py,sha256=jmHTGC1hzmo9iKJLv-SSYe9BSIbPPZ2IOpecI03PlTs,296
|
|
4
|
-
portacode/_version.py,sha256=
|
|
4
|
+
portacode/_version.py,sha256=8UajrTwQ56tRwaDFCg4WEvI9v0ndkxuy6bK5yyvGTFI,706
|
|
5
5
|
portacode/cli.py,sha256=eDqcZMVFHKzqqWxedhhx8ylu5WMVCLqeJQkbPR7RcJE,16333
|
|
6
6
|
portacode/data.py,sha256=5-s291bv8J354myaHm1Y7CQZTZyRzMU3TGe5U4hb-FA,1591
|
|
7
7
|
portacode/keypair.py,sha256=PAcOYqlVLOoZTPYi6LvLjfsY6BkrWbLOhSZLb8r5sHs,3635
|
|
@@ -17,14 +17,14 @@ portacode/connection/handlers/WEBSOCKET_PROTOCOL.md,sha256=U-d58S-X2r5T6QAu-6NOz
|
|
|
17
17
|
portacode/connection/handlers/__init__.py,sha256=4nv3Z4TGYjWcauKPWsbL_FbrTXApI94V7j6oiU1Vv-o,2144
|
|
18
18
|
portacode/connection/handlers/base.py,sha256=oENFb-Fcfzwk99Qx8gJQriEMiwSxwygwjOiuCH36hM4,10231
|
|
19
19
|
portacode/connection/handlers/chunked_content.py,sha256=h6hXRmxSeOgnIxoU8CkmvEf2Odv-ajPrpHIe_W3GKcA,9251
|
|
20
|
-
portacode/connection/handlers/file_handlers.py,sha256=
|
|
20
|
+
portacode/connection/handlers/file_handlers.py,sha256=kBj-o3HkqZTKsju2ZxRgBB3Ke42dn4sDQQKGO7APYf8,15451
|
|
21
21
|
portacode/connection/handlers/project_aware_file_handlers.py,sha256=n0M2WmBNWPwzigdIkyZiAsePUQGXVqYSsDyOxm-Nsok,9253
|
|
22
22
|
portacode/connection/handlers/project_state_handlers.py,sha256=v6ZefGW9i7n1aZLq2jOGumJIjYb6aHlPI4m1jkYewm8,1686
|
|
23
23
|
portacode/connection/handlers/registry.py,sha256=qXGE60sYEWg6ZtVQzFcZ5YI2XWR6lMgw4hAL9x5qR1I,6181
|
|
24
24
|
portacode/connection/handlers/session.py,sha256=O7TMI5cRziOiXEBWCfBshkMpEthhjvKqGL0hhNOG1wU,26716
|
|
25
25
|
portacode/connection/handlers/system_handlers.py,sha256=65V5ctT0dIBc-oWG91e62MbdvU0z6x6JCTQuIqCWmZ0,5242
|
|
26
26
|
portacode/connection/handlers/tab_factory.py,sha256=VBZnwtxgeNJCsfBzUjkFWAAGBdijvai4MS2dXnhFY8U,18000
|
|
27
|
-
portacode/connection/handlers/terminal_handlers.py,sha256=
|
|
27
|
+
portacode/connection/handlers/terminal_handlers.py,sha256=HRwHW1GiqG1NtHVEqXHKaYkFfQEzCDDH6YIlHcb4XD8,11866
|
|
28
28
|
portacode/connection/handlers/project_state/README.md,sha256=trdd4ig6ungmwH5SpbSLfyxbL-QgPlGNU-_XrMEiXtw,10114
|
|
29
29
|
portacode/connection/handlers/project_state/__init__.py,sha256=5ucIqk6Iclqg6bKkL8r_wVs5Tlt6B9J7yQH6yQUt7gc,2541
|
|
30
30
|
portacode/connection/handlers/project_state/file_system_watcher.py,sha256=w-93ioUZZKZxzPFr8djJnGhWjMVFVdDsmo0fVAukoKk,10150
|
|
@@ -38,7 +38,7 @@ portacode/static/js/utils/ntp-clock.js,sha256=KMeHGT-IlUSlxVRZZ899z25dQCJh6EJbgX
|
|
|
38
38
|
portacode/utils/NTP_ARCHITECTURE.md,sha256=WkESTbz5SNAgdmDKk3DrHMhtYOPji_Kt3_a9arWdRig,3894
|
|
39
39
|
portacode/utils/__init__.py,sha256=NgBlWTuNJESfIYJzP_3adI1yJQJR0XJLRpSdVNaBAN0,33
|
|
40
40
|
portacode/utils/ntp_clock.py,sha256=6QJOVZr9VQuxIyJt9KNG4dR-nZ3bKNyipMxjqDWP89Y,5152
|
|
41
|
-
portacode-1.3.
|
|
41
|
+
portacode-1.3.30.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
|
|
42
42
|
test_modules/README.md,sha256=Do_agkm9WhSzueXjRAkV_xEj6Emy5zB3N3VKY5Roce8,9274
|
|
43
43
|
test_modules/__init__.py,sha256=1LcbHodIHsB0g-g4NGjSn6AMuCoGbymvXPYLOb6Z7F0,53
|
|
44
44
|
test_modules/test_device_online.py,sha256=yiSyVaMwKAugqIX_ZIxmLXiOlmA_8IRXiUp12YmpB98,1653
|
|
@@ -63,8 +63,8 @@ testing_framework/core/playwright_manager.py,sha256=8xl-19b8NQjKNdiRyDjyeXlYyKPZ
|
|
|
63
63
|
testing_framework/core/runner.py,sha256=j2QwNJmAxVBmJvcbVS7DgPJUKPNzqfLmt_4NNdaKmZU,19297
|
|
64
64
|
testing_framework/core/shared_cli_manager.py,sha256=BESSNtyQb7BOlaOvZmm04T8Uezjms4KCBs2MzTxvzYQ,8790
|
|
65
65
|
testing_framework/core/test_discovery.py,sha256=2FZ9fJ8Dp5dloA-fkgXoJ_gCMC_nYPBnA3Hs2xlagzM,4928
|
|
66
|
-
portacode-1.3.
|
|
67
|
-
portacode-1.3.
|
|
68
|
-
portacode-1.3.
|
|
69
|
-
portacode-1.3.
|
|
70
|
-
portacode-1.3.
|
|
66
|
+
portacode-1.3.30.dist-info/METADATA,sha256=3xWMA6M-dWJki0dVUMoFw8UiMNBrhs0WiWe1ZARA9Yw,6989
|
|
67
|
+
portacode-1.3.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
68
|
+
portacode-1.3.30.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
|
|
69
|
+
portacode-1.3.30.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
|
|
70
|
+
portacode-1.3.30.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|