portacode 1.3.27__tar.gz → 1.3.27.dev1__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.

Potentially problematic release.


This version of portacode might be problematic. Click here for more details.

Files changed (93) hide show
  1. {portacode-1.3.27 → portacode-1.3.27.dev1}/PKG-INFO +1 -1
  2. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/_version.py +2 -2
  3. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode.egg-info/PKG-INFO +1 -1
  4. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode.egg-info/SOURCES.txt +1 -3
  5. portacode-1.3.27/portacode/utils/NTP_ARCHITECTURE.md +0 -136
  6. portacode-1.3.27/tools/test_python_ntp_clock.py +0 -39
  7. {portacode-1.3.27 → portacode-1.3.27.dev1}/.claude/agents/communication-manager.md +0 -0
  8. {portacode-1.3.27 → portacode-1.3.27.dev1}/.claude/settings.local.json +0 -0
  9. {portacode-1.3.27 → portacode-1.3.27.dev1}/.gitignore +0 -0
  10. {portacode-1.3.27 → portacode-1.3.27.dev1}/.gitmodules +0 -0
  11. {portacode-1.3.27 → portacode-1.3.27.dev1}/LICENSE +0 -0
  12. {portacode-1.3.27 → portacode-1.3.27.dev1}/MANIFEST.in +0 -0
  13. {portacode-1.3.27 → portacode-1.3.27.dev1}/Makefile +0 -0
  14. {portacode-1.3.27 → portacode-1.3.27.dev1}/README.md +0 -0
  15. {portacode-1.3.27 → portacode-1.3.27.dev1}/backup.sh +0 -0
  16. {portacode-1.3.27 → portacode-1.3.27.dev1}/connect.py +0 -0
  17. {portacode-1.3.27 → portacode-1.3.27.dev1}/connect.sh +0 -0
  18. {portacode-1.3.27 → portacode-1.3.27.dev1}/docker-compose.yaml +0 -0
  19. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/README.md +0 -0
  20. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/__init__.py +0 -0
  21. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/__main__.py +0 -0
  22. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/cli.py +0 -0
  23. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/README.md +0 -0
  24. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/__init__.py +0 -0
  25. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/client.py +0 -0
  26. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/README.md +0 -0
  27. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +0 -0
  28. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/__init__.py +0 -0
  29. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/base.py +0 -0
  30. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/chunked_content.py +0 -0
  31. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/file_handlers.py +0 -0
  32. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/project_aware_file_handlers.py +0 -0
  33. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/project_state/README.md +0 -0
  34. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/project_state/__init__.py +0 -0
  35. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/project_state/file_system_watcher.py +0 -0
  36. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/project_state/git_manager.py +0 -0
  37. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/project_state/handlers.py +0 -0
  38. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/project_state/manager.py +0 -0
  39. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/project_state/models.py +0 -0
  40. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/project_state/utils.py +0 -0
  41. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/project_state_handlers.py +0 -0
  42. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/registry.py +0 -0
  43. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/session.py +0 -0
  44. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/system_handlers.py +0 -0
  45. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/tab_factory.py +0 -0
  46. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/handlers/terminal_handlers.py +0 -0
  47. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/multiplex.py +0 -0
  48. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/connection/terminal.py +0 -0
  49. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/data.py +0 -0
  50. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/keypair.py +0 -0
  51. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/logging_categories.py +0 -0
  52. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/service.py +0 -0
  53. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/static/js/test-ntp-clock.html +0 -0
  54. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/static/js/utils/ntp-clock.js +0 -0
  55. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/utils/__init__.py +0 -0
  56. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode/utils/ntp_clock.py +0 -0
  57. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode.egg-info/dependency_links.txt +0 -0
  58. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode.egg-info/entry_points.txt +0 -0
  59. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode.egg-info/requires.txt +0 -0
  60. {portacode-1.3.27 → portacode-1.3.27.dev1}/portacode.egg-info/top_level.txt +0 -0
  61. {portacode-1.3.27 → portacode-1.3.27.dev1}/pyproject.toml +0 -0
  62. {portacode-1.3.27 → portacode-1.3.27.dev1}/restore.sh +0 -0
  63. {portacode-1.3.27 → portacode-1.3.27.dev1}/run_tests.py +0 -0
  64. {portacode-1.3.27 → portacode-1.3.27.dev1}/setup.cfg +0 -0
  65. {portacode-1.3.27 → portacode-1.3.27.dev1}/setup.py +0 -0
  66. {portacode-1.3.27 → portacode-1.3.27.dev1}/test.sh +0 -0
  67. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/README.md +0 -0
  68. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/__init__.py +0 -0
  69. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/test_device_online.py +0 -0
  70. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/test_file_operations.py +0 -0
  71. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/test_git_status_ui.py +0 -0
  72. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/test_login_flow.py +0 -0
  73. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/test_navigate_testing_folder.py +0 -0
  74. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/test_terminal_buffer_performance.py +0 -0
  75. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/test_terminal_interaction.py +0 -0
  76. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/test_terminal_loading_race_condition.py +0 -0
  77. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_modules/test_terminal_start.py +0 -0
  78. {portacode-1.3.27 → portacode-1.3.27.dev1}/test_request_id.py +0 -0
  79. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/.env.example +0 -0
  80. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/README.md +0 -0
  81. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/__init__.py +0 -0
  82. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/cli.py +0 -0
  83. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/core/__init__.py +0 -0
  84. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/core/base_test.py +0 -0
  85. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/core/cli_manager.py +0 -0
  86. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/core/hierarchical_runner.py +0 -0
  87. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/core/playwright_manager.py +0 -0
  88. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/core/runner.py +0 -0
  89. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/core/shared_cli_manager.py +0 -0
  90. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/core/test_discovery.py +0 -0
  91. {portacode-1.3.27 → portacode-1.3.27.dev1}/testing_framework/requirements.txt +0 -0
  92. {portacode-1.3.27 → portacode-1.3.27.dev1}/todo/issues/indefinite_resource_loading.md +0 -0
  93. {portacode-1.3.27 → portacode-1.3.27.dev1}/todo/issues/premature_terminal_exit.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.3.27
3
+ Version: 1.3.27.dev1
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
@@ -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.27'
32
- __version_tuple__ = version_tuple = (1, 3, 27)
31
+ __version__ = version = '1.3.27.dev1'
32
+ __version_tuple__ = version_tuple = (1, 3, 27, 'dev1')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.3.27
3
+ Version: 1.3.27.dev1
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
@@ -59,7 +59,6 @@ portacode/connection/handlers/project_state/models.py
59
59
  portacode/connection/handlers/project_state/utils.py
60
60
  portacode/static/js/test-ntp-clock.html
61
61
  portacode/static/js/utils/ntp-clock.js
62
- portacode/utils/NTP_ARCHITECTURE.md
63
62
  portacode/utils/__init__.py
64
63
  portacode/utils/ntp_clock.py
65
64
  test_modules/README.md
@@ -87,5 +86,4 @@ testing_framework/core/runner.py
87
86
  testing_framework/core/shared_cli_manager.py
88
87
  testing_framework/core/test_discovery.py
89
88
  todo/issues/indefinite_resource_loading.md
90
- todo/issues/premature_terminal_exit.md
91
- tools/test_python_ntp_clock.py
89
+ todo/issues/premature_terminal_exit.md
@@ -1,136 +0,0 @@
1
- # NTP Clock Architecture
2
-
3
- ## Overview
4
-
5
- All entities (client, server, device) synchronize to **time.cloudflare.com** for distributed tracing.
6
-
7
- ## Architecture: Single Package for Everything
8
-
9
- All NTP clock implementations (Python and JavaScript) are in the **portacode package** to ensure DRY principles.
10
-
11
- ## Python Implementation
12
-
13
- **Location:** `portacode/utils/ntp_clock.py` (in portacode package)
14
-
15
- ### Import Path
16
- ```python
17
- from portacode.utils.ntp_clock import ntp_clock
18
- ```
19
-
20
- ### Usage Locations
21
- 1. **Django Server Consumers** (`server/portacode_django/dashboard/consumers.py`)
22
- 2. **Device Base Handlers** (`portacode/connection/handlers/base.py`)
23
- 3. **Device Client** (`server/portacode_django/data/services/device_client.py`)
24
- 4. **Any Python code with portacode installed**
25
-
26
- ### Dependencies
27
- - `setup.py`: Added `ntplib>=0.4.0` to `install_requires`
28
- - `server/portacode_django/requirements.txt`: Added `portacode>=1.3.26`
29
-
30
- ### API
31
- ```python
32
- # Get NTP-synchronized timestamp (None if not synced)
33
- ntp_clock.now_ms() # milliseconds
34
- ntp_clock.now() # seconds
35
- ntp_clock.now_iso() # ISO format
36
-
37
- # Check sync status
38
- status = ntp_clock.get_status()
39
- # {
40
- # 'server': 'time.cloudflare.com',
41
- # 'offset_ms': 6.04,
42
- # 'last_sync': '2025-10-05T04:37:12.768445+00:00',
43
- # 'is_synced': True
44
- # }
45
- ```
46
-
47
- ## JavaScript Implementation
48
-
49
- **Location:** `portacode/static/js/utils/ntp-clock.js` (in portacode package)
50
-
51
- ### Django Setup
52
-
53
- Django will serve static files from the portacode package automatically after `collectstatic`:
54
-
55
- ```python
56
- # Django settings.py - no changes needed, just ensure:
57
- INSTALLED_APPS = [
58
- # ... other apps
59
- 'portacode', # Add portacode as an installed app (optional, for admin integration)
60
- ]
61
-
62
- # Static files will be collected from portacode package
63
- STATIC_URL = '/static/'
64
- ```
65
-
66
- After installing portacode (`pip install portacode` or `pip install -e .`), run:
67
- ```bash
68
- python manage.py collectstatic
69
- ```
70
-
71
- This will copy `portacode/static/js/utils/ntp-clock.js` to Django's static files directory.
72
-
73
- ### Import Path (in Django templates/JS)
74
- ```javascript
75
- import ntpClock from '/static/js/utils/ntp-clock.js';
76
- // or relative to your JS file:
77
- import ntpClock from './utils/ntp-clock.js';
78
- ```
79
-
80
- ### Usage Locations
81
- 1. **Dashboard WebSocket** (`websocket-service.js`)
82
- 2. **Project WebSocket** (`websocket-service-project.js`)
83
-
84
- ### API
85
- ```javascript
86
- // Get NTP-synchronized timestamp (null if not synced)
87
- ntpClock.now() // milliseconds
88
- ntpClock.nowISO() // ISO format
89
-
90
- // Check sync status
91
- const status = ntpClock.getStatus();
92
- // {
93
- // server: 'time.cloudflare.com',
94
- // offset: 6.04,
95
- // lastSync: '2025-10-05T04:37:12.768445+00:00',
96
- // isSynced: true
97
- // }
98
- ```
99
-
100
- ## Design Principles
101
-
102
- 1. **DRY (Don't Repeat Yourself)**
103
- - **Python:** Single implementation in portacode package (`portacode/utils/ntp_clock.py`)
104
- - **JavaScript:** Single implementation in portacode package (`portacode/static/js/utils/ntp-clock.js`)
105
- - Both served from the same package, no duplication across repos
106
-
107
- 2. **No Fallback Servers**
108
- - All entities MUST sync to time.cloudflare.com
109
- - If sync fails, timestamps are None/null
110
- - Ensures all timestamps are comparable
111
-
112
- 3. **Auto-Sync**
113
- - Re-syncs every 5 minutes automatically
114
- - Initial sync on import/load
115
- - Max 3 retry attempts before marking as failed
116
-
117
- 4. **Thread-Safe (Python)**
118
- - Uses threading.Lock for concurrent access
119
- - Background daemon thread for periodic sync
120
-
121
- ## Testing
122
-
123
- ### Python
124
- ```bash
125
- python tools/test_python_ntp_clock.py
126
- ```
127
-
128
- ### JavaScript
129
- The test file is included in the package at `portacode/static/js/test-ntp-clock.html`.
130
-
131
- After Django collectstatic, open: `/static/js/test-ntp-clock.html` in browser
132
-
133
- Or run directly from package:
134
- ```bash
135
- python -c "import portacode, os; print(os.path.join(os.path.dirname(portacode.__file__), 'static/js/test-ntp-clock.html'))"
136
- ```
@@ -1,39 +0,0 @@
1
- """Test Python NTP Clock"""
2
- import time
3
- from portacode.utils.ntp_clock import ntp_clock
4
-
5
- print("=" * 50)
6
- print("Testing Python NTP Clock")
7
- print("=" * 50)
8
-
9
- # Wait for initial sync
10
- print("\nWaiting for initial sync...")
11
- time.sleep(2)
12
-
13
- # Print status
14
- status = ntp_clock.get_status()
15
- print(f"\nSync Status: {'✅ SYNCED' if status['is_synced'] else '❌ NOT SYNCED'}")
16
- print(f"Server: {status['server']}")
17
- print(f"Offset: {status['offset_ms']}ms" if status['offset_ms'] is not None else "Offset: None")
18
- print(f"Last Sync: {status['last_sync']}")
19
-
20
- # Compare timestamps
21
- print("\nTimestamp Comparison:")
22
- print(f" Local time (ms): {int(time.time() * 1000)}")
23
- ntp_time = ntp_clock.now_ms()
24
- print(f" NTP time (ms): {ntp_time if ntp_time is not None else 'None (not synced)'}")
25
- ntp_iso = ntp_clock.now_iso()
26
- print(f" NTP time (ISO): {ntp_iso if ntp_iso is not None else 'None (not synced)'}")
27
-
28
- # Test multiple calls
29
- print("\nTesting consistency (10 calls):")
30
- for i in range(10):
31
- ts = ntp_clock.now_ms()
32
- if ts is not None:
33
- print(f" {i+1}: {ts}")
34
- else:
35
- print(f" {i+1}: None (not synced)")
36
- time.sleep(0.1)
37
-
38
- print("\n✅ Test complete")
39
- print("=" * 50)
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
File without changes
File without changes
File without changes
File without changes