portacode 1.4.15__tar.gz → 1.4.15.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.
- {portacode-1.4.15 → portacode-1.4.15.dev1}/PKG-INFO +1 -1
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/_version.py +2 -2
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +95 -14
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_state/manager.py +3 -25
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/proxmox_infra.py +413 -364
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/terminal.py +0 -80
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode.egg-info/PKG-INFO +1 -1
- {portacode-1.4.15 → portacode-1.4.15.dev1}/.claude/agents/communication-manager.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/.claude/settings.local.json +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/.gitignore +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/.gitmodules +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/LICENSE +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/MANIFEST.in +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/Makefile +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/backup.sh +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/connect.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/connect.sh +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/docker-compose.yaml +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/docs/images/device-transfer-button.png +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/docs/images/device-transfer-modal.png +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/docs/images/pair-device-button.png +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/docs/images/pairing-request.png +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/docs/images/student-workspace.png +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/simple_device/Dockerfile +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/simple_device/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/simple_device/docker-compose.yaml +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/Dockerfile +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/.local/share/portacode/run/gateway.pid +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/.gitignore +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/db.sqlite3 +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/settings.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/wsgi.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/admin.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/apps.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/menu.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/models.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/views.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/docker-compose.yaml +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/manage.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/templates/treats/home.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/treats/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/treats/admin.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/treats/apps.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/treats/menu.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/treats/migrations/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/treats/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/treats/tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/treats/urls.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/initial_content/treats/views.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/examples/workshop_fleet/instructions/WELCOME.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/__main__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/cli.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/client.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/base.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/chunked_content.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/diff_handlers.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/file_handlers.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_aware_file_handlers.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_state/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_state/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_state/file_system_watcher.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_state/git_manager.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_state/handlers.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_state/models.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_state/utils.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_state_handlers.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/registry.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/session.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/system_handlers.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/tab_factory.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/terminal_handlers.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/test_proxmox_infra.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/update_handler.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/multiplex.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/data.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/keypair.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-311.pyc +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/elinks +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/gio-open +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/gnome-open +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/gvfs-open +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/kde-open +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/kfmclient +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/link_capture_exec.sh +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/link_capture_wrapper.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/links +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/links2 +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/lynx +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/mate-open +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/netsurf +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/sensible-browser +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/w3m +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/x-www-browser +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/link_capture/bin/xdg-open +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/logging_categories.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/pairing.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/service.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/static/js/test-ntp-clock.html +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/static/js/utils/ntp-clock.js +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/utils/NTP_ARCHITECTURE.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/utils/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/utils/diff_apply.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/utils/diff_renderer.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/utils/ntp_clock.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode.egg-info/SOURCES.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode.egg-info/dependency_links.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode.egg-info/entry_points.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode.egg-info/requires.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/portacode.egg-info/top_level.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/pyproject.toml +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/restore.sh +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/run_tests.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/setup.cfg +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/setup.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test.sh +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/test_device_online.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/test_file_operations.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/test_git_status_ui.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/test_login_flow.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/test_navigate_testing_folder.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/test_play_store_screenshots.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/test_terminal_buffer_performance.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/test_terminal_interaction.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/test_terminal_loading_race_condition.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_modules/test_terminal_start.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/test_request_id.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/.env.example +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/README.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/cli.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/core/__init__.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/core/base_test.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/core/cli_manager.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/core/hierarchical_runner.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/core/playwright_manager.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/core/runner.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/core/shared_cli_manager.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/core/test_discovery.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/testing_framework/requirements.txt +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/UI_UX/opening_a_file_on_desktop_results_in_nothing.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/agent_context_management.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/django_server_time_sync.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/issues/device_performance_degradation.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/issues/git_data_not_captured_in_proxmox.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/issues/indefinite_resource_loading.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/issues/portacode_service_silently_down.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/issues/premature_terminal_exit.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/issues/project_cpu_hotspots.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/issues/terminals_exit_upon_starting.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/issues/wrong_item_classification_on_client_side.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/todo/smartphone_terminal_input_frustrations.md +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/tools/generate_play_store_assets.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/tools/pairing_tester.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/tools/run_screenshot_suite.sh +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/tools/test_python_ntp_clock.py +0 -0
- {portacode-1.4.15 → portacode-1.4.15.dev1}/validate.sh +0 -0
|
@@ -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.4.15'
|
|
32
|
-
__version_tuple__ = version_tuple = (1, 4, 15)
|
|
31
|
+
__version__ = version = '1.4.15.dev1'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 4, 15, 'dev1')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
{portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md
RENAMED
|
@@ -27,10 +27,6 @@ The Portacode server acts as a **routing middleman** between client sessions and
|
|
|
27
27
|
|
|
28
28
|
- **`source_client_session`** (Server → Device): Server **adds this** when forwarding client commands to devices (so device knows which client sent the command and can target responses back). Clients never include this field.
|
|
29
29
|
|
|
30
|
-
### Proxying infrastructure updates
|
|
31
|
-
|
|
32
|
-
Portacode infrastructure devices (like the proxmox host) can send events on behalf of the LXC Devices they manage. Such messages include the optional `on_behalf_of_device` field and the server silently replaces `device_id` with that child device before routing. The gateway enforces that the sender is the child’s `proxmox_parent` (via `Device.proxmox_parent`) so only the infrastructure owner can impersonate a child device. Messages that fail this check are dropped.
|
|
33
|
-
|
|
34
30
|
This document describes the complete protocol for communicating with devices through the server, guiding app developers on how to get their client sessions to communicate with devices.
|
|
35
31
|
|
|
36
32
|
## Table of Contents
|
|
@@ -330,9 +326,12 @@ Configures a Proxmox node for Portacode infrastructure usage (API token validati
|
|
|
330
326
|
|
|
331
327
|
**Payload Fields:**
|
|
332
328
|
|
|
333
|
-
* `token_identifier` (string,
|
|
334
|
-
* `token_value` (string,
|
|
335
|
-
* `verify_ssl` (boolean, optional): When true, the handler verifies SSL certificates; defaults to `false`.
|
|
329
|
+
* `token_identifier` (string, optional when reconfiguring): API token identifier in the form `user@realm!tokenid`. Required on first configuration or when replacing the stored token.
|
|
330
|
+
* `token_value` (string, optional when reconfiguring): Secret value associated with the token. Required when `token_identifier` is supplied.
|
|
331
|
+
* `verify_ssl` (boolean, optional): When true, the handler verifies SSL certificates; defaults to `false`. When omitted, the last configured value is preserved.
|
|
332
|
+
* `cloudflare_api_token` (string, optional): Cloudflare API token the host can reuse later to provision tunnels.
|
|
333
|
+
|
|
334
|
+
The setup command also installs `cloudflared` on the node so Cloudflare tunnels can be created afterward.
|
|
336
335
|
|
|
337
336
|
**Responses:**
|
|
338
337
|
|
|
@@ -365,7 +364,7 @@ Creates a Portacode-managed LXC container, starts it, and bootstraps the Portaco
|
|
|
365
364
|
* `username` (string, optional): OS user to provision (defaults to `svcuser`).
|
|
366
365
|
* `password` (string, optional): Password for the user (used only during provisioning).
|
|
367
366
|
* `ssh_key` (string, optional): SSH public key to add to the user.
|
|
368
|
-
* `device_id` (string,
|
|
367
|
+
* `device_id` (string, optional): ID of the Device record that already exists on the dashboard.
|
|
369
368
|
* `device_public_key` (string, optional): PEM-encoded Portacode public key. When supplied together with `device_private_key` the handler injects the keypair, records the device metadata, and runs `portacode service install` automatically.
|
|
370
369
|
* `device_private_key` (string, optional): PEM-encoded private key that pairs with `device_public_key`. Both key fields must be present for the automatic service-install mode.
|
|
371
370
|
|
|
@@ -413,6 +412,51 @@ Deletes a managed container from Proxmox (stopping it first if necessary) and re
|
|
|
413
412
|
* Emits a [`proxmox_container_action`](#proxmox_container_action-event) event with `action="remove"` and the refreshed infra snapshot after deletion.
|
|
414
413
|
* Emits an [`error`](#error) event on failure.
|
|
415
414
|
|
|
415
|
+
### `create_cloudflare_tunnel`
|
|
416
|
+
|
|
417
|
+
Creates or updates a Cloudflare tunnel in front of a managed container. The container must be running and a Cloudflare API token must already be configured via `setup_proxmox_infra`.
|
|
418
|
+
|
|
419
|
+
**Payload Fields:**
|
|
420
|
+
|
|
421
|
+
* `ctid` (string, required): Identifier of the container.
|
|
422
|
+
* `container_port` (integer, required): Port inside the container to expose through Cloudflare.
|
|
423
|
+
* `cloudflare_url` (string, required): Hostname (e.g., `app.example.com`) that the tunnel should serve.
|
|
424
|
+
* `protocol` (string, optional): One of `http`, `https`, or `tcp` (defaults to `http`).
|
|
425
|
+
|
|
426
|
+
**Responses:**
|
|
427
|
+
|
|
428
|
+
* Emits a [`cloudflare_tunnel_created`](#cloudflare_tunnel_created-event) event with the tunnel metadata.
|
|
429
|
+
* Emits an [`error`](#error) event on failure.
|
|
430
|
+
|
|
431
|
+
### `update_cloudflare_tunnel`
|
|
432
|
+
|
|
433
|
+
Refreshes the tunnel configuration for an existing tunnel (different port, URL, or protocol).
|
|
434
|
+
|
|
435
|
+
**Payload Fields:**
|
|
436
|
+
|
|
437
|
+
* `ctid` (string, required): Identifier of the container.
|
|
438
|
+
* `container_port` (integer, optional): New container port.
|
|
439
|
+
* `cloudflare_url` (string, optional): New hostname.
|
|
440
|
+
* `protocol` (string, optional): New protocol (`http`, `https`, or `tcp`).
|
|
441
|
+
|
|
442
|
+
**Responses:**
|
|
443
|
+
|
|
444
|
+
* Emits a [`cloudflare_tunnel_updated`](#cloudflare_tunnel_updated-event) event with the refreshed tunnel metadata.
|
|
445
|
+
* Emits an [`error`](#error) event on failure.
|
|
446
|
+
|
|
447
|
+
### `remove_cloudflare_tunnel`
|
|
448
|
+
|
|
449
|
+
Stops and removes any tunnel metadata associated with a container.
|
|
450
|
+
|
|
451
|
+
**Payload Fields:**
|
|
452
|
+
|
|
453
|
+
* `ctid` (string, required): Identifier of the container.
|
|
454
|
+
|
|
455
|
+
**Responses:**
|
|
456
|
+
|
|
457
|
+
* Emits a [`cloudflare_tunnel_removed`](#cloudflare_tunnel_removed-event) event.
|
|
458
|
+
* Emits an [`error`](#error) event on failure.
|
|
459
|
+
|
|
416
460
|
### `proxmox_container_created`
|
|
417
461
|
|
|
418
462
|
Emitted after a successful `create_proxmox_container` action. Contains the new container ID, the Portacode public key produced inside the container, and the bootstrap logs.
|
|
@@ -425,8 +469,7 @@ Emitted after a successful `create_proxmox_container` action. Contains the new c
|
|
|
425
469
|
* `public_key` (string): Portacode public auth key created inside the new container.
|
|
426
470
|
* `container` (object): Metadata such as `vmid`, `hostname`, `template`, `storage`, `disk_gib`, `ram_mib`, and `cpus`.
|
|
427
471
|
* `setup_steps` (array[object]): Detailed bootstrap step results (name, stdout/stderr, elapsed time, and status).
|
|
428
|
-
* `device_id` (string): Mirrors the
|
|
429
|
-
* `on_behalf_of_device` (string): Same value as `device_id` when the container host is reporting progress for the child device; only proxmox parents may include this field.
|
|
472
|
+
* `device_id` (string, optional): Mirrors the `device_id` supplied with `create_proxmox_container`, if any.
|
|
430
473
|
* `service_installed` (boolean): True when the handler already ran `portacode service install` (with a provided keypair); otherwise it remains False and the dashboard can call `start_portacode_service`.
|
|
431
474
|
|
|
432
475
|
### `proxmox_container_progress`
|
|
@@ -444,7 +487,6 @@ Sent intermittently while `create_proxmox_container` is executing so callers can
|
|
|
444
487
|
* `message` (string): Short description of what is happening or why a failure occurred.
|
|
445
488
|
* `details` (object, optional): Contains `attempt` (if retries were needed) and `error_summary` when a step fails.
|
|
446
489
|
* `request_id` (string, optional): Mirrors the request ID from the incoming `create_proxmox_container` payload when available.
|
|
447
|
-
* `on_behalf_of_device` (string, optional): When present the proxmox device is reporting progress for the referenced dashboard device; the gateway verifies the proxmox node is the child’s `proxmox_parent` before routing the event.
|
|
448
490
|
|
|
449
491
|
### `start_portacode_service`
|
|
450
492
|
|
|
@@ -1132,6 +1174,8 @@ Provides system information in response to a `system_info` action. Handled by [`
|
|
|
1132
1174
|
* `message` (string|null): Informational text about the network setup attempt.
|
|
1133
1175
|
* `bridge` (string): The bridge interface configured (typically `vmbr1`).
|
|
1134
1176
|
* `health` (string|null): `"healthy"` when the connectivity verification succeeded.
|
|
1177
|
+
* `cloudflare` (object): Optional Cloudflare metadata collected for future tunnels:
|
|
1178
|
+
* `configured` (boolean): True when a Cloudflare API token is stored.
|
|
1135
1179
|
* `node_status` (object|null): Status response returned by the Proxmox API when validating the token.
|
|
1136
1180
|
* `managed_containers` (object): Cached summary of the Portacode-managed containers:
|
|
1137
1181
|
* `updated_at` (string): ISO timestamp when this snapshot was last refreshed.
|
|
@@ -1149,6 +1193,11 @@ Provides system information in response to a `system_info` action. Handled by [`
|
|
|
1149
1193
|
* `cpu_share` (number): vCPU-equivalent share requested at creation.
|
|
1150
1194
|
* `status` (string): Lowercase lifecycle status (e.g., `running`, `stopped`, `deleted`).
|
|
1151
1195
|
* `created_at` (string|null): ISO timestamp recorded when the CT was provisioned.
|
|
1196
|
+
* `tunnel` (object|null): Tunnel metadata that includes:
|
|
1197
|
+
* `url` (string): Public hostname assigned for this tunnel.
|
|
1198
|
+
* `container_port` (integer): Container port exposed via the tunnel.
|
|
1199
|
+
* `protocol` (string): Protocol advertised when the tunnel was configured.
|
|
1200
|
+
* `status` (string): `running`, `stopped`, or `unknown`.
|
|
1152
1201
|
* `portacode_version` (string): Installed CLI version returned by `portacode.__version__`.
|
|
1153
1202
|
|
|
1154
1203
|
### `proxmox_infra_configured`
|
|
@@ -1183,8 +1232,6 @@ Emitted after a successful `create_proxmox_container` action to report the newly
|
|
|
1183
1232
|
* `public_key` (string): Portacode public auth key discovered inside the container.
|
|
1184
1233
|
* `container` (object): Metadata such as `vmid`, `hostname`, `template`, `storage`, `disk_gib`, `ram_mib`, and `cpus`.
|
|
1185
1234
|
* `setup_steps` (array[object]): Detailed bootstrap step reports including stdout/stderr, elapsed time, and pass/fail status.
|
|
1186
|
-
* `device_id` (string): Mirrors the device ID supplied with `create_proxmox_container` and persisted inside the host metadata file for this CT.
|
|
1187
|
-
* `on_behalf_of_device` (string): Same value as `device_id` when the container host is reporting progress for the child device.
|
|
1188
1235
|
|
|
1189
1236
|
### `proxmox_container_progress`
|
|
1190
1237
|
|
|
@@ -1201,7 +1248,6 @@ Sent continuously while `create_proxmox_container` runs so dashboards can show a
|
|
|
1201
1248
|
* `message` (string): Short human-readable description of the action or failure.
|
|
1202
1249
|
* `details` (object, optional): Contains `attempt` (when retries are used) and `error_summary` on failure.
|
|
1203
1250
|
* `request_id` (string, optional): Mirrors the `create_proxmox_container` request when provided.
|
|
1204
|
-
* `on_behalf_of_device` (string, optional): Mirrors the child device ID when a proxmox host reports progress for that child; only proxmox parents can supply this field.
|
|
1205
1251
|
|
|
1206
1252
|
### `proxmox_container_action`
|
|
1207
1253
|
|
|
@@ -1217,6 +1263,41 @@ Emitted after `start_proxmox_container`, `stop_proxmox_container`, or `remove_pr
|
|
|
1217
1263
|
* `details` (object, optional): Exit status information (e.g., `exitstatus`, `stop_exitstatus`, `delete_exitstatus`).
|
|
1218
1264
|
* `infra` (object): Same snapshot described under [`system_info`](#system_info-event) `proxmox.infra`, including the updated `managed_containers` summary.
|
|
1219
1265
|
|
|
1266
|
+
### `cloudflare_tunnel_created`
|
|
1267
|
+
|
|
1268
|
+
Submitted after a successful `create_cloudflare_tunnel` action.
|
|
1269
|
+
|
|
1270
|
+
**Event Fields:**
|
|
1271
|
+
|
|
1272
|
+
* `event` (string): `cloudflare_tunnel_created`.
|
|
1273
|
+
* `ctid` (string): Container ID associated with the tunnel.
|
|
1274
|
+
* `success` (boolean): True when the tunnel is running.
|
|
1275
|
+
* `message` (string): Summary text.
|
|
1276
|
+
* `tunnel` (object): Tunnel metadata matching the manager view.
|
|
1277
|
+
|
|
1278
|
+
### `cloudflare_tunnel_updated`
|
|
1279
|
+
|
|
1280
|
+
Sent when `update_cloudflare_tunnel` completes.
|
|
1281
|
+
|
|
1282
|
+
**Event Fields:**
|
|
1283
|
+
|
|
1284
|
+
* `event` (string): `cloudflare_tunnel_updated`.
|
|
1285
|
+
* `ctid` (string): Container ID associated with the tunnel.
|
|
1286
|
+
* `success` (boolean): True on success.
|
|
1287
|
+
* `message` (string): Summary text.
|
|
1288
|
+
* `tunnel` (object): Updated tunnel metadata.
|
|
1289
|
+
|
|
1290
|
+
### `cloudflare_tunnel_removed`
|
|
1291
|
+
|
|
1292
|
+
Sent after a tunnel has been removed from a container record.
|
|
1293
|
+
|
|
1294
|
+
**Event Fields:**
|
|
1295
|
+
|
|
1296
|
+
* `event` (string): `cloudflare_tunnel_removed`.
|
|
1297
|
+
* `ctid` (string): Container ID that no longer has a tunnel.
|
|
1298
|
+
* `success` (boolean): True on success.
|
|
1299
|
+
* `message` (string): Summary text.
|
|
1300
|
+
|
|
1220
1301
|
### <a name="clock_sync_response"></a>`clock_sync_response`
|
|
1221
1302
|
|
|
1222
1303
|
Reply sent by the gateway immediately after receiving a `clock_sync_request`. Devices use this event plus the measured round-trip time to keep their local `ntp_clock` offset accurate.
|
{portacode-1.4.15 → portacode-1.4.15.dev1}/portacode/connection/handlers/project_state/manager.py
RENAMED
|
@@ -21,24 +21,6 @@ from .git_manager import GitManager
|
|
|
21
21
|
from .file_system_watcher import FileSystemWatcher
|
|
22
22
|
from ....logging_categories import get_categorized_logger, LogCategory
|
|
23
23
|
|
|
24
|
-
def _deterministic_file_tab_id(file_path: str) -> str:
|
|
25
|
-
try:
|
|
26
|
-
resolved = os.path.abspath(file_path)
|
|
27
|
-
mtime = int(Path(resolved).stat().st_mtime)
|
|
28
|
-
except OSError:
|
|
29
|
-
mtime = "unknown"
|
|
30
|
-
resolved = os.path.abspath(file_path)
|
|
31
|
-
return f"{resolved}:{mtime}"
|
|
32
|
-
|
|
33
|
-
def _deterministic_diff_tab_id(
|
|
34
|
-
file_path: str,
|
|
35
|
-
from_ref: str,
|
|
36
|
-
to_ref: str,
|
|
37
|
-
from_hash: Optional[str],
|
|
38
|
-
to_hash: Optional[str]
|
|
39
|
-
) -> str:
|
|
40
|
-
return f"diff:{os.path.abspath(file_path)}:{from_ref}:{to_ref}:{from_hash or ''}:{to_hash or ''}"
|
|
41
|
-
|
|
42
24
|
logger = get_categorized_logger(__name__)
|
|
43
25
|
|
|
44
26
|
# Global singleton instance
|
|
@@ -675,10 +657,10 @@ class ProjectStateManager:
|
|
|
675
657
|
# Create new file tab using tab factory
|
|
676
658
|
from ..tab_factory import get_tab_factory
|
|
677
659
|
tab_factory = get_tab_factory()
|
|
678
|
-
|
|
660
|
+
|
|
679
661
|
try:
|
|
680
662
|
logger.info(f"About to create tab for file: {file_path}")
|
|
681
|
-
new_tab = await tab_factory.create_file_tab(file_path
|
|
663
|
+
new_tab = await tab_factory.create_file_tab(file_path)
|
|
682
664
|
logger.info(f"Tab created successfully, adding to project state")
|
|
683
665
|
project_state.open_tabs[tab_key] = new_tab
|
|
684
666
|
if set_active:
|
|
@@ -860,11 +842,7 @@ class ProjectStateManager:
|
|
|
860
842
|
diff_title = f"{os.path.basename(file_path)} ({' '.join(title_parts)})"
|
|
861
843
|
|
|
862
844
|
diff_tab = await tab_factory.create_diff_tab_with_title(
|
|
863
|
-
file_path,
|
|
864
|
-
original_content,
|
|
865
|
-
modified_content,
|
|
866
|
-
diff_title,
|
|
867
|
-
tab_id=_deterministic_diff_tab_id(file_path, from_ref, to_ref, from_hash, to_hash),
|
|
845
|
+
file_path, original_content, modified_content, diff_title,
|
|
868
846
|
diff_details=diff_details
|
|
869
847
|
)
|
|
870
848
|
|