portacode 0.3.19.dev4__py3-none-any.whl → 1.4.11.dev1__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.

Files changed (92) hide show
  1. portacode/_version.py +16 -3
  2. portacode/cli.py +143 -17
  3. portacode/connection/client.py +149 -10
  4. portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +824 -21
  5. portacode/connection/handlers/__init__.py +28 -1
  6. portacode/connection/handlers/base.py +78 -16
  7. portacode/connection/handlers/chunked_content.py +244 -0
  8. portacode/connection/handlers/diff_handlers.py +603 -0
  9. portacode/connection/handlers/file_handlers.py +902 -17
  10. portacode/connection/handlers/project_aware_file_handlers.py +226 -0
  11. portacode/connection/handlers/project_state/README.md +312 -0
  12. portacode/connection/handlers/project_state/__init__.py +92 -0
  13. portacode/connection/handlers/project_state/file_system_watcher.py +179 -0
  14. portacode/connection/handlers/project_state/git_manager.py +1502 -0
  15. portacode/connection/handlers/project_state/handlers.py +875 -0
  16. portacode/connection/handlers/project_state/manager.py +1331 -0
  17. portacode/connection/handlers/project_state/models.py +108 -0
  18. portacode/connection/handlers/project_state/utils.py +50 -0
  19. portacode/connection/handlers/project_state_handlers.py +45 -2185
  20. portacode/connection/handlers/proxmox_infra.py +361 -0
  21. portacode/connection/handlers/registry.py +15 -4
  22. portacode/connection/handlers/session.py +483 -32
  23. portacode/connection/handlers/system_handlers.py +147 -8
  24. portacode/connection/handlers/tab_factory.py +53 -46
  25. portacode/connection/handlers/terminal_handlers.py +21 -8
  26. portacode/connection/handlers/update_handler.py +61 -0
  27. portacode/connection/multiplex.py +60 -2
  28. portacode/connection/terminal.py +214 -24
  29. portacode/keypair.py +63 -1
  30. portacode/link_capture/__init__.py +38 -0
  31. portacode/link_capture/__pycache__/__init__.cpython-311.pyc +0 -0
  32. portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-311.pyc +0 -0
  33. portacode/link_capture/bin/elinks +3 -0
  34. portacode/link_capture/bin/gio-open +3 -0
  35. portacode/link_capture/bin/gnome-open +3 -0
  36. portacode/link_capture/bin/gvfs-open +3 -0
  37. portacode/link_capture/bin/kde-open +3 -0
  38. portacode/link_capture/bin/kfmclient +3 -0
  39. portacode/link_capture/bin/link_capture_exec.sh +11 -0
  40. portacode/link_capture/bin/link_capture_wrapper.py +75 -0
  41. portacode/link_capture/bin/links +3 -0
  42. portacode/link_capture/bin/links2 +3 -0
  43. portacode/link_capture/bin/lynx +3 -0
  44. portacode/link_capture/bin/mate-open +3 -0
  45. portacode/link_capture/bin/netsurf +3 -0
  46. portacode/link_capture/bin/sensible-browser +3 -0
  47. portacode/link_capture/bin/w3m +3 -0
  48. portacode/link_capture/bin/x-www-browser +3 -0
  49. portacode/link_capture/bin/xdg-open +3 -0
  50. portacode/logging_categories.py +140 -0
  51. portacode/pairing.py +103 -0
  52. portacode/static/js/test-ntp-clock.html +63 -0
  53. portacode/static/js/utils/ntp-clock.js +232 -0
  54. portacode/utils/NTP_ARCHITECTURE.md +136 -0
  55. portacode/utils/__init__.py +1 -0
  56. portacode/utils/diff_apply.py +456 -0
  57. portacode/utils/diff_renderer.py +371 -0
  58. portacode/utils/ntp_clock.py +65 -0
  59. portacode-1.4.11.dev1.dist-info/METADATA +298 -0
  60. portacode-1.4.11.dev1.dist-info/RECORD +97 -0
  61. {portacode-0.3.19.dev4.dist-info → portacode-1.4.11.dev1.dist-info}/WHEEL +1 -1
  62. portacode-1.4.11.dev1.dist-info/top_level.txt +3 -0
  63. test_modules/README.md +296 -0
  64. test_modules/__init__.py +1 -0
  65. test_modules/test_device_online.py +44 -0
  66. test_modules/test_file_operations.py +743 -0
  67. test_modules/test_git_status_ui.py +370 -0
  68. test_modules/test_login_flow.py +50 -0
  69. test_modules/test_navigate_testing_folder.py +361 -0
  70. test_modules/test_play_store_screenshots.py +294 -0
  71. test_modules/test_terminal_buffer_performance.py +261 -0
  72. test_modules/test_terminal_interaction.py +80 -0
  73. test_modules/test_terminal_loading_race_condition.py +95 -0
  74. test_modules/test_terminal_start.py +56 -0
  75. testing_framework/.env.example +21 -0
  76. testing_framework/README.md +334 -0
  77. testing_framework/__init__.py +17 -0
  78. testing_framework/cli.py +326 -0
  79. testing_framework/core/__init__.py +1 -0
  80. testing_framework/core/base_test.py +336 -0
  81. testing_framework/core/cli_manager.py +177 -0
  82. testing_framework/core/hierarchical_runner.py +577 -0
  83. testing_framework/core/playwright_manager.py +520 -0
  84. testing_framework/core/runner.py +447 -0
  85. testing_framework/core/shared_cli_manager.py +234 -0
  86. testing_framework/core/test_discovery.py +112 -0
  87. testing_framework/requirements.txt +12 -0
  88. portacode-0.3.19.dev4.dist-info/METADATA +0 -241
  89. portacode-0.3.19.dev4.dist-info/RECORD +0 -30
  90. portacode-0.3.19.dev4.dist-info/top_level.txt +0 -1
  91. {portacode-0.3.19.dev4.dist-info → portacode-1.4.11.dev1.dist-info}/entry_points.txt +0 -0
  92. {portacode-0.3.19.dev4.dist-info → portacode-1.4.11.dev1.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,298 @@
1
+ Metadata-Version: 2.4
2
+ Name: portacode
3
+ Version: 1.4.11.dev1
4
+ Summary: Portacode CLI client and SDK
5
+ Home-page: https://github.com/portacode/portacode
6
+ Author: Meena Erian
7
+ Author-email: hi@menas.pro
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.8
10
+ Classifier: Programming Language :: Python :: 3.9
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Requires-Python: >=3.8
16
+ Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+ Requires-Dist: click>=8.0
19
+ Requires-Dist: platformdirs>=3.0
20
+ Requires-Dist: cryptography>=41.0
21
+ Requires-Dist: websockets>=12.0
22
+ Requires-Dist: pyperclip>=1.8
23
+ Requires-Dist: psutil>=5.9
24
+ Requires-Dist: pyte>=0.8
25
+ Requires-Dist: pywinpty>=2.0; platform_system == "Windows"
26
+ Requires-Dist: GitPython>=3.1.45
27
+ Requires-Dist: watchdog>=3.0
28
+ Requires-Dist: diff-match-patch>=20230430
29
+ Requires-Dist: Pygments>=2.14.0
30
+ Requires-Dist: ntplib>=0.4.0
31
+ Requires-Dist: importlib_resources>=6.0
32
+ Provides-Extra: dev
33
+ Requires-Dist: black; extra == "dev"
34
+ Requires-Dist: flake8; extra == "dev"
35
+ Requires-Dist: pytest; extra == "dev"
36
+ Dynamic: author
37
+ Dynamic: author-email
38
+ Dynamic: classifier
39
+ Dynamic: description
40
+ Dynamic: description-content-type
41
+ Dynamic: home-page
42
+ Dynamic: license-file
43
+ Dynamic: provides-extra
44
+ Dynamic: requires-dist
45
+ Dynamic: requires-python
46
+ Dynamic: summary
47
+
48
+ # Portacode
49
+
50
+ **An AI-first, mobile-first IDE and admin tool, made with love and passion by software engineers, for software engineers.**
51
+
52
+ Portacode transforms any device with python into a remotely accessible development environment. Access your home lab, server or even embedded system chip from your phone, code on your desktop or your smartphone from anywhere, or help a colleague debug their server - all through a beautiful web interface designed for the modern developer.
53
+
54
+ ## ✨ Why Portacode?
55
+
56
+ - **🤖 AI-First**: Built from the ground up with AI integration in mind
57
+ - **📱 Mobile-First**: Code and administrate from your phone or tablet
58
+ - **🌍 Global Access**: Connect to your devices from anywhere with internet
59
+ - **🔐 Secure**: HTTPS encrypted with RSA key authentication
60
+ - **⚡ Fast Setup**: Get connected in under 60 seconds
61
+ - **🔄 Always Connected**: Automatic reconnection and persistent service options
62
+ - **🆓 Free Account**: Create your account and start connecting immediately
63
+ - **🖥️ Cross-Platform**: Works on Windows, macOS, and Linux
64
+
65
+ ## 🚀 Quick Start
66
+
67
+ ### 1. Install Portacode
68
+
69
+ ```bash
70
+ pip install portacode
71
+ ```
72
+
73
+ ### 2. Connect Your Device
74
+
75
+ ```bash
76
+ portacode connect
77
+ ```
78
+
79
+ Follow the on-screen instructions to:
80
+ - Visit [https://portacode.com](https://portacode.com)
81
+ - Create your free account
82
+ - Add your device using the generated key
83
+ - Start coding and administrating!
84
+
85
+ ### 3. Access Your Development Environment
86
+
87
+ Once connected, you can:
88
+ - Open terminal sessions from the web dashboard
89
+ - Execute commands remotely
90
+ - Monitor system status
91
+ - Access your development environment from any device
92
+
93
+ Want to see Portacode running inside containers or powering classrooms? Browse the [`examples/` directory](https://github.com/portacode/portacode/tree/master/examples) (also bundled in the PyPI source) for copy-paste Docker Compose setups ranging from a single-device sandbox to a ten-seat workshop fleet.
94
+
95
+ ## 🔑 Pair Devices with Zero-Touch Codes
96
+
97
+ The fastest way to bring a new machine online is with a short-lived pairing code:
98
+
99
+ 1. Log in to [https://portacode.com](https://portacode.com) and press **Pair Device** on the dashboard:
100
+ ![Pair Device button](https://raw.githubusercontent.com/portacode/portacode/master/docs/images/pair-device-button.png)
101
+ 2. A four-digit code appears (valid for 15 minutes). This code only authorizes a pairing **request**—no device can reach your account until you approve it.
102
+ 3. On the device, run Portacode with the code:
103
+ ```bash
104
+ PORTACODE_PAIRING_CODE=1234 portacode connect \
105
+ --device-name "My Laptop" \
106
+ --project-path /srv/project-one \
107
+ --project-path /srv/project-two
108
+ ```
109
+ - `--device-name` (or `PORTACODE_DEVICE_NAME`) pre-fills the friendly label shown in the dashboard.
110
+ - Repeat `--project-path /abs/path` to register up to ten Projects automatically once the request is approved.
111
+ - Automating inside Docker? Export your own `PORTACODE_PROJECT_PATHS=/srv/a:/srv/b` and convert it into repeated `--project-path` switches before invoking the CLI—see `portacode_for_school/persistent_workspace/entrypoint.sh` for a reference implementation.
112
+ 4. Because the device has no fingerprint yet, the CLI bootstraps an in-memory keypair and announces a pending request to the dashboard. You immediately see the card with the supplied metadata:
113
+ ![Pairing request card](https://raw.githubusercontent.com/portacode/portacode/master/docs/images/pairing-request.png)
114
+ 5. Click **Approve**. The CLI persists the keypair on disk and transitions into a normal authenticated connection. Future `portacode connect` runs reuse the stored RSA keys—no additional codes required unless you revoke the device.
115
+
116
+ Need to pair multiple machines at once? A single pairing code can be reused concurrently: every device that launches `portacode connect` with that code shows up as its own approval card until you accept or decline it.
117
+
118
+ This workflow works great for headless setups and containers: export the environment variables, run `portacode connect --non-interactive`, and finish the approval from the dashboard.
119
+
120
+ ## 💡 Use Cases
121
+
122
+ - **Remote Development**: Code, build, and debug from anywhere - even your phone
123
+ - **Server Administration**: 24/7 server access with persistent service installation
124
+ - **Mobile Development**: Full IDE experience on mobile devices
125
+
126
+ ## 🔧 Essential Commands
127
+
128
+ ### Basic Usage
129
+ ```bash
130
+ # Start a connection (runs until closed)
131
+ portacode connect
132
+
133
+ # Run connection in background
134
+ portacode connect --detach
135
+
136
+ # Check version
137
+ portacode --version
138
+
139
+ # Get help
140
+ portacode --help
141
+ ```
142
+
143
+ ### Service Management
144
+ ```bash
145
+ # First, authenticate your device
146
+ portacode connect
147
+
148
+ # For system services, install package system-wide
149
+ sudo pip install portacode --system
150
+
151
+ # Install persistent service (auto-start on boot)
152
+ sudo portacode service install
153
+
154
+ # Check service status (use -v for verbose debugging)
155
+ sudo portacode service status
156
+ sudo portacode service status -v
157
+
158
+ # Stop/remove the service
159
+ sudo portacode service stop
160
+ sudo portacode service uninstall
161
+ ```
162
+
163
+ ## 🌐 Web Dashboard
164
+
165
+ Access your connected devices at [https://portacode.com](https://portacode.com)
166
+
167
+ **Current Features:**
168
+ - Real-time terminal access
169
+ - System monitoring
170
+ - Device management
171
+ - Multi-device switching
172
+ - Secure authentication
173
+
174
+ **Coming Soon:**
175
+ - AI-powered code assistance
176
+ - Mobile-optimized IDE interface
177
+ - File management and editing
178
+ - Collaborative development tools
179
+
180
+ ## 🔐 Security
181
+
182
+ - **RSA Key Authentication**: Each device gets a unique RSA key pair
183
+ - **HTTPS Encrypted**: All communication is encrypted in transit
184
+ - **No Passwords**: Key-based authentication eliminates password risks
185
+ - **Revocable Access**: Remove devices instantly from the web dashboard
186
+ - **Local Key Storage**: Private keys never leave your device
187
+
188
+ ## 🆘 Troubleshooting
189
+
190
+ ### Connection Issues
191
+ ```bash
192
+ # Check if another connection is running
193
+ portacode connect
194
+
195
+ # View service logs
196
+ sudo portacode service status --verbose
197
+ ```
198
+
199
+ ### Service Installation Issues
200
+ ```bash
201
+ # First authenticate your device
202
+ portacode connect
203
+
204
+ # If service commands fail, ensure system-wide installation
205
+ sudo pip install portacode --system
206
+
207
+ # Then try service installation again
208
+ sudo portacode service install
209
+
210
+ # Use verbose status to debug connection issues
211
+ sudo portacode service status -v
212
+ ```
213
+
214
+ ### Clipboard Issues (Linux)
215
+ ```bash
216
+ # Install clipboard support
217
+ sudo apt-get install xclip
218
+ ```
219
+
220
+ ### Key Management
221
+ Portacode follows the OS-specific *user data* directory (via [`platformdirs`](https://pypi.org/project/platformdirs/)) and keeps its identity in `portacode/keys/`:
222
+ - **Linux**: `~/.local/share/portacode/keys/`
223
+ - **macOS**: `~/Library/Application Support/portacode/keys/`
224
+ - **Windows**: `%APPDATA%\portacode\keys\`
225
+
226
+ When `PORTACODE_PAIRING_CODE` is set, the CLI generates an in-memory keypair, waits for dashboard approval, and only then writes the files to this directory. If that folder disappears, the CLI will create a fresh identity next time it runs.
227
+
228
+ #### Persisting Keys in Containers
229
+ Docker images (including the simple `python:3.11-slim` example that runs Portacode as `root`) store the data inside `/root/.local/share/portacode`. Bind-mount that path or override `XDG_DATA_HOME` so the keys survive container restarts:
230
+
231
+ ```yaml
232
+ services:
233
+ device-01:
234
+ build: .
235
+ environment:
236
+ PORTACODE_PAIRING_CODE: "${PORTACODE_PAIRING_CODE:-}"
237
+ volumes:
238
+ - ./data/device-01/workspace:/root/workspace
239
+ - ./data/device-01/.local/share/portacode:/root/.local/share/portacode # persists device keys
240
+ ```
241
+
242
+ Alternatively, set `XDG_DATA_HOME=/root/.portacode` before running `portacode connect` and mount that directory from the host. The rule of thumb: **persist whichever folder contains `.local/share/portacode/keys/`** so your device fingerprint sticks around.
243
+
244
+ #### Minimal Docker Example
245
+ If you want a plug-and-play container, check the `examples/simple_device/` folder that ships with this repo and the PyPI source distribution. It contains a tiny `Dockerfile` and `docker-compose.yaml` you can copy as-is. The Dockerfile installs `git` before `pip install portacode` so GitPython can interact with repositories—remember to do the same in your own images if you expect to work inside version-controlled projects.
246
+
247
+ The accompanying Compose file demonstrates how to:
248
+ - run `portacode connect --non-interactive` with a predefined `--device-name` and `--project-path`
249
+ - pass `PORTACODE_PAIRING_CODE` via environment variables
250
+ - bind-mount your workspace plus `/root/.local/share/portacode` for key persistence
251
+
252
+ Together, those 10 lines illustrate the complete flow for remotely accessing a Docker-hosted machine with Portacode.
253
+
254
+ #### Workshop Fleet Example
255
+ Training a group? `examples/workshop_fleet/` spins up ten identical containers—one per student—with their own workspace bind mounts plus a shared read-only `instructions/` folder. The Dockerfile in that folder copies everything from `initial_content/` into the image (`COPY initial_content/ /opt/initial_content/`), and the compose command seeds each student workspace on boot via `cp -an /opt/initial_content/. /root/workspace/`. That means:
256
+ - Instructors drop starter code into `initial_content/` before `docker compose up` and every container gets the same seed files without overwriting student changes after the first sync.
257
+ - The host `instructions/` directory is mounted at `/root/workspace/instructions` in **read-only** mode, so you can update agendas or hints live while students can only view them.
258
+ - Each seat persists its Portacode identity in `data/student-XX/.local/share/portacode`, so reconnecting after a restart does not need new pairing codes.
259
+
260
+ See the full walkthrough and assets in [`examples/workshop_fleet/`](https://github.com/portacode/portacode/tree/master/examples/workshop_fleet), which is also shipped inside the PyPI source tarball for offline access.
261
+
262
+ ## 🌱 Early Stage Project
263
+
264
+ **Portacode is a young project with big dreams.** We're building the future of remote development and mobile-first coding experiences. As a new project, we're actively seeking:
265
+
266
+ - **👥 Community Feedback**: Does this solve a real problem for you?
267
+ - **🤝 Contributors**: Help us build the IDE of the future
268
+ - **📢 Early Adopters**: Try it out and let us know what you think
269
+ - **💡 Feature Ideas**: What would make your remote development workflow better?
270
+
271
+ **Your support matters!** Whether you contribute code, report bugs, share ideas, or simply let us know that you find value in what we're building - every bit of feedback helps us decide whether to continue investing in this vision or focus on other projects.
272
+
273
+ ## 📞 Get In Touch
274
+
275
+ - **Email**: hi@menas.pro
276
+ - **Support**: support@portacode.com
277
+ - **GitHub**: [https://github.com/portacode/portacode](https://github.com/portacode/portacode)
278
+
279
+ ## 🤝 Contributing
280
+
281
+ We welcome all forms of contribution:
282
+ - 🐛 **Bug Reports**: Found something broken? Let us know!
283
+ - ✨ **Feature Requests**: What would make Portacode better for you?
284
+ - 📖 **Documentation**: Help others get started
285
+ - 💻 **Code Contributions**: Help us build the future of remote development
286
+ - 💬 **Feedback**: Tell us if you find this useful!
287
+
288
+ Check out our [GitHub repository](https://github.com/portacode/portacode) to get started.
289
+
290
+ ## 📄 License
291
+
292
+ MIT License - see [LICENSE](https://github.com/portacode/portacode/blob/master/LICENSE) file for details.
293
+
294
+ ---
295
+
296
+ **Get started today**: `pip install portacode && portacode connect`
297
+
298
+ *Built with ❤️ and ☕ by passionate software engineers*
@@ -0,0 +1,97 @@
1
+ portacode/README.md,sha256=4dKtpvR8LNgZPVz37GmkQCMWIr_u25Ao63iW56s7Ke4,775
2
+ portacode/__init__.py,sha256=oB3sV1wXr-um-RXio73UG8E5Xx6cF2ZVJveqjNmC-vQ,1086
3
+ portacode/__main__.py,sha256=jmHTGC1hzmo9iKJLv-SSYe9BSIbPPZ2IOpecI03PlTs,296
4
+ portacode/_version.py,sha256=wMbY7UAgf3P9gxbSNOxLFzuxQjDnRzo7obYiAsaXcC8,719
5
+ portacode/cli.py,sha256=R6BkYM-o2MCUETk-o2h-U_24E96EbVmQpIXJJY2H08Y,20387
6
+ portacode/data.py,sha256=5-s291bv8J354myaHm1Y7CQZTZyRzMU3TGe5U4hb-FA,1591
7
+ portacode/keypair.py,sha256=0OO4vHDcF1XMxCDqce61xFTlFwlTcmqe5HyGsXFEt7s,5838
8
+ portacode/logging_categories.py,sha256=9m-BYrjyHh1vjZYBQT4JhAh6b_oYUhIWayO-noH1cSE,5063
9
+ portacode/pairing.py,sha256=OzSuc0GhrknrDrny4aBU6IUnmKzRDTtocuDpyaVnyrs,3116
10
+ portacode/service.py,sha256=p-HHMOAl20QsdcJydcZ74Iqes-wl8G8HItdSim30pUk,16537
11
+ portacode/connection/README.md,sha256=f9rbuIEKa7cTm9C98rCiBbEtbiIXQU11esGSNhSMiJg,883
12
+ portacode/connection/__init__.py,sha256=atqcVGkViIEd7pRa6cP2do07RJOM0UWpbnz5zXjGktU,250
13
+ portacode/connection/client.py,sha256=jtLb9_YufqPkzi9t8VQH3iz_JEMisbtY6a8L9U5weiU,14181
14
+ portacode/connection/multiplex.py,sha256=L-TxqJ_ZEbfNEfu1cwxgJ5vUdyRzZjsMy2Kx1diiZys,5237
15
+ portacode/connection/terminal.py,sha256=p8Wc4PsRBgYSYGO8htIHw48YfXMg8aSDvwuePA3IHgw,44493
16
+ portacode/connection/handlers/README.md,sha256=HsLZG1QK1JNm67HsgL6WoDg9nxzKXxwkc5fJPFJdX5g,12169
17
+ portacode/connection/handlers/WEBSOCKET_PROTOCOL.md,sha256=R2gQaW3fRSCYrhWBdR4qJi5mosEvTpJyq2gOZY4yfAw,87717
18
+ portacode/connection/handlers/__init__.py,sha256=AzssrCT2wzdbWNqVummZvQO7AzbUXqodNRlFh4ncPSk,2505
19
+ portacode/connection/handlers/base.py,sha256=oENFb-Fcfzwk99Qx8gJQriEMiwSxwygwjOiuCH36hM4,10231
20
+ portacode/connection/handlers/chunked_content.py,sha256=h6hXRmxSeOgnIxoU8CkmvEf2Odv-ajPrpHIe_W3GKcA,9251
21
+ portacode/connection/handlers/diff_handlers.py,sha256=iYTIRCcpEQ03vIPKZCsMTE5aZbQw6sF04M3dM6rUV8Q,24477
22
+ portacode/connection/handlers/file_handlers.py,sha256=nAJH8nXnX07xxD28ngLpgIUzcTuRwZBNpEGEKdRqohw,39507
23
+ portacode/connection/handlers/project_aware_file_handlers.py,sha256=AqgMnDqX2893T2NsrvUSCwjN5VKj4Pb2TN0S_SuboOE,9803
24
+ portacode/connection/handlers/project_state_handlers.py,sha256=v6ZefGW9i7n1aZLq2jOGumJIjYb6aHlPI4m1jkYewm8,1686
25
+ portacode/connection/handlers/proxmox_infra.py,sha256=DGPyTIZM-25F80-jDqr955dO8kWnOCyrLUC_fo-mTPI,12798
26
+ portacode/connection/handlers/registry.py,sha256=qXGE60sYEWg6ZtVQzFcZ5YI2XWR6lMgw4hAL9x5qR1I,6181
27
+ portacode/connection/handlers/session.py,sha256=uNGfiO_1B9-_yjJKkpvmbiJhIl6b-UXlT86UTfd6WYE,42219
28
+ portacode/connection/handlers/system_handlers.py,sha256=n4c8WmWZCaWPfo-v2fX2d1s9vUKBfZ8HUiouXF9vjd0,9758
29
+ portacode/connection/handlers/tab_factory.py,sha256=yn93h6GASjD1VpvW1oqpax3EpoT0r7r97zFXxML1wdA,16173
30
+ portacode/connection/handlers/terminal_handlers.py,sha256=HRwHW1GiqG1NtHVEqXHKaYkFfQEzCDDH6YIlHcb4XD8,11866
31
+ portacode/connection/handlers/update_handler.py,sha256=f2K4LmG4sHJZ3LahzzoRtHBULTKkPUNwuyhwuAAg3RA,2054
32
+ portacode/connection/handlers/project_state/README.md,sha256=trdd4ig6ungmwH5SpbSLfyxbL-QgPlGNU-_XrMEiXtw,10114
33
+ portacode/connection/handlers/project_state/__init__.py,sha256=5ucIqk6Iclqg6bKkL8r_wVs5Tlt6B9J7yQH6yQUt7gc,2541
34
+ portacode/connection/handlers/project_state/file_system_watcher.py,sha256=r9_UKxWTbzum0jGqxIafe68Ced2Y3xOp3ZmkpBOfRpw,8573
35
+ portacode/connection/handlers/project_state/git_manager.py,sha256=iGQ7LYIA7uHsZHdj3HEc_LYo7S1Lqv6-AeyyMwknBPo,70027
36
+ portacode/connection/handlers/project_state/handlers.py,sha256=qgOSt26rxAGNxW07AoevTwDPBdxblX4J-dX-EjOKtg4,38232
37
+ portacode/connection/handlers/project_state/manager.py,sha256=pRMZqPOTK9YE3abNxiAbnERIJmRys673HFOEIBiKnm4,67184
38
+ portacode/connection/handlers/project_state/models.py,sha256=EZTKvxHKs8QlQUbzI0u2IqfzfRRXZixUIDBwTGCJATI,4313
39
+ portacode/connection/handlers/project_state/utils.py,sha256=LsbQr9TH9Bz30FqikmtTxco4PlB_n0kUIuPKQ6Fb_mo,1665
40
+ portacode/link_capture/__init__.py,sha256=93LjyYDqzOimsIDBhsPibTl7tr-8DiIzyDF7JWQkE2A,1231
41
+ portacode/link_capture/__pycache__/__init__.cpython-311.pyc,sha256=yKwOu63AoGpmk4l-jfGnt2G2YkI54I8MppgDvq8K4_s,2037
42
+ portacode/link_capture/bin/elinks,sha256=VWEQlNcPazqaEJdDMbXmXJ2SLaAqN__IUBQNp8sSSto,104
43
+ portacode/link_capture/bin/gio-open,sha256=jOYX5fCkqWfFAY6ebJt6C1UcXISHa4iRmLePs5jU3Ko,106
44
+ portacode/link_capture/bin/gnome-open,sha256=oZHDhCtUWURmPry5EgkZjeJWZC2f10Qk101Dc4fNTVs,108
45
+ portacode/link_capture/bin/gvfs-open,sha256=6lYC7RZJIQGwvGz7cCLPFkDTf29TNS3xuPJsSxR1kbs,107
46
+ portacode/link_capture/bin/kde-open,sha256=9tz3N3horN_SCxl1sE8jAQ2OVy004Ebtl8llKz-mz70,106
47
+ portacode/link_capture/bin/kfmclient,sha256=wkhcZdZFJ161Nua8mGZ-wtCAtzgLkqycR5Ait7Wus-g,107
48
+ portacode/link_capture/bin/link_capture_exec.sh,sha256=bFyyuR7z7sEq-laOn9PLje5eoCLXNhgQvTrBLy3jKRg,234
49
+ portacode/link_capture/bin/link_capture_wrapper.py,sha256=wvfCx2Urjzv5vNO1_58AAe4kKx2kVsmn9OoJwr6bnYI,2042
50
+ portacode/link_capture/bin/links,sha256=BD3tioDtCXD-8KRcLEOaF53T4y9CWIZ8ANasDGy0mic,103
51
+ portacode/link_capture/bin/links2,sha256=2tD7Iol-CyRJQdKs1VoNfRgaiui2mPsqcD9NolAr5_I,104
52
+ portacode/link_capture/bin/lynx,sha256=FbiePbYRM1ozi1xP779ku05W2PwgKie_oRfj1KqrT3E,102
53
+ portacode/link_capture/bin/mate-open,sha256=mL-sj3LVpzN-7Vj6gwFY8TMEG5kiRqyjwkdhMy5GRQQ,107
54
+ portacode/link_capture/bin/netsurf,sha256=Z308xsqfJOwZGdsE3atZXdeJoGl1pAEzoaX4jSMPALg,105
55
+ portacode/link_capture/bin/sensible-browser,sha256=oKVTZM1Z_mLEI2M-Lm-eaBK-Uqc00kwsa69qLhmx-kQ,114
56
+ portacode/link_capture/bin/w3m,sha256=mdM0AF4h_ElkfI2YZ-Ko1KHgWk2zLQrRwb2w1QQxXU8,101
57
+ portacode/link_capture/bin/x-www-browser,sha256=3RhqrunuuVktUf6WrbozW7qKlvfIlwXShl8PwF6Q80k,111
58
+ portacode/link_capture/bin/xdg-open,sha256=GLUv5ejdN8tym4PNtgKqTcZpF7YHIO3BnlWs3z3SQ3U,106
59
+ portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-311.pyc,sha256=8NVUUJ1njsjCqZrZ2HPDmweauJQQ2W_9OWBC8Hi_o74,6049
60
+ portacode/static/js/test-ntp-clock.html,sha256=bUow9sifIuLNPqKvuPbpQozmEE6RhdCI4Plib3CqUmw,2130
61
+ portacode/static/js/utils/ntp-clock.js,sha256=t9moJyAGGU054BVtuGuSETVstlj1AoxVy44i4y9QWSs,6940
62
+ portacode/utils/NTP_ARCHITECTURE.md,sha256=WkESTbz5SNAgdmDKk3DrHMhtYOPji_Kt3_a9arWdRig,3894
63
+ portacode/utils/__init__.py,sha256=NgBlWTuNJESfIYJzP_3adI1yJQJR0XJLRpSdVNaBAN0,33
64
+ portacode/utils/diff_apply.py,sha256=4Oi7ft3VUCKmiUE4VM-OeqO7Gk6H7PF3WnN4WHXtjxI,15157
65
+ portacode/utils/diff_renderer.py,sha256=S76StnQ2DLfsz4Gg0m07UwPfRp8270PuzbNaQq-rmYk,13850
66
+ portacode/utils/ntp_clock.py,sha256=VqCnWCTehCufE43W23oB-WUdAZGeCcLxkmIOPwInYHc,2499
67
+ portacode-1.4.11.dev1.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
68
+ test_modules/README.md,sha256=Do_agkm9WhSzueXjRAkV_xEj6Emy5zB3N3VKY5Roce8,9274
69
+ test_modules/__init__.py,sha256=1LcbHodIHsB0g-g4NGjSn6AMuCoGbymvXPYLOb6Z7F0,53
70
+ test_modules/test_device_online.py,sha256=QtYq0Dq9vME8Gp2O4fGSheqVf8LUtpsSKosXXk56gGM,1654
71
+ test_modules/test_file_operations.py,sha256=KXbh9t8Fah1jZp1pEPlU4_F06iJIJr2fR-yYc4RL6m8,38372
72
+ test_modules/test_git_status_ui.py,sha256=A_qkt-0lFLwxdr7t6YQaM0HqUElDwlZi84mlngg11RA,18734
73
+ test_modules/test_login_flow.py,sha256=LyKAgd6jkhO7cvy2zgGtAuUTgkD2G4otS_1hZ6O2jZo,1882
74
+ test_modules/test_navigate_testing_folder.py,sha256=-1EXceUEwof_sYp5paMWUNT3mAv5aIpYJ65_vqFbZew,18233
75
+ test_modules/test_play_store_screenshots.py,sha256=4t9EdB-BjIhAj2EA7yHchsiI3Z5bqmIGI26Dzebru2s,11094
76
+ test_modules/test_terminal_buffer_performance.py,sha256=YQeDDZVnsQD3ug6udKUZH3NR7PHGP75uZsLZJYya7jg,12183
77
+ test_modules/test_terminal_interaction.py,sha256=AxLb63oKhNLjKrny4hBj4hhFhrmHZ5UGStYDA0KzA0w,3163
78
+ test_modules/test_terminal_loading_race_condition.py,sha256=PsGF8QzWeNNv6G7Fda6kETcBUcXyg_vRYeD-hDHAhCo,4158
79
+ test_modules/test_terminal_start.py,sha256=y3IqG54UfMk-pAQ_fn5LuoM3kki6xRm11oB5AzfC-iE,1978
80
+ testing_framework/.env.example,sha256=zGchLcB-p22YUUCU0JIyHLduLpDuFy8c5xPacctHvfY,708
81
+ testing_framework/README.md,sha256=7o04mS2siNDuHA1UBh3Uu6XCbGomKjgb8gfl8YbClhE,9662
82
+ testing_framework/__init__.py,sha256=safHXo_xBMwAwfiF_5rx0xGcPGfpBSOgkMZx04uj4No,575
83
+ testing_framework/cli.py,sha256=ZHO37QO2IqZpC9VovrAYur2Vfc2AYeDqzi9Nb4lIA-w,13434
84
+ testing_framework/requirements.txt,sha256=VeKSPyqS4MWwLhr0Upu7fImlXZQQjtL8uYeyHOjkYaE,249
85
+ testing_framework/core/__init__.py,sha256=8AJQgqSCa9WgwkQNH_wTsA3JmJ4d4FRCweI-ioDgcNI,40
86
+ testing_framework/core/base_test.py,sha256=0kKQDNCdAJyTQfJiMBzx9_2MMRrmaVfQF0cawhvian4,13149
87
+ testing_framework/core/cli_manager.py,sha256=LDH_tWn-CmO08U_rmBIPpN_O6HLaQKRjdnfKGrtqs8Y,6991
88
+ testing_framework/core/hierarchical_runner.py,sha256=tCeksh2cXbRspurSiE-mQM1M1BOPeY8mKFbjvaBTVHw,26401
89
+ testing_framework/core/playwright_manager.py,sha256=Tw46qwxIhOFkS48C2IWIQHHNpEe-iI5MSPS2P7zZAmk,22249
90
+ testing_framework/core/runner.py,sha256=j2QwNJmAxVBmJvcbVS7DgPJUKPNzqfLmt_4NNdaKmZU,19297
91
+ testing_framework/core/shared_cli_manager.py,sha256=BESSNtyQb7BOlaOvZmm04T8Uezjms4KCBs2MzTxvzYQ,8790
92
+ testing_framework/core/test_discovery.py,sha256=2FZ9fJ8Dp5dloA-fkgXoJ_gCMC_nYPBnA3Hs2xlagzM,4928
93
+ portacode-1.4.11.dev1.dist-info/METADATA,sha256=yraL8iRnELQ6dGUyfeYovjX5NyAl9CyeuCYEogodGdw,13051
94
+ portacode-1.4.11.dev1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
95
+ portacode-1.4.11.dev1.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
96
+ portacode-1.4.11.dev1.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
97
+ portacode-1.4.11.dev1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.2)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,3 @@
1
+ portacode
2
+ test_modules
3
+ testing_framework