portacode 0.3.16.dev2__tar.gz → 0.3.16.dev4__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.
Files changed (44) hide show
  1. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/PKG-INFO +1 -1
  2. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/_version.py +2 -2
  3. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/handlers/project_state_handlers.py +24 -24
  4. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/terminal.py +1 -1
  5. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode.egg-info/PKG-INFO +1 -1
  6. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/.claude/agents/communication-manager.md +0 -0
  7. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/.claude/settings.local.json +0 -0
  8. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/.gitignore +0 -0
  9. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/.gitmodules +0 -0
  10. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/LICENSE +0 -0
  11. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/MANIFEST.in +0 -0
  12. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/Makefile +0 -0
  13. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/README.md +0 -0
  14. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/backup.sh +0 -0
  15. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/docker-compose.yaml +0 -0
  16. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/README.md +0 -0
  17. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/__init__.py +0 -0
  18. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/__main__.py +0 -0
  19. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/cli.py +0 -0
  20. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/README.md +0 -0
  21. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/__init__.py +0 -0
  22. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/client.py +0 -0
  23. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/handlers/README.md +0 -0
  24. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +0 -0
  25. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/handlers/__init__.py +0 -0
  26. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/handlers/base.py +0 -0
  27. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/handlers/file_handlers.py +0 -0
  28. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/handlers/registry.py +0 -0
  29. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/handlers/session.py +0 -0
  30. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/handlers/system_handlers.py +0 -0
  31. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/handlers/terminal_handlers.py +0 -0
  32. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/connection/multiplex.py +0 -0
  33. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/data.py +0 -0
  34. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/keypair.py +0 -0
  35. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode/service.py +0 -0
  36. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode.egg-info/SOURCES.txt +0 -0
  37. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode.egg-info/dependency_links.txt +0 -0
  38. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode.egg-info/entry_points.txt +0 -0
  39. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode.egg-info/requires.txt +0 -0
  40. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/portacode.egg-info/top_level.txt +0 -0
  41. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/pyproject.toml +0 -0
  42. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/restore.sh +0 -0
  43. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/setup.cfg +0 -0
  44. {portacode-0.3.16.dev2 → portacode-0.3.16.dev4}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: portacode
3
- Version: 0.3.16.dev2
3
+ Version: 0.3.16.dev4
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.3.16.dev2'
21
- __version_tuple__ = version_tuple = (0, 3, 16, 'dev2')
20
+ __version__ = version = '0.3.16.dev4'
21
+ __version_tuple__ = version_tuple = (0, 3, 16, 'dev4')
@@ -315,8 +315,8 @@ class ProjectStateManager:
315
315
  git_status_summary=git_manager.get_status_summary()
316
316
  )
317
317
 
318
- # Load initial file structure
319
- await self._load_directory_items(project_state, project_folder_path, is_root=True)
318
+ # Load initial file structure with recursive expanded folder loading
319
+ await self._load_expanded_folders_recursively(project_state)
320
320
 
321
321
  # Start watching the project folder
322
322
  self.file_watcher.start_watching(project_folder_path)
@@ -372,10 +372,6 @@ class ProjectStateManager:
372
372
 
373
373
  if is_root:
374
374
  project_state.items = items
375
- # Load one level down for folders to enable immediate expansion
376
- for item in items:
377
- if item.is_directory:
378
- await self._load_directory_items(project_state, item.path, parent_item=item)
379
375
  elif parent_item:
380
376
  parent_item.children = items
381
377
  parent_item.is_loaded = True
@@ -383,6 +379,24 @@ class ProjectStateManager:
383
379
  except (OSError, PermissionError) as e:
384
380
  logger.error("Error loading directory %s: %s", directory_path, e)
385
381
 
382
+ async def _load_expanded_folders_recursively(self, project_state: ProjectState):
383
+ """Load one level down for all expanded folders recursively."""
384
+ # First load root level
385
+ await self._load_directory_items(project_state, project_state.project_folder_path, is_root=True)
386
+
387
+ # Then load one level down for all expanded folders
388
+ for folder_path in project_state.expanded_folders:
389
+ folder_item = self._find_item_by_path(project_state.items, folder_path)
390
+ if folder_item and folder_item.is_directory:
391
+ # Load the folder's immediate children
392
+ await self._load_directory_items(project_state, folder_path, parent_item=folder_item)
393
+
394
+ # Load one level down for each subfolder in this expanded folder
395
+ if folder_item.children:
396
+ for child in folder_item.children:
397
+ if child.is_directory and not child.is_loaded:
398
+ await self._load_directory_items(project_state, child.path, parent_item=child)
399
+
386
400
  async def expand_folder(self, project_id: str, folder_path: str) -> bool:
387
401
  """Expand a folder and load its contents."""
388
402
  if project_id not in self.projects:
@@ -395,21 +409,14 @@ class ProjectStateManager:
395
409
  if not folder_item or not folder_item.is_directory:
396
410
  return False
397
411
 
398
- # Load children if not already loaded
399
- if not folder_item.is_loaded:
400
- await self._load_directory_items(project_state, folder_path, parent_item=folder_item)
401
-
402
412
  folder_item.is_expanded = True
403
413
  project_state.expanded_folders.add(folder_path)
404
414
 
405
415
  # Start watching this folder
406
416
  self.file_watcher.start_watching(folder_path)
407
417
 
408
- # Preload one level down for newly expanded folders
409
- if folder_item.children:
410
- for child in folder_item.children:
411
- if child.is_directory and not child.is_loaded:
412
- await self._load_directory_items(project_state, child.path, parent_item=child)
418
+ # Reload the entire structure to ensure consistency with recursive loading
419
+ await self._load_expanded_folders_recursively(project_state)
413
420
 
414
421
  self._write_debug_state()
415
422
  return True
@@ -539,15 +546,8 @@ class ProjectStateManager:
539
546
  self._write_debug_state()
540
547
 
541
548
  async def _reload_visible_structures(self, project_state: ProjectState):
542
- """Reload only visible (expanded) directory structures."""
543
- # Reload root
544
- await self._load_directory_items(project_state, project_state.project_folder_path, is_root=True)
545
-
546
- # Reload expanded folders
547
- for folder_path in project_state.expanded_folders:
548
- folder_item = self._find_item_by_path(project_state.items, folder_path)
549
- if folder_item and folder_item.is_directory:
550
- await self._load_directory_items(project_state, folder_path, parent_item=folder_item)
549
+ """Reload all visible structures with recursive expanded folder loading."""
550
+ await self._load_expanded_folders_recursively(project_state)
551
551
 
552
552
  async def _send_project_state_update(self, project_state: ProjectState):
553
553
  """Send project state update to clients."""
@@ -461,7 +461,7 @@ class TerminalManager:
461
461
  "open_files": list(project_state.open_files),
462
462
  "active_file": project_state.active_file,
463
463
  "expanded_folders": list(project_state.expanded_folders),
464
- "root_items": [manager._serialize_file_item(item) for item in project_state.root_items],
464
+ "items": [manager._serialize_file_item(item) for item in project_state.items],
465
465
  "timestamp": time.time(),
466
466
  "client_sessions": [session_name] # Target this specific session
467
467
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: portacode
3
- Version: 0.3.16.dev2
3
+ Version: 0.3.16.dev4
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
File without changes