portacode 0.3.20.dev7__tar.gz → 0.3.20.dev9__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 (80) hide show
  1. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/PKG-INFO +1 -1
  2. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/_version.py +2 -2
  3. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/centralized_manager.py +173 -3
  4. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/centralized_state.py +13 -2
  5. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/file_system_watcher.py +6 -47
  6. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state_handlers.py +4 -4
  7. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode.egg-info/PKG-INFO +1 -1
  8. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/.claude/agents/communication-manager.md +0 -0
  9. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/.claude/settings.local.json +0 -0
  10. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/.gitignore +0 -0
  11. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/.gitmodules +0 -0
  12. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/LICENSE +0 -0
  13. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/MANIFEST.in +0 -0
  14. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/Makefile +0 -0
  15. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/README.md +0 -0
  16. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/backup.sh +0 -0
  17. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/docker-compose.yaml +0 -0
  18. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/README.md +0 -0
  19. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/__init__.py +0 -0
  20. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/__main__.py +0 -0
  21. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/cli.py +0 -0
  22. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/README.md +0 -0
  23. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/__init__.py +0 -0
  24. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/client.py +0 -0
  25. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/README.md +0 -0
  26. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +0 -0
  27. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/__init__.py +0 -0
  28. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/base.py +0 -0
  29. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/file_handlers.py +0 -0
  30. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/README.md +0 -0
  31. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/__init__.py +0 -0
  32. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/centralized_handlers.py +0 -0
  33. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/git_manager.py +0 -0
  34. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/handlers.py +0 -0
  35. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/manager.py +0 -0
  36. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/models.py +0 -0
  37. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/simplified_file_watcher.py +0 -0
  38. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/project_state/utils.py +0 -0
  39. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/registry.py +0 -0
  40. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/session.py +0 -0
  41. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/system_handlers.py +0 -0
  42. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/tab_factory.py +0 -0
  43. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/handlers/terminal_handlers.py +0 -0
  44. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/multiplex.py +0 -0
  45. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/connection/terminal.py +0 -0
  46. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/data.py +0 -0
  47. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/keypair.py +0 -0
  48. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode/service.py +0 -0
  49. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode.egg-info/SOURCES.txt +0 -0
  50. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode.egg-info/dependency_links.txt +0 -0
  51. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode.egg-info/entry_points.txt +0 -0
  52. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode.egg-info/requires.txt +0 -0
  53. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/portacode.egg-info/top_level.txt +0 -0
  54. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/pyproject.toml +0 -0
  55. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/restore.sh +0 -0
  56. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/run_tests.py +0 -0
  57. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/setup.cfg +0 -0
  58. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/setup.py +0 -0
  59. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/test.sh +0 -0
  60. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/test_modules/README.md +0 -0
  61. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/test_modules/__init__.py +0 -0
  62. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/test_modules/test_device_online.py +0 -0
  63. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/test_modules/test_file_operations.py +0 -0
  64. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/test_modules/test_login_flow.py +0 -0
  65. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/test_modules/test_navigate_testing_folder.py +0 -0
  66. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/test_modules/test_terminal_interaction.py +0 -0
  67. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/test_modules/test_terminal_start.py +0 -0
  68. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/.env.example +0 -0
  69. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/README.md +0 -0
  70. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/__init__.py +0 -0
  71. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/cli.py +0 -0
  72. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/core/__init__.py +0 -0
  73. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/core/base_test.py +0 -0
  74. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/core/cli_manager.py +0 -0
  75. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/core/hierarchical_runner.py +0 -0
  76. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/core/playwright_manager.py +0 -0
  77. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/core/runner.py +0 -0
  78. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/core/shared_cli_manager.py +0 -0
  79. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/core/test_discovery.py +0 -0
  80. {portacode-0.3.20.dev7 → portacode-0.3.20.dev9}/testing_framework/requirements.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: portacode
3
- Version: 0.3.20.dev7
3
+ Version: 0.3.20.dev9
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.20.dev7'
21
- __version_tuple__ = version_tuple = (0, 3, 20, 'dev7')
20
+ __version__ = version = '0.3.20.dev9'
21
+ __version_tuple__ = version_tuple = (0, 3, 20, 'dev9')
@@ -11,7 +11,7 @@ This replaces the old ProjectStateManager with a cleaner design:
11
11
  import asyncio
12
12
  import logging
13
13
  import os
14
- from typing import Dict, List, Optional, Set
14
+ from typing import Dict, List, Optional, Set, Any
15
15
  from pathlib import Path
16
16
 
17
17
  from .centralized_state import (
@@ -46,9 +46,19 @@ class CentralizedProjectStateManager:
46
46
  # File system change tracking
47
47
  self._pending_file_changes: Set[str] = set()
48
48
  self._debounce_timer: Optional[asyncio.Task] = None
49
-
49
+
50
50
  logger.info("Initialized CentralizedProjectStateManager")
51
51
 
52
+ # Backward compatibility properties
53
+ @property
54
+ def projects(self) -> Dict[str, CentralizedProjectState]:
55
+ """Backward compatibility: alias for _project_states."""
56
+ return self._project_states
57
+
58
+ def cleanup_project(self, client_session_id: str):
59
+ """Backward compatibility: alias for cleanup_project_state (sync version)."""
60
+ asyncio.create_task(self.cleanup_project_state(client_session_id))
61
+
52
62
  def get_active_sessions(self) -> List[str]:
53
63
  """Get list of active client session IDs."""
54
64
  return list(self._project_states.keys())
@@ -399,6 +409,20 @@ class CentralizedProjectStateManager:
399
409
  state = self._project_states.get(client_session_id)
400
410
  if state:
401
411
  await self._notification_manager.force_notification(state, server_project_id)
412
+
413
+ # Backward compatibility serialization methods
414
+ def _serialize_tab_info(self, tab: TabInfo) -> Dict[str, Any]:
415
+ """Serialize TabInfo for JSON output."""
416
+ from dataclasses import asdict
417
+ return asdict(tab) if hasattr(tab, '__dataclass_fields__') else {}
418
+
419
+ def _serialize_file_item(self, item: FileItem) -> Dict[str, Any]:
420
+ """Serialize FileItem for JSON output."""
421
+ from dataclasses import asdict
422
+ result = asdict(item) if hasattr(item, '__dataclass_fields__') else {}
423
+ if item.children:
424
+ result["children"] = [self._serialize_file_item(child) for child in item.children]
425
+ return result
402
426
 
403
427
 
404
428
  # Global instance management
@@ -413,4 +437,150 @@ def get_or_create_centralized_manager(context: Dict,
413
437
  _global_manager = CentralizedProjectStateManager(context, control_channel)
414
438
  logger.info("Created new centralized project state manager")
415
439
 
416
- return _global_manager
440
+ return _global_manager
441
+
442
+
443
+ def reset_global_centralized_manager():
444
+ """Reset the global centralized project state manager."""
445
+ global _global_manager
446
+
447
+ if _global_manager:
448
+ # Stop all monitoring
449
+ _global_manager._git_monitor.stop_monitoring()
450
+ if _global_manager._file_watcher:
451
+ _global_manager._file_watcher.stop_all()
452
+
453
+ logger.info("Reset centralized project state manager")
454
+
455
+ _global_manager = None
456
+
457
+
458
+ def debug_global_centralized_manager_state() -> dict:
459
+ """Get debug information about the global centralized manager state."""
460
+ global _global_manager
461
+
462
+ if _global_manager is None:
463
+ return {"error": "No global centralized manager instance"}
464
+
465
+ import os
466
+ debug_info = {
467
+ "_instance_info": {
468
+ "pid": os.getpid(),
469
+ "timestamp": __import__('time').time(),
470
+ "project_count": len(_global_manager._project_states)
471
+ }
472
+ }
473
+
474
+ # Add state for each project
475
+ for client_session_id, state in _global_manager._project_states.items():
476
+ debug_info[f"specific..inmemory!{client_session_id}"] = {
477
+ "project_folder_path": state.project_folder_path,
478
+ "is_git_repo": state.is_git_repo,
479
+ "git_branch": state.git_branch,
480
+ "git_status_summary": state.git_status_summary,
481
+ "git_detailed_status": {
482
+ "head_commit_hash": state.git_detailed_status.head_commit_hash,
483
+ "staged_changes": [
484
+ {
485
+ "file_repo_path": f.file_repo_path,
486
+ "file_name": f.file_name,
487
+ "file_abs_path": f.file_abs_path,
488
+ "change_type": f.change_type,
489
+ "content_hash": f.content_hash,
490
+ "is_staged": f.is_staged,
491
+ "diff_details": {
492
+ "diffs": f.diff_details.diffs if f.diff_details else [],
493
+ "stats": {
494
+ "char_additions": f.diff_details.stats.char_additions if f.diff_details else 0,
495
+ "char_deletions": f.diff_details.stats.char_deletions if f.diff_details else 0,
496
+ "char_unchanged": f.diff_details.stats.char_unchanged if f.diff_details else 0,
497
+ "total_changes": f.diff_details.stats.total_changes if f.diff_details else 0
498
+ },
499
+ "algorithm": f.diff_details.algorithm if f.diff_details else "diff-match-patch"
500
+ }
501
+ } for f in state.git_detailed_status.staged_changes
502
+ ],
503
+ "unstaged_changes": [
504
+ {
505
+ "file_repo_path": f.file_repo_path,
506
+ "file_name": f.file_name,
507
+ "file_abs_path": f.file_abs_path,
508
+ "change_type": f.change_type,
509
+ "content_hash": f.content_hash,
510
+ "is_staged": f.is_staged,
511
+ "diff_details": {
512
+ "diffs": f.diff_details.diffs if f.diff_details else [],
513
+ "stats": {
514
+ "char_additions": f.diff_details.stats.char_additions if f.diff_details else 0,
515
+ "char_deletions": f.diff_details.stats.char_deletions if f.diff_details else 0,
516
+ "char_unchanged": f.diff_details.stats.char_unchanged if f.diff_details else 0,
517
+ "total_changes": f.diff_details.stats.total_changes if f.diff_details else 0
518
+ },
519
+ "algorithm": f.diff_details.algorithm if f.diff_details else "diff-match-patch"
520
+ }
521
+ } for f in state.git_detailed_status.unstaged_changes
522
+ ],
523
+ "untracked_files": [
524
+ {
525
+ "file_repo_path": f.file_repo_path,
526
+ "file_name": f.file_name,
527
+ "file_abs_path": f.file_abs_path,
528
+ "change_type": f.change_type,
529
+ "content_hash": f.content_hash,
530
+ "is_staged": f.is_staged,
531
+ "diff_details": {
532
+ "diffs": f.diff_details.diffs if f.diff_details else [],
533
+ "stats": {
534
+ "char_additions": f.diff_details.stats.char_additions if f.diff_details else 0,
535
+ "char_deletions": f.diff_details.stats.char_deletions if f.diff_details else 0,
536
+ "char_unchanged": f.diff_details.stats.char_unchanged if f.diff_details else 0,
537
+ "total_changes": f.diff_details.stats.total_changes if f.diff_details else 0
538
+ },
539
+ "algorithm": f.diff_details.algorithm if f.diff_details else "diff-match-patch"
540
+ }
541
+ } for f in state.git_detailed_status.untracked_files
542
+ ]
543
+ },
544
+ "open_tabs": [
545
+ {
546
+ "tab_id": tab.tab_id,
547
+ "tab_type": tab.tab_type,
548
+ "title": tab.title,
549
+ "file_path": tab.file_path,
550
+ "content": tab.content,
551
+ "original_content": tab.original_content,
552
+ "modified_content": tab.modified_content,
553
+ "is_dirty": tab.is_dirty,
554
+ "mime_type": tab.mime_type,
555
+ "encoding": tab.encoding,
556
+ "metadata": tab.metadata
557
+ } for tab in state.open_tabs
558
+ ],
559
+ "active_tab": None, # Deprecated in centralized system
560
+ "monitored_folders": [
561
+ {
562
+ "folder_path": folder.folder_path,
563
+ "is_expanded": folder.is_expanded
564
+ } for folder in state.monitored_folders
565
+ ],
566
+ "items": [
567
+ {
568
+ "name": item.name,
569
+ "path": item.path,
570
+ "is_directory": item.is_directory,
571
+ "parent_path": item.parent_path,
572
+ "size": item.size,
573
+ "modified_time": item.modified_time,
574
+ "is_git_tracked": item.is_git_tracked,
575
+ "git_status": item.git_status,
576
+ "is_staged": item.is_staged,
577
+ "is_hidden": item.is_hidden,
578
+ "is_ignored": item.is_ignored,
579
+ "children": item.children,
580
+ "is_expanded": item.is_expanded,
581
+ "is_loaded": item.is_loaded
582
+ } for item in state.items
583
+ ]
584
+ }
585
+
586
+ return debug_info
@@ -122,8 +122,19 @@ class CentralizedProjectState:
122
122
 
123
123
  # Open tabs properties
124
124
  @property
125
- def open_tabs(self) -> Dict[str, TabInfo]:
125
+ def open_tabs(self) -> List[TabInfo]:
126
+ """Return open tabs as a list for backward compatibility."""
127
+ return list(self._open_tabs.values())
128
+
129
+ @property
130
+ def open_tabs_dict(self) -> Dict[str, TabInfo]:
131
+ """Return open tabs as a dict (internal use)."""
126
132
  return self._open_tabs.copy()
133
+
134
+ @property
135
+ def active_tab(self) -> Optional[TabInfo]:
136
+ """Backward compatibility: active_tab is deprecated in centralized system."""
137
+ return None
127
138
 
128
139
  @property
129
140
  def state_version(self) -> int:
@@ -379,7 +390,7 @@ class StateNotificationManager:
379
390
  "to_ref": tab.to_ref,
380
391
  "from_hash": tab.from_hash,
381
392
  "to_hash": tab.to_hash
382
- } for tab in state.open_tabs.values()
393
+ } for tab in state.open_tabs_dict.values()
383
394
  ],
384
395
  "items": [
385
396
  {
@@ -75,37 +75,11 @@ class FileSystemWatcher:
75
75
  logger.info("🔍 [TRACE] Skipping opened/closed event: %s", event.event_type)
76
76
  return
77
77
 
78
- # Handle .git folder events separately for git status monitoring
78
+ # Skip all .git folder events - git monitoring is handled by centralized periodic polling
79
79
  path_parts = Path(event.src_path).parts
80
80
  if '.git' in path_parts:
81
- logger.info("🔍 [TRACE] Processing .git folder event: %s", event.src_path)
82
- # Get the relative path within .git directory
83
- try:
84
- git_index = path_parts.index('.git')
85
- git_relative_path = '/'.join(path_parts[git_index + 1:])
86
- git_file = Path(event.src_path).name
87
-
88
- logger.info("🔍 [TRACE] Git file details - relative_path: %s, file: %s", git_relative_path, git_file)
89
-
90
- # Monitor git files that indicate repository state changes
91
- should_monitor_git_file = (
92
- git_file == 'index' or # Staging area changes
93
- git_file == 'HEAD' or # Branch switches
94
- git_relative_path.startswith('refs/heads/') or # Branch updates
95
- git_relative_path.startswith('refs/remotes/') or # Remote tracking branches
96
- git_relative_path.startswith('logs/refs/heads/') or # Branch history
97
- git_relative_path.startswith('logs/HEAD') or # HEAD history
98
- (git_file == 'index.lock' and event.event_type in ['moved', 'deleted']) # Index updates via lock file
99
- )
100
-
101
- if should_monitor_git_file:
102
- logger.info("🔍 [TRACE] ✅ Git file matches monitoring criteria: %s", event.src_path)
103
- else:
104
- logger.info("🔍 [TRACE] ❌ Git file does NOT match monitoring criteria - SKIPPING: %s", event.src_path)
105
- return # Skip other .git files
106
- except (ValueError, IndexError):
107
- logger.info("🔍 [TRACE] ❌ Could not parse .git path - SKIPPING: %s", event.src_path)
108
- return # Skip if can't parse .git path
81
+ logger.debug("Skipping .git folder event (centralized monitoring active): %s", event.src_path)
82
+ return
109
83
  else:
110
84
  logger.info("🔍 [TRACE] Processing non-git file event: %s", event.src_path)
111
85
  # Only log significant file changes, not every single event
@@ -157,24 +131,9 @@ class FileSystemWatcher:
157
131
 
158
132
  def start_watching_git_directory(self, git_path: str):
159
133
  """Start watching a .git directory for git status changes."""
160
- if not WATCHDOG_AVAILABLE or not self.observer:
161
- logger.warning("Watchdog not available, cannot start watching git directory: %s", git_path)
162
- return
163
-
164
- if git_path not in self.watched_paths:
165
- try:
166
- # Watch .git directory recursively to catch changes in refs/, logs/, etc.
167
- self.observer.schedule(self.event_handler, git_path, recursive=True)
168
- self.watched_paths.add(git_path)
169
- logger.info("Started watching git directory (recursive): %s", git_path)
170
-
171
- if not self.observer.is_alive():
172
- self.observer.start()
173
- logger.info("Started file system observer")
174
- except Exception as e:
175
- logger.error("Error starting git directory watcher for %s: %s", git_path, e)
176
- else:
177
- logger.debug("Git directory already being watched: %s", git_path)
134
+ # DISABLED: Git monitoring is now handled by centralized hash-based periodic polling
135
+ logger.debug("Git directory monitoring disabled - using centralized periodic polling: %s", git_path)
136
+ return
178
137
 
179
138
  def stop_watching(self, path: str):
180
139
  """Stop watching a specific path."""
@@ -29,10 +29,10 @@ from .project_state.centralized_handlers import (
29
29
  handle_centralized_client_session_cleanup as handle_client_session_cleanup
30
30
  )
31
31
 
32
- from .project_state.manager import (
33
- get_or_create_project_state_manager,
34
- reset_global_project_state_manager,
35
- debug_global_manager_state
32
+ from .project_state.centralized_manager import (
33
+ get_or_create_centralized_manager as get_or_create_project_state_manager,
34
+ reset_global_centralized_manager as reset_global_project_state_manager,
35
+ debug_global_centralized_manager_state as debug_global_manager_state
36
36
  )
37
37
 
38
38
  from .project_state.utils import generate_tab_key
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: portacode
3
- Version: 0.3.20.dev7
3
+ Version: 0.3.20.dev9
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
File without changes