portacode 1.4.18__tar.gz → 1.4.18.dev0__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.18 → portacode-1.4.18.dev0}/PKG-INFO +1 -1
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/_version.py +2 -2
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +1 -1
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/base.py +3 -5
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/proxmox_infra.py +6 -39
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode.egg-info/PKG-INFO +1 -1
- {portacode-1.4.18 → portacode-1.4.18.dev0}/.claude/agents/communication-manager.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/.claude/settings.local.json +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/.gitignore +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/.gitmodules +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/LICENSE +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/MANIFEST.in +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/Makefile +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/backup.sh +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/connect.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/connect.sh +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/docker-compose.yaml +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/docs/images/device-transfer-button.png +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/docs/images/device-transfer-modal.png +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/docs/images/pair-device-button.png +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/docs/images/pairing-request.png +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/docs/images/student-workspace.png +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/simple_device/Dockerfile +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/simple_device/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/simple_device/docker-compose.yaml +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/Dockerfile +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/.local/share/portacode/run/gateway.pid +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/.gitignore +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/db.sqlite3 +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/settings.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/wsgi.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/admin.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/apps.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/menu.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/models.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/views.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/docker-compose.yaml +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/manage.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/templates/treats/home.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/treats/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/treats/admin.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/treats/apps.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/treats/menu.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/treats/migrations/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/treats/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/treats/tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/treats/urls.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/initial_content/treats/views.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/examples/workshop_fleet/instructions/WELCOME.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/__main__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/cli.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/client.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/chunked_content.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/diff_handlers.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/file_handlers.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/project_aware_file_handlers.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/project_state/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/project_state/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/project_state/file_system_watcher.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/project_state/git_manager.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/project_state/handlers.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/project_state/manager.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/project_state/models.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/project_state/utils.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/project_state_handlers.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/registry.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/session.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/system_handlers.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/tab_factory.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/terminal_handlers.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/test_proxmox_infra.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/update_handler.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/multiplex.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/terminal.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/data.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/keypair.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-311.pyc +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/elinks +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/gio-open +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/gnome-open +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/gvfs-open +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/kde-open +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/kfmclient +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/link_capture_exec.sh +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/link_capture_wrapper.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/links +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/links2 +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/lynx +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/mate-open +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/netsurf +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/sensible-browser +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/w3m +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/x-www-browser +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/link_capture/bin/xdg-open +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/logging_categories.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/pairing.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/service.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/static/js/test-ntp-clock.html +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/static/js/utils/ntp-clock.js +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/utils/NTP_ARCHITECTURE.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/utils/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/utils/diff_apply.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/utils/diff_renderer.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/utils/ntp_clock.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode.egg-info/SOURCES.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode.egg-info/dependency_links.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode.egg-info/entry_points.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode.egg-info/requires.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/portacode.egg-info/top_level.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/pyproject.toml +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/restore.sh +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/run_tests.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/setup.cfg +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/setup.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test.sh +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/test_device_online.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/test_file_operations.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/test_git_status_ui.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/test_login_flow.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/test_navigate_testing_folder.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/test_play_store_screenshots.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/test_terminal_buffer_performance.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/test_terminal_interaction.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/test_terminal_loading_race_condition.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_modules/test_terminal_start.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/test_request_id.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/.env.example +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/README.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/cli.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/core/__init__.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/core/base_test.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/core/cli_manager.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/core/hierarchical_runner.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/core/playwright_manager.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/core/runner.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/core/shared_cli_manager.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/core/test_discovery.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/testing_framework/requirements.txt +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/UI_UX/opening_a_file_on_desktop_results_in_nothing.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/agent_context_management.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/django_server_time_sync.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/issues/device_performance_degradation.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/issues/git_data_not_captured_in_proxmox.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/issues/indefinite_resource_loading.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/issues/portacode_service_silently_down.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/issues/premature_terminal_exit.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/issues/project_cpu_hotspots.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/issues/terminals_exit_upon_starting.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/issues/wrong_item_classification_on_client_side.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/todo/smartphone_terminal_input_frustrations.md +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/tools/generate_play_store_assets.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/tools/pairing_tester.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/tools/run_screenshot_suite.sh +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/tools/test_python_ntp_clock.py +0 -0
- {portacode-1.4.18 → portacode-1.4.18.dev0}/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.18'
|
|
32
|
-
__version_tuple__ = version_tuple = (1, 4, 18)
|
|
31
|
+
__version__ = version = '1.4.18.dev0'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 4, 18, 'dev0')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
{portacode-1.4.18 → portacode-1.4.18.dev0}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md
RENAMED
|
@@ -408,7 +408,7 @@ Deletes a managed container from Proxmox (stopping it first if necessary) and re
|
|
|
408
408
|
|
|
409
409
|
**Payload Fields:**
|
|
410
410
|
|
|
411
|
-
* `ctid` (string,
|
|
411
|
+
* `ctid` (string, required): Identifier of the container to delete.
|
|
412
412
|
* `child_device_id` (string, required): Dashboard `Device.id` that should own the container metadata being purged.
|
|
413
413
|
|
|
414
414
|
**Responses:**
|
|
@@ -62,18 +62,16 @@ class BaseHandler(ABC):
|
|
|
62
62
|
# Get client session manager from context
|
|
63
63
|
client_session_manager = self.context.get("client_session_manager")
|
|
64
64
|
|
|
65
|
-
bypass_session_gate = bool(payload.get("bypass_session_gate"))
|
|
66
65
|
if client_session_manager and client_session_manager.has_interested_clients():
|
|
67
66
|
# Get target sessions
|
|
68
67
|
target_sessions = client_session_manager.get_target_sessions(project_id)
|
|
69
|
-
if not target_sessions
|
|
68
|
+
if not target_sessions:
|
|
70
69
|
logger.debug("handler: No target sessions found, skipping response send")
|
|
71
70
|
return
|
|
72
71
|
|
|
73
72
|
# Add session targeting information
|
|
74
73
|
enhanced_payload = dict(payload)
|
|
75
|
-
|
|
76
|
-
enhanced_payload["client_sessions"] = target_sessions
|
|
74
|
+
enhanced_payload["client_sessions"] = target_sessions
|
|
77
75
|
|
|
78
76
|
# Add backward compatibility reply_channel (first session if not provided)
|
|
79
77
|
if not reply_channel:
|
|
@@ -218,4 +216,4 @@ class SyncHandler(BaseHandler):
|
|
|
218
216
|
logger.exception("Error in sync handler %s: %s", self.command_name, exc)
|
|
219
217
|
# Extract project_id from original message for error targeting
|
|
220
218
|
project_id = message.get("project_id")
|
|
221
|
-
await self.send_error(str(exc), reply_channel, project_id)
|
|
219
|
+
await self.send_error(str(exc), reply_channel, project_id)
|
|
@@ -116,7 +116,6 @@ def _emit_progress_event(
|
|
|
116
116
|
payload["details"] = details
|
|
117
117
|
if on_behalf_of_device:
|
|
118
118
|
payload["on_behalf_of_device"] = str(on_behalf_of_device)
|
|
119
|
-
payload["bypass_session_gate"] = True
|
|
120
119
|
|
|
121
120
|
future = asyncio.run_coroutine_threadsafe(handler.send_response(payload), loop)
|
|
122
121
|
future.add_done_callback(
|
|
@@ -1180,7 +1179,7 @@ def _build_bootstrap_steps(
|
|
|
1180
1179
|
steps.append(
|
|
1181
1180
|
{
|
|
1182
1181
|
"name": "add_ssh_key",
|
|
1183
|
-
"cmd": f"install -d -m 700 /home/{user}/.ssh && echo '{ssh_key}' >> /home/{user}/.ssh/authorized_keys && chown -R {user}
|
|
1182
|
+
"cmd": f"install -d -m 700 /home/{user}/.ssh && echo '{ssh_key}' >> /home/{user}/.ssh/authorized_keys && chown -R {user}:{user} /home/{user}/.ssh",
|
|
1184
1183
|
"retries": 0,
|
|
1185
1184
|
}
|
|
1186
1185
|
)
|
|
@@ -1400,25 +1399,6 @@ def _parse_ctid(message: Dict[str, Any]) -> int:
|
|
|
1400
1399
|
raise ValueError("ctid is required")
|
|
1401
1400
|
|
|
1402
1401
|
|
|
1403
|
-
def _resolve_vmid_for_device(device_id: str) -> int:
|
|
1404
|
-
_initialize_managed_containers_state()
|
|
1405
|
-
records = list(_MANAGED_CONTAINERS_STATE.get("records", {}).values())
|
|
1406
|
-
for record in records:
|
|
1407
|
-
record_device_id = record.get("device_id")
|
|
1408
|
-
if record_device_id is None:
|
|
1409
|
-
continue
|
|
1410
|
-
if str(record_device_id) != str(device_id):
|
|
1411
|
-
continue
|
|
1412
|
-
vmid = record.get("vmid")
|
|
1413
|
-
if vmid is None:
|
|
1414
|
-
continue
|
|
1415
|
-
try:
|
|
1416
|
-
return int(str(vmid).strip())
|
|
1417
|
-
except ValueError:
|
|
1418
|
-
raise ValueError("ctid must be an integer") from None
|
|
1419
|
-
raise ValueError("ctid is required for remove_proxmox_container")
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
1402
|
def _ensure_container_managed(
|
|
1423
1403
|
proxmox: Any, node: str, vmid: int, *, device_id: Optional[str] = None
|
|
1424
1404
|
) -> Tuple[Dict[str, Any], Dict[str, Any]]:
|
|
@@ -1464,14 +1444,6 @@ def _su_command(user: str, command: str) -> str:
|
|
|
1464
1444
|
return f"su - {user} -s /bin/sh -c {shlex.quote(command)}"
|
|
1465
1445
|
|
|
1466
1446
|
|
|
1467
|
-
def _resolve_user_group(vmid: int, user: str) -> str:
|
|
1468
|
-
res = _run_pct(vmid, f"id -gn {shlex.quote(user)}")
|
|
1469
|
-
group = (res.get("stdout") or "").strip()
|
|
1470
|
-
if group:
|
|
1471
|
-
return f"{user}:{group}"
|
|
1472
|
-
return f"{user}:{user}"
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
1447
|
def _resolve_portacode_cli_path(vmid: int, user: str) -> str:
|
|
1476
1448
|
"""Resolve the full path to the portacode CLI inside the container."""
|
|
1477
1449
|
res = _run_pct(vmid, _su_command(user, "command -v portacode"))
|
|
@@ -1508,13 +1480,12 @@ def _push_bytes_to_container(
|
|
|
1508
1480
|
) -> None:
|
|
1509
1481
|
logger.debug("Preparing to push %d bytes to container vmid=%s path=%s for user=%s", len(data), vmid, path, user)
|
|
1510
1482
|
tmp_path: Optional[str] = None
|
|
1511
|
-
owner = _resolve_user_group(vmid, user)
|
|
1512
1483
|
try:
|
|
1513
1484
|
parent = Path(path).parent
|
|
1514
1485
|
parent_str = parent.as_posix()
|
|
1515
1486
|
if parent_str not in {"", ".", "/"}:
|
|
1516
1487
|
_run_pct_exec_check(vmid, ["mkdir", "-p", parent_str])
|
|
1517
|
-
_run_pct_exec_check(vmid, ["chown", "-R",
|
|
1488
|
+
_run_pct_exec_check(vmid, ["chown", "-R", f"{user}:{user}", parent_str])
|
|
1518
1489
|
|
|
1519
1490
|
with tempfile.NamedTemporaryFile(delete=False) as tmp:
|
|
1520
1491
|
tmp.write(data)
|
|
@@ -1526,7 +1497,7 @@ def _push_bytes_to_container(
|
|
|
1526
1497
|
if push_res.returncode != 0:
|
|
1527
1498
|
raise RuntimeError(push_res.stderr or push_res.stdout or f"pct push returned {push_res.returncode}")
|
|
1528
1499
|
|
|
1529
|
-
_run_pct_exec_check(vmid, ["chown",
|
|
1500
|
+
_run_pct_exec_check(vmid, ["chown", f"{user}:{user}", path])
|
|
1530
1501
|
_run_pct_exec_check(vmid, ["chmod", format(mode, "o"), path])
|
|
1531
1502
|
logger.debug("Successfully pushed %d bytes to vmid=%s path=%s", len(data), vmid, path)
|
|
1532
1503
|
except Exception as exc:
|
|
@@ -1545,8 +1516,7 @@ def _resolve_portacode_key_dir(vmid: int, user: str) -> str:
|
|
|
1545
1516
|
data_home = _run_pct_check(vmid, data_dir_cmd)["stdout"].strip()
|
|
1546
1517
|
portacode_dir = f"{data_home}/portacode"
|
|
1547
1518
|
_run_pct_exec_check(vmid, ["mkdir", "-p", portacode_dir])
|
|
1548
|
-
|
|
1549
|
-
_run_pct_exec_check(vmid, ["chown", "-R", owner, portacode_dir])
|
|
1519
|
+
_run_pct_exec_check(vmid, ["chown", "-R", f"{user}:{user}", portacode_dir])
|
|
1550
1520
|
return f"{portacode_dir}/keys"
|
|
1551
1521
|
|
|
1552
1522
|
|
|
@@ -2351,7 +2321,6 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
2351
2321
|
"setup_steps": steps,
|
|
2352
2322
|
"device_id": device_id,
|
|
2353
2323
|
"on_behalf_of_device": device_id,
|
|
2354
|
-
"bypass_session_gate": True,
|
|
2355
2324
|
"service_installed": service_installed,
|
|
2356
2325
|
"request_id": request_id,
|
|
2357
2326
|
},
|
|
@@ -2378,6 +2347,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
2378
2347
|
"event": "proxmox_container_accepted",
|
|
2379
2348
|
"success": True,
|
|
2380
2349
|
"message": "Provisioning accepted; resources reserved.",
|
|
2350
|
+
"device_id": device_id,
|
|
2381
2351
|
"request_id": request_id,
|
|
2382
2352
|
}
|
|
2383
2353
|
|
|
@@ -2577,13 +2547,10 @@ class RemoveProxmoxContainerHandler(SyncHandler):
|
|
|
2577
2547
|
return "remove_proxmox_container"
|
|
2578
2548
|
|
|
2579
2549
|
def execute(self, message: Dict[str, Any]) -> Dict[str, Any]:
|
|
2550
|
+
vmid = _parse_ctid(message)
|
|
2580
2551
|
child_device_id = (message.get("child_device_id") or "").strip()
|
|
2581
2552
|
if not child_device_id:
|
|
2582
2553
|
raise ValueError("child_device_id is required for remove_proxmox_container")
|
|
2583
|
-
try:
|
|
2584
|
-
vmid = _parse_ctid(message)
|
|
2585
|
-
except ValueError:
|
|
2586
|
-
vmid = _resolve_vmid_for_device(child_device_id)
|
|
2587
2554
|
config = _ensure_infra_configured()
|
|
2588
2555
|
proxmox = _connect_proxmox(config)
|
|
2589
2556
|
node = _get_node_from_config(config)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|