portacode 1.4.17.dev10__tar.gz → 1.4.18__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.17.dev10 → portacode-1.4.18}/PKG-INFO +1 -1
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/_version.py +2 -2
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +1 -1
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/base.py +5 -3
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/proxmox_infra.py +66 -12
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode.egg-info/PKG-INFO +1 -1
- {portacode-1.4.17.dev10 → portacode-1.4.18}/.claude/agents/communication-manager.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/.claude/settings.local.json +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/.gitignore +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/.gitmodules +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/LICENSE +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/MANIFEST.in +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/Makefile +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/backup.sh +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/connect.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/connect.sh +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/docker-compose.yaml +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/docs/images/device-transfer-button.png +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/docs/images/device-transfer-modal.png +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/docs/images/pair-device-button.png +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/docs/images/pairing-request.png +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/docs/images/student-workspace.png +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/simple_device/Dockerfile +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/simple_device/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/simple_device/docker-compose.yaml +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/Dockerfile +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/.local/share/portacode/run/gateway.pid +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/.gitignore +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/db.sqlite3 +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/settings.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/wsgi.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/admin.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/apps.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/menu.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/models.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/views.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-01/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-02/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-03/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-04/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-05/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-06/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-07/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-08/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-09/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/data/student-10/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/docker-compose.yaml +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/manage.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/treats/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/treats/admin.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/treats/apps.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/treats/menu.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/treats/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/treats/tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/treats/urls.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/initial_content/treats/views.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/examples/workshop_fleet/instructions/WELCOME.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/__main__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/cli.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/client.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/chunked_content.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/diff_handlers.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/file_handlers.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/project_aware_file_handlers.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/project_state/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/project_state/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/project_state/file_system_watcher.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/project_state/git_manager.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/project_state/handlers.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/project_state/manager.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/project_state/models.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/project_state/utils.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/project_state_handlers.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/registry.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/session.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/system_handlers.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/tab_factory.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/terminal_handlers.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/test_proxmox_infra.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/handlers/update_handler.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/multiplex.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/connection/terminal.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/data.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/keypair.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/elinks +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/gio-open +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/gnome-open +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/gvfs-open +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/kde-open +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/kfmclient +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/link_capture_exec.sh +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/link_capture_wrapper.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/links +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/links2 +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/lynx +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/mate-open +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/netsurf +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/sensible-browser +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/w3m +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/x-www-browser +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/link_capture/bin/xdg-open +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/logging_categories.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/pairing.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/service.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/static/js/test-ntp-clock.html +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/static/js/utils/ntp-clock.js +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/utils/NTP_ARCHITECTURE.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/utils/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/utils/diff_apply.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/utils/diff_renderer.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode/utils/ntp_clock.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode.egg-info/SOURCES.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode.egg-info/dependency_links.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode.egg-info/entry_points.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode.egg-info/requires.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/portacode.egg-info/top_level.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/pyproject.toml +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/restore.sh +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/run_tests.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/setup.cfg +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/setup.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test.sh +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/test_device_online.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/test_file_operations.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/test_git_status_ui.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/test_login_flow.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/test_navigate_testing_folder.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/test_play_store_screenshots.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/test_terminal_buffer_performance.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/test_terminal_interaction.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/test_terminal_loading_race_condition.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_modules/test_terminal_start.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/test_request_id.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/.env.example +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/README.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/cli.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/core/__init__.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/core/base_test.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/core/cli_manager.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/core/hierarchical_runner.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/core/playwright_manager.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/core/runner.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/core/shared_cli_manager.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/core/test_discovery.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/testing_framework/requirements.txt +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/UI_UX/opening_a_file_on_desktop_results_in_nothing.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/agent_context_management.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/django_server_time_sync.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/issues/device_performance_degradation.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/issues/git_data_not_captured_in_proxmox.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/issues/indefinite_resource_loading.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/issues/portacode_service_silently_down.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/issues/premature_terminal_exit.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/issues/project_cpu_hotspots.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/issues/terminals_exit_upon_starting.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/issues/wrong_item_classification_on_client_side.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/todo/smartphone_terminal_input_frustrations.md +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/tools/generate_play_store_assets.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/tools/pairing_tester.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/tools/run_screenshot_suite.sh +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/tools/test_python_ntp_clock.py +0 -0
- {portacode-1.4.17.dev10 → portacode-1.4.18}/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.
|
|
32
|
-
__version_tuple__ = version_tuple = (1, 4,
|
|
31
|
+
__version__ = version = '1.4.18'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 4, 18)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
{portacode-1.4.17.dev10 → portacode-1.4.18}/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, optional): Identifier of the container to delete. If omitted, the handler resolves the CTID from the managed container records using `child_device_id`.
|
|
412
412
|
* `child_device_id` (string, required): Dashboard `Device.id` that should own the container metadata being purged.
|
|
413
413
|
|
|
414
414
|
**Responses:**
|
|
@@ -62,16 +62,18 @@ 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"))
|
|
65
66
|
if client_session_manager and client_session_manager.has_interested_clients():
|
|
66
67
|
# Get target sessions
|
|
67
68
|
target_sessions = client_session_manager.get_target_sessions(project_id)
|
|
68
|
-
if not target_sessions:
|
|
69
|
+
if not target_sessions and not bypass_session_gate:
|
|
69
70
|
logger.debug("handler: No target sessions found, skipping response send")
|
|
70
71
|
return
|
|
71
72
|
|
|
72
73
|
# Add session targeting information
|
|
73
74
|
enhanced_payload = dict(payload)
|
|
74
|
-
|
|
75
|
+
if target_sessions:
|
|
76
|
+
enhanced_payload["client_sessions"] = target_sessions
|
|
75
77
|
|
|
76
78
|
# Add backward compatibility reply_channel (first session if not provided)
|
|
77
79
|
if not reply_channel:
|
|
@@ -216,4 +218,4 @@ class SyncHandler(BaseHandler):
|
|
|
216
218
|
logger.exception("Error in sync handler %s: %s", self.command_name, exc)
|
|
217
219
|
# Extract project_id from original message for error targeting
|
|
218
220
|
project_id = message.get("project_id")
|
|
219
|
-
await self.send_error(str(exc), reply_channel, project_id)
|
|
221
|
+
await self.send_error(str(exc), reply_channel, project_id)
|
|
@@ -116,6 +116,7 @@ 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
|
|
119
120
|
|
|
120
121
|
future = asyncio.run_coroutine_threadsafe(handler.send_response(payload), loop)
|
|
121
122
|
future.add_done_callback(
|
|
@@ -1071,7 +1072,7 @@ _PACKAGE_MANAGER_PROFILES: Dict[str, Dict[str, Any]] = {
|
|
|
1071
1072
|
"zypper": {
|
|
1072
1073
|
"update_cmd": "zypper refresh",
|
|
1073
1074
|
"update_step_name": "zypper_update",
|
|
1074
|
-
"install_cmd": "zypper install -y
|
|
1075
|
+
"install_cmd": "zypper install -y python311 python311-pip sudo",
|
|
1075
1076
|
"install_step_name": "install_deps",
|
|
1076
1077
|
"update_retries": 3,
|
|
1077
1078
|
"install_retries": 5,
|
|
@@ -1101,6 +1102,7 @@ def _build_bootstrap_steps(
|
|
|
1101
1102
|
package_manager: str = "apt",
|
|
1102
1103
|
) -> List[Dict[str, Any]]:
|
|
1103
1104
|
profile = _PACKAGE_MANAGER_PROFILES.get(package_manager, _PACKAGE_MANAGER_PROFILES["apt"])
|
|
1105
|
+
python_cmd = "python3.11" if package_manager == "zypper" else "python3"
|
|
1104
1106
|
steps: List[Dict[str, Any]] = [
|
|
1105
1107
|
{"name": "wait_for_network", "cmd": _NETWORK_WAIT_CMD, "retries": 0},
|
|
1106
1108
|
]
|
|
@@ -1178,14 +1180,19 @@ def _build_bootstrap_steps(
|
|
|
1178
1180
|
steps.append(
|
|
1179
1181
|
{
|
|
1180
1182
|
"name": "add_ssh_key",
|
|
1181
|
-
"cmd": f"install -d -m 700 /home/{user}/.ssh && echo '{ssh_key}' >> /home/{user}/.ssh/authorized_keys && chown -R {user}
|
|
1183
|
+
"cmd": f"install -d -m 700 /home/{user}/.ssh && echo '{ssh_key}' >> /home/{user}/.ssh/authorized_keys && chown -R {user}:$(id -gn {shlex.quote(user)}) /home/{user}/.ssh",
|
|
1182
1184
|
"retries": 0,
|
|
1183
1185
|
}
|
|
1184
1186
|
)
|
|
1185
1187
|
steps.extend(
|
|
1186
1188
|
[
|
|
1187
|
-
{"name": "pip_upgrade", "cmd": "
|
|
1188
|
-
{"name": "install_portacode", "cmd": "
|
|
1189
|
+
{"name": "pip_upgrade", "cmd": f"{python_cmd} -m pip install --upgrade pip", "retries": 0},
|
|
1190
|
+
{"name": "install_portacode", "cmd": f"{python_cmd} -m pip install --upgrade portacode", "retries": 0},
|
|
1191
|
+
{
|
|
1192
|
+
"name": "ensure_portacode_path",
|
|
1193
|
+
"cmd": "if [ ! -f /etc/profile.d/portacode_path.sh ]; then printf 'export PATH=/usr/local/bin:$PATH\\n' >/etc/profile.d/portacode_path.sh; fi",
|
|
1194
|
+
"retries": 0,
|
|
1195
|
+
},
|
|
1189
1196
|
]
|
|
1190
1197
|
)
|
|
1191
1198
|
if include_portacode_connect:
|
|
@@ -1393,6 +1400,25 @@ def _parse_ctid(message: Dict[str, Any]) -> int:
|
|
|
1393
1400
|
raise ValueError("ctid is required")
|
|
1394
1401
|
|
|
1395
1402
|
|
|
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
|
+
|
|
1396
1422
|
def _ensure_container_managed(
|
|
1397
1423
|
proxmox: Any, node: str, vmid: int, *, device_id: Optional[str] = None
|
|
1398
1424
|
) -> Tuple[Dict[str, Any], Dict[str, Any]]:
|
|
@@ -1438,6 +1464,23 @@ def _su_command(user: str, command: str) -> str:
|
|
|
1438
1464
|
return f"su - {user} -s /bin/sh -c {shlex.quote(command)}"
|
|
1439
1465
|
|
|
1440
1466
|
|
|
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
|
+
def _resolve_portacode_cli_path(vmid: int, user: str) -> str:
|
|
1476
|
+
"""Resolve the full path to the portacode CLI inside the container."""
|
|
1477
|
+
res = _run_pct(vmid, _su_command(user, "command -v portacode"))
|
|
1478
|
+
path = (res.get("stdout") or "").strip()
|
|
1479
|
+
if path:
|
|
1480
|
+
return path
|
|
1481
|
+
return "portacode"
|
|
1482
|
+
|
|
1483
|
+
|
|
1441
1484
|
def _run_pct_check(vmid: int, cmd: str) -> Dict[str, Any]:
|
|
1442
1485
|
res = _run_pct(vmid, cmd)
|
|
1443
1486
|
if res["returncode"] != 0:
|
|
@@ -1465,12 +1508,13 @@ def _push_bytes_to_container(
|
|
|
1465
1508
|
) -> None:
|
|
1466
1509
|
logger.debug("Preparing to push %d bytes to container vmid=%s path=%s for user=%s", len(data), vmid, path, user)
|
|
1467
1510
|
tmp_path: Optional[str] = None
|
|
1511
|
+
owner = _resolve_user_group(vmid, user)
|
|
1468
1512
|
try:
|
|
1469
1513
|
parent = Path(path).parent
|
|
1470
1514
|
parent_str = parent.as_posix()
|
|
1471
1515
|
if parent_str not in {"", ".", "/"}:
|
|
1472
1516
|
_run_pct_exec_check(vmid, ["mkdir", "-p", parent_str])
|
|
1473
|
-
_run_pct_exec_check(vmid, ["chown", "-R",
|
|
1517
|
+
_run_pct_exec_check(vmid, ["chown", "-R", owner, parent_str])
|
|
1474
1518
|
|
|
1475
1519
|
with tempfile.NamedTemporaryFile(delete=False) as tmp:
|
|
1476
1520
|
tmp.write(data)
|
|
@@ -1482,7 +1526,7 @@ def _push_bytes_to_container(
|
|
|
1482
1526
|
if push_res.returncode != 0:
|
|
1483
1527
|
raise RuntimeError(push_res.stderr or push_res.stdout or f"pct push returned {push_res.returncode}")
|
|
1484
1528
|
|
|
1485
|
-
_run_pct_exec_check(vmid, ["chown",
|
|
1529
|
+
_run_pct_exec_check(vmid, ["chown", owner, path])
|
|
1486
1530
|
_run_pct_exec_check(vmid, ["chmod", format(mode, "o"), path])
|
|
1487
1531
|
logger.debug("Successfully pushed %d bytes to vmid=%s path=%s", len(data), vmid, path)
|
|
1488
1532
|
except Exception as exc:
|
|
@@ -1501,7 +1545,8 @@ def _resolve_portacode_key_dir(vmid: int, user: str) -> str:
|
|
|
1501
1545
|
data_home = _run_pct_check(vmid, data_dir_cmd)["stdout"].strip()
|
|
1502
1546
|
portacode_dir = f"{data_home}/portacode"
|
|
1503
1547
|
_run_pct_exec_check(vmid, ["mkdir", "-p", portacode_dir])
|
|
1504
|
-
|
|
1548
|
+
owner = _resolve_user_group(vmid, user)
|
|
1549
|
+
_run_pct_exec_check(vmid, ["chown", "-R", owner, portacode_dir])
|
|
1505
1550
|
return f"{portacode_dir}/keys"
|
|
1506
1551
|
|
|
1507
1552
|
|
|
@@ -1514,7 +1559,8 @@ def _deploy_device_keypair(vmid: int, user: str, private_key: str, public_key: s
|
|
|
1514
1559
|
|
|
1515
1560
|
|
|
1516
1561
|
def _portacode_connect_and_read_key(vmid: int, user: str, timeout_s: int = 10) -> Dict[str, Any]:
|
|
1517
|
-
|
|
1562
|
+
cli_path = _resolve_portacode_cli_path(vmid, user)
|
|
1563
|
+
su_connect_cmd = _su_command(user, f"{shlex.quote(cli_path)} connect")
|
|
1518
1564
|
cmd = ["pct", "exec", str(vmid), "--", "/bin/sh", "-c", su_connect_cmd]
|
|
1519
1565
|
proc = subprocess.Popen(cmd, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
1520
1566
|
start = time.time()
|
|
@@ -2240,7 +2286,11 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
2240
2286
|
on_behalf_of_device=device_id,
|
|
2241
2287
|
)
|
|
2242
2288
|
|
|
2243
|
-
|
|
2289
|
+
cli_path = _resolve_portacode_cli_path(vmid, payload_local["username"])
|
|
2290
|
+
cmd = _su_command(
|
|
2291
|
+
payload_local["username"],
|
|
2292
|
+
f"sudo -S {shlex.quote(cli_path)} service install",
|
|
2293
|
+
)
|
|
2244
2294
|
res = _run_pct(vmid, cmd, input_text=payload_local["password"] + "\n")
|
|
2245
2295
|
|
|
2246
2296
|
if res["returncode"] != 0:
|
|
@@ -2301,6 +2351,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
2301
2351
|
"setup_steps": steps,
|
|
2302
2352
|
"device_id": device_id,
|
|
2303
2353
|
"on_behalf_of_device": device_id,
|
|
2354
|
+
"bypass_session_gate": True,
|
|
2304
2355
|
"service_installed": service_installed,
|
|
2305
2356
|
"request_id": request_id,
|
|
2306
2357
|
},
|
|
@@ -2327,7 +2378,6 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
2327
2378
|
"event": "proxmox_container_accepted",
|
|
2328
2379
|
"success": True,
|
|
2329
2380
|
"message": "Provisioning accepted; resources reserved.",
|
|
2330
|
-
"device_id": device_id,
|
|
2331
2381
|
"request_id": request_id,
|
|
2332
2382
|
}
|
|
2333
2383
|
|
|
@@ -2403,7 +2453,8 @@ class StartPortacodeServiceHandler(SyncHandler):
|
|
|
2403
2453
|
on_behalf_of_device=on_behalf_of_device,
|
|
2404
2454
|
)
|
|
2405
2455
|
|
|
2406
|
-
|
|
2456
|
+
cli_path = _resolve_portacode_cli_path(vmid, user)
|
|
2457
|
+
cmd = _su_command(user, f"sudo -S {shlex.quote(cli_path)} service install")
|
|
2407
2458
|
res = _run_pct(vmid, cmd, input_text=password + "\n")
|
|
2408
2459
|
|
|
2409
2460
|
if res["returncode"] != 0:
|
|
@@ -2526,10 +2577,13 @@ class RemoveProxmoxContainerHandler(SyncHandler):
|
|
|
2526
2577
|
return "remove_proxmox_container"
|
|
2527
2578
|
|
|
2528
2579
|
def execute(self, message: Dict[str, Any]) -> Dict[str, Any]:
|
|
2529
|
-
vmid = _parse_ctid(message)
|
|
2530
2580
|
child_device_id = (message.get("child_device_id") or "").strip()
|
|
2531
2581
|
if not child_device_id:
|
|
2532
2582
|
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)
|
|
2533
2587
|
config = _ensure_infra_configured()
|
|
2534
2588
|
proxmox = _connect_proxmox(config)
|
|
2535
2589
|
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
|