portacode 1.4.12.dev9__tar.gz → 1.4.13.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/PKG-INFO +1 -1
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/_version.py +2 -2
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +2 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/base.py +45 -15
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/proxmox_infra.py +110 -9
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/PKG-INFO +1 -1
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/.claude/agents/communication-manager.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/.claude/settings.local.json +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/.gitignore +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/.gitmodules +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/LICENSE +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/MANIFEST.in +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/Makefile +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/backup.sh +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/connect.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/connect.sh +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docker-compose.yaml +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docs/images/device-transfer-button.png +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docs/images/device-transfer-modal.png +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docs/images/pair-device-button.png +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docs/images/pairing-request.png +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docs/images/student-workspace.png +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/simple_device/Dockerfile +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/simple_device/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/simple_device/docker-compose.yaml +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/Dockerfile +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/.local/share/portacode/run/gateway.pid +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/.gitignore +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/db.sqlite3 +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/settings.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/wsgi.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/admin.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/apps.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/menu.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/models.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/views.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/docker-compose.yaml +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/manage.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/templates/treats/home.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/admin.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/apps.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/menu.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/migrations/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/urls.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/views.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/instructions/WELCOME.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/__main__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/cli.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/client.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/chunked_content.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/diff_handlers.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/file_handlers.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_aware_file_handlers.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/file_system_watcher.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/git_manager.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/handlers.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/manager.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/models.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/utils.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state_handlers.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/registry.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/session.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/system_handlers.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/tab_factory.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/terminal_handlers.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/update_handler.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/multiplex.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/terminal.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/data.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/keypair.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-311.pyc +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/elinks +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/gio-open +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/gnome-open +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/gvfs-open +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/kde-open +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/kfmclient +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/link_capture_exec.sh +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/link_capture_wrapper.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/links +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/links2 +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/lynx +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/mate-open +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/netsurf +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/sensible-browser +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/w3m +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/x-www-browser +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/xdg-open +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/logging_categories.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/pairing.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/service.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/static/js/test-ntp-clock.html +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/static/js/utils/ntp-clock.js +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/utils/NTP_ARCHITECTURE.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/utils/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/utils/diff_apply.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/utils/diff_renderer.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/utils/ntp_clock.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/SOURCES.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/dependency_links.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/entry_points.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/requires.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/top_level.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/pyproject.toml +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/restore.sh +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/run_tests.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/setup.cfg +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/setup.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test.sh +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_device_online.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_file_operations.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_git_status_ui.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_login_flow.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_navigate_testing_folder.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_play_store_screenshots.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_terminal_buffer_performance.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_terminal_interaction.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_terminal_loading_race_condition.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_terminal_start.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_request_id.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/.env.example +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/README.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/cli.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/__init__.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/base_test.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/cli_manager.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/hierarchical_runner.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/playwright_manager.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/runner.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/shared_cli_manager.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/test_discovery.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/requirements.txt +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/UI_UX/opening_a_file_on_desktop_results_in_nothing.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/agent_context_management.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/django_server_time_sync.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/device_performance_degradation.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/git_data_not_captured_in_proxmox.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/indefinite_resource_loading.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/portacode_service_silently_down.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/premature_terminal_exit.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/project_cpu_hotspots.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/terminals_exit_upon_starting.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/wrong_item_classification_on_client_side.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/smartphone_terminal_input_frustrations.md +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/tools/generate_play_store_assets.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/tools/pairing_tester.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/tools/run_screenshot_suite.sh +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/tools/test_python_ntp_clock.py +0 -0
- {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/validate.sh +0 -0
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '1.4.
|
|
32
|
-
__version_tuple__ = version_tuple = (1, 4,
|
|
31
|
+
__version__ = version = '1.4.13.dev1'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 4, 13, 'dev1')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
{portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md
RENAMED
|
@@ -27,6 +27,8 @@ The Portacode server acts as a **routing middleman** between client sessions and
|
|
|
27
27
|
|
|
28
28
|
- **`source_client_session`** (Server → Device): Server **adds this** when forwarding client commands to devices (so device knows which client sent the command and can target responses back). Clients never include this field.
|
|
29
29
|
|
|
30
|
+
Device handlers that want to respond only to the session that issued a given command can rely on the helper defined in `portacode/connection/handlers/base.py` (`BaseHandler.send_response_to_source_session`). It wraps the boilerplate of reusing `request_id`/`trace`, injecting `client_sessions=[source_client_session]`, and sending via the control channel so the handler does not need to manually reconstruct routing metadata for each reply.
|
|
31
|
+
|
|
30
32
|
This document describes the complete protocol for communicating with devices through the server, guiding app developers on how to get their client sessions to communicate with devices.
|
|
31
33
|
|
|
32
34
|
## Table of Contents
|
|
@@ -88,6 +88,42 @@ class BaseHandler(ABC):
|
|
|
88
88
|
if reply_channel:
|
|
89
89
|
payload["reply_channel"] = reply_channel
|
|
90
90
|
await self.control_channel.send(payload)
|
|
91
|
+
|
|
92
|
+
async def send_response_to_source_session(
|
|
93
|
+
self,
|
|
94
|
+
message: Dict[str, Any],
|
|
95
|
+
payload: Dict[str, Any],
|
|
96
|
+
reply_channel: Optional[str] = None,
|
|
97
|
+
) -> None:
|
|
98
|
+
"""Send a response directly to the client session that issued ``message``.
|
|
99
|
+
|
|
100
|
+
This bypasses ``ClientSessionManager`` routing and ensures only the session
|
|
101
|
+
whose ``source_client_session`` was injected by the server will receive the
|
|
102
|
+
response. The helper also copies ``request_id``/``trace`` timing data so tracing
|
|
103
|
+
and logging remain consistent.
|
|
104
|
+
"""
|
|
105
|
+
response = dict(payload)
|
|
106
|
+
request_id = message.get("request_id")
|
|
107
|
+
if request_id and "request_id" not in response:
|
|
108
|
+
response["request_id"] = request_id
|
|
109
|
+
|
|
110
|
+
if "trace" in message and "request_id" in message and "trace" not in response:
|
|
111
|
+
trace_data = dict(message["trace"])
|
|
112
|
+
handler_complete_time = ntp_clock.now_ms()
|
|
113
|
+
if handler_complete_time is not None:
|
|
114
|
+
trace_data["handler_complete"] = handler_complete_time
|
|
115
|
+
if "client_send" in trace_data:
|
|
116
|
+
trace_data["ping"] = handler_complete_time - trace_data["client_send"]
|
|
117
|
+
response["trace"] = trace_data
|
|
118
|
+
|
|
119
|
+
source_client_session = message.get("source_client_session")
|
|
120
|
+
if source_client_session:
|
|
121
|
+
response["client_sessions"] = [source_client_session]
|
|
122
|
+
|
|
123
|
+
if reply_channel:
|
|
124
|
+
response["reply_channel"] = reply_channel
|
|
125
|
+
|
|
126
|
+
await self.control_channel.send(response)
|
|
91
127
|
|
|
92
128
|
async def send_error(self, message: str, reply_channel: Optional[str] = None, project_id: str = None) -> None:
|
|
93
129
|
"""Send an error response with client session awareness.
|
|
@@ -141,22 +177,16 @@ class AsyncHandler(BaseHandler):
|
|
|
141
177
|
if "request_id" in message and "request_id" not in response:
|
|
142
178
|
response["request_id"] = message["request_id"]
|
|
143
179
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
response["trace"] = dict(message["trace"])
|
|
180
|
+
if "trace" in message and "request_id" in message and "trace" not in response:
|
|
181
|
+
trace_data = dict(message["trace"])
|
|
147
182
|
handler_complete_time = ntp_clock.now_ms()
|
|
148
183
|
if handler_complete_time is not None:
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
# Extract project_id from response for session targeting
|
|
156
|
-
project_id = response.get("project_id")
|
|
157
|
-
logger.info("handler: %s response project_id=%s, response=%s",
|
|
158
|
-
self.command_name, project_id, response)
|
|
159
|
-
await self.send_response(response, reply_channel, project_id)
|
|
184
|
+
trace_data["handler_complete"] = handler_complete_time
|
|
185
|
+
if "client_send" in trace_data:
|
|
186
|
+
trace_data["ping"] = handler_complete_time - trace_data["client_send"]
|
|
187
|
+
response["trace"] = trace_data
|
|
188
|
+
logger.info(f"✅ Handler completed: {message['request_id']} ({self.command_name})")
|
|
189
|
+
|
|
160
190
|
else:
|
|
161
191
|
logger.info("handler: %s handled response transmission directly", self.command_name)
|
|
162
192
|
except Exception as exc:
|
|
@@ -216,4 +246,4 @@ class SyncHandler(BaseHandler):
|
|
|
216
246
|
logger.exception("Error in sync handler %s: %s", self.command_name, exc)
|
|
217
247
|
# Extract project_id from original message for error targeting
|
|
218
248
|
project_id = message.get("project_id")
|
|
219
|
-
await self.send_error(str(exc), reply_channel, project_id)
|
|
249
|
+
await self.send_error(str(exc), reply_channel, project_id)
|
{portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/proxmox_infra.py
RENAMED
|
@@ -59,6 +59,7 @@ def _emit_progress_event(
|
|
|
59
59
|
message: str,
|
|
60
60
|
phase: str,
|
|
61
61
|
request_id: Optional[str],
|
|
62
|
+
client_sessions: Optional[List[str]] = None,
|
|
62
63
|
details: Optional[Dict[str, Any]] = None,
|
|
63
64
|
) -> None:
|
|
64
65
|
loop = handler.context.get("event_loop")
|
|
@@ -84,6 +85,8 @@ def _emit_progress_event(
|
|
|
84
85
|
payload["request_id"] = request_id
|
|
85
86
|
if details:
|
|
86
87
|
payload["details"] = details
|
|
88
|
+
if client_sessions:
|
|
89
|
+
payload["client_sessions"] = client_sessions
|
|
87
90
|
|
|
88
91
|
future = asyncio.run_coroutine_threadsafe(handler.send_response(payload), loop)
|
|
89
92
|
future.add_done_callback(
|
|
@@ -1050,8 +1053,14 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
1050
1053
|
return "create_proxmox_container"
|
|
1051
1054
|
|
|
1052
1055
|
def execute(self, message: Dict[str, Any]) -> Dict[str, Any]:
|
|
1053
|
-
logger.info("create_proxmox_container command received")
|
|
1054
1056
|
request_id = message.get("request_id")
|
|
1057
|
+
source_client_session = message.get("source_client_session")
|
|
1058
|
+
logger.info(
|
|
1059
|
+
"create_proxmox_container command received request_id=%s client_session=%s",
|
|
1060
|
+
request_id,
|
|
1061
|
+
source_client_session,
|
|
1062
|
+
)
|
|
1063
|
+
client_sessions = [source_client_session] if source_client_session else None
|
|
1055
1064
|
bootstrap_user, bootstrap_password, bootstrap_ssh_key = _get_provisioning_user_info(message)
|
|
1056
1065
|
bootstrap_steps = _build_bootstrap_steps(bootstrap_user, bootstrap_password, bootstrap_ssh_key)
|
|
1057
1066
|
total_steps = 3 + len(bootstrap_steps) + 2
|
|
@@ -1075,6 +1084,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
1075
1084
|
message=start_message,
|
|
1076
1085
|
phase="lifecycle",
|
|
1077
1086
|
request_id=request_id,
|
|
1087
|
+
client_sessions=client_sessions,
|
|
1078
1088
|
)
|
|
1079
1089
|
try:
|
|
1080
1090
|
result = action()
|
|
@@ -1089,6 +1099,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
1089
1099
|
message=f"{step_label} failed: {exc}",
|
|
1090
1100
|
phase="lifecycle",
|
|
1091
1101
|
request_id=request_id,
|
|
1102
|
+
client_sessions=client_sessions,
|
|
1092
1103
|
details={"error": str(exc)},
|
|
1093
1104
|
)
|
|
1094
1105
|
raise
|
|
@@ -1102,6 +1113,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
1102
1113
|
message=success_message,
|
|
1103
1114
|
phase="lifecycle",
|
|
1104
1115
|
request_id=request_id,
|
|
1116
|
+
client_sessions=client_sessions,
|
|
1105
1117
|
)
|
|
1106
1118
|
current_step_index += 1
|
|
1107
1119
|
return result
|
|
@@ -1131,7 +1143,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
1131
1143
|
payload["cpuunits"] = max(int(payload["cpus"] * 1024), 10)
|
|
1132
1144
|
payload["memory"] = int(payload["ram_mib"])
|
|
1133
1145
|
payload["node"] = node
|
|
1134
|
-
logger.
|
|
1146
|
+
logger.info(
|
|
1135
1147
|
"Provisioning container node=%s template=%s ram=%s cpu=%s storage=%s",
|
|
1136
1148
|
node,
|
|
1137
1149
|
payload["template"],
|
|
@@ -1144,6 +1156,12 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
1144
1156
|
payload["created_at"] = datetime.utcnow().isoformat() + "Z"
|
|
1145
1157
|
payload["status"] = "creating"
|
|
1146
1158
|
_write_container_record(vmid, payload)
|
|
1159
|
+
logger.info(
|
|
1160
|
+
"Container record written vmid=%s hostname=%s client_session=%s",
|
|
1161
|
+
vmid,
|
|
1162
|
+
payload["hostname"],
|
|
1163
|
+
source_client_session,
|
|
1164
|
+
)
|
|
1147
1165
|
return proxmox, node, vmid, payload
|
|
1148
1166
|
|
|
1149
1167
|
proxmox, node, vmid, payload = _run_lifecycle_step(
|
|
@@ -1202,9 +1220,16 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
1202
1220
|
message=message_text,
|
|
1203
1221
|
phase="bootstrap",
|
|
1204
1222
|
request_id=request_id,
|
|
1223
|
+
client_sessions=client_sessions,
|
|
1205
1224
|
details=details or None,
|
|
1206
1225
|
)
|
|
1207
1226
|
|
|
1227
|
+
logger.info(
|
|
1228
|
+
"Bootstrapping Portacode in container vmid=%s user=%s client_session=%s",
|
|
1229
|
+
vmid,
|
|
1230
|
+
payload["username"],
|
|
1231
|
+
source_client_session,
|
|
1232
|
+
)
|
|
1208
1233
|
public_key, steps = _bootstrap_portacode(
|
|
1209
1234
|
vmid,
|
|
1210
1235
|
payload["username"],
|
|
@@ -1217,7 +1242,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
1217
1242
|
)
|
|
1218
1243
|
current_step_index += len(bootstrap_steps)
|
|
1219
1244
|
|
|
1220
|
-
|
|
1245
|
+
response = {
|
|
1221
1246
|
"event": "proxmox_container_created",
|
|
1222
1247
|
"success": True,
|
|
1223
1248
|
"message": f"Container {vmid} is ready and Portacode key captured.",
|
|
@@ -1234,6 +1259,10 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
1234
1259
|
},
|
|
1235
1260
|
"setup_steps": steps,
|
|
1236
1261
|
}
|
|
1262
|
+
if client_sessions:
|
|
1263
|
+
response["client_sessions"] = client_sessions
|
|
1264
|
+
response["_reply_to_source_session"] = True
|
|
1265
|
+
return response
|
|
1237
1266
|
|
|
1238
1267
|
|
|
1239
1268
|
class StartPortacodeServiceHandler(SyncHandler):
|
|
@@ -1261,6 +1290,15 @@ class StartPortacodeServiceHandler(SyncHandler):
|
|
|
1261
1290
|
start_index = int(message.get("step_index", 1))
|
|
1262
1291
|
total_steps = int(message.get("total_steps", start_index + 2))
|
|
1263
1292
|
request_id = message.get("request_id")
|
|
1293
|
+
source_client_session = message.get("source_client_session")
|
|
1294
|
+
client_sessions = [source_client_session] if source_client_session else None
|
|
1295
|
+
|
|
1296
|
+
logger.info(
|
|
1297
|
+
"start_portacode_service invoked vmid=%s user=%s client_session=%s",
|
|
1298
|
+
vmid,
|
|
1299
|
+
user,
|
|
1300
|
+
source_client_session,
|
|
1301
|
+
)
|
|
1264
1302
|
|
|
1265
1303
|
auth_step_name = "setup_device_authentication"
|
|
1266
1304
|
auth_label = "Setting up device authentication"
|
|
@@ -1274,6 +1312,7 @@ class StartPortacodeServiceHandler(SyncHandler):
|
|
|
1274
1312
|
message="Notifying the server of the new device…",
|
|
1275
1313
|
phase="service",
|
|
1276
1314
|
request_id=request_id,
|
|
1315
|
+
client_sessions=client_sessions,
|
|
1277
1316
|
)
|
|
1278
1317
|
_emit_progress_event(
|
|
1279
1318
|
self,
|
|
@@ -1285,6 +1324,7 @@ class StartPortacodeServiceHandler(SyncHandler):
|
|
|
1285
1324
|
message="Authentication metadata recorded.",
|
|
1286
1325
|
phase="service",
|
|
1287
1326
|
request_id=request_id,
|
|
1327
|
+
client_sessions=client_sessions,
|
|
1288
1328
|
)
|
|
1289
1329
|
|
|
1290
1330
|
install_step = start_index + 1
|
|
@@ -1299,6 +1339,7 @@ class StartPortacodeServiceHandler(SyncHandler):
|
|
|
1299
1339
|
message="Running sudo portacode service install…",
|
|
1300
1340
|
phase="service",
|
|
1301
1341
|
request_id=request_id,
|
|
1342
|
+
client_sessions=client_sessions,
|
|
1302
1343
|
)
|
|
1303
1344
|
|
|
1304
1345
|
cmd = f"su - {user} -c 'sudo -S portacode service install'"
|
|
@@ -1315,6 +1356,7 @@ class StartPortacodeServiceHandler(SyncHandler):
|
|
|
1315
1356
|
message=f"{install_label} failed: {res.get('stderr') or res.get('stdout')}",
|
|
1316
1357
|
phase="service",
|
|
1317
1358
|
request_id=request_id,
|
|
1359
|
+
client_sessions=client_sessions,
|
|
1318
1360
|
details={
|
|
1319
1361
|
"stderr": res.get("stderr"),
|
|
1320
1362
|
"stdout": res.get("stdout"),
|
|
@@ -1322,6 +1364,12 @@ class StartPortacodeServiceHandler(SyncHandler):
|
|
|
1322
1364
|
)
|
|
1323
1365
|
raise RuntimeError(res.get("stderr") or res.get("stdout") or "Service install failed")
|
|
1324
1366
|
|
|
1367
|
+
logger.info(
|
|
1368
|
+
"portacode service install command completed vmid=%s returncode=%s",
|
|
1369
|
+
vmid,
|
|
1370
|
+
res["returncode"],
|
|
1371
|
+
)
|
|
1372
|
+
|
|
1325
1373
|
_emit_progress_event(
|
|
1326
1374
|
self,
|
|
1327
1375
|
step_index=install_step,
|
|
@@ -1332,14 +1380,19 @@ class StartPortacodeServiceHandler(SyncHandler):
|
|
|
1332
1380
|
message="Portacode service install finished.",
|
|
1333
1381
|
phase="service",
|
|
1334
1382
|
request_id=request_id,
|
|
1383
|
+
client_sessions=client_sessions,
|
|
1335
1384
|
)
|
|
1336
1385
|
|
|
1337
|
-
|
|
1386
|
+
response = {
|
|
1338
1387
|
"event": "proxmox_service_started",
|
|
1339
1388
|
"success": True,
|
|
1340
1389
|
"message": "Portacode service install completed",
|
|
1341
1390
|
"ctid": str(vmid),
|
|
1342
1391
|
}
|
|
1392
|
+
if client_sessions:
|
|
1393
|
+
response["client_sessions"] = client_sessions
|
|
1394
|
+
response["_reply_to_source_session"] = True
|
|
1395
|
+
return response
|
|
1343
1396
|
|
|
1344
1397
|
|
|
1345
1398
|
class StartProxmoxContainerHandler(SyncHandler):
|
|
@@ -1355,12 +1408,20 @@ class StartProxmoxContainerHandler(SyncHandler):
|
|
|
1355
1408
|
proxmox = _connect_proxmox(config)
|
|
1356
1409
|
node = _get_node_from_config(config)
|
|
1357
1410
|
_ensure_container_managed(proxmox, node, vmid)
|
|
1411
|
+
source_client_session = message.get("source_client_session")
|
|
1412
|
+
client_sessions = [source_client_session] if source_client_session else None
|
|
1413
|
+
|
|
1414
|
+
logger.info(
|
|
1415
|
+
"start_proxmox_container invoked vmid=%s client_session=%s",
|
|
1416
|
+
vmid,
|
|
1417
|
+
source_client_session,
|
|
1418
|
+
)
|
|
1358
1419
|
|
|
1359
1420
|
status, elapsed = _start_container(proxmox, node, vmid)
|
|
1360
1421
|
_update_container_record(vmid, {"status": "running"})
|
|
1361
1422
|
|
|
1362
1423
|
infra = get_infra_snapshot()
|
|
1363
|
-
|
|
1424
|
+
response = {
|
|
1364
1425
|
"event": "proxmox_container_action",
|
|
1365
1426
|
"action": "start",
|
|
1366
1427
|
"success": True,
|
|
@@ -1370,6 +1431,10 @@ class StartProxmoxContainerHandler(SyncHandler):
|
|
|
1370
1431
|
"status": status.get("status"),
|
|
1371
1432
|
"infra": infra,
|
|
1372
1433
|
}
|
|
1434
|
+
if client_sessions:
|
|
1435
|
+
response["client_sessions"] = client_sessions
|
|
1436
|
+
response["_reply_to_source_session"] = True
|
|
1437
|
+
return response
|
|
1373
1438
|
|
|
1374
1439
|
|
|
1375
1440
|
class StopProxmoxContainerHandler(SyncHandler):
|
|
@@ -1385,6 +1450,14 @@ class StopProxmoxContainerHandler(SyncHandler):
|
|
|
1385
1450
|
proxmox = _connect_proxmox(config)
|
|
1386
1451
|
node = _get_node_from_config(config)
|
|
1387
1452
|
_ensure_container_managed(proxmox, node, vmid)
|
|
1453
|
+
source_client_session = message.get("source_client_session")
|
|
1454
|
+
client_sessions = [source_client_session] if source_client_session else None
|
|
1455
|
+
|
|
1456
|
+
logger.info(
|
|
1457
|
+
"stop_proxmox_container invoked vmid=%s client_session=%s",
|
|
1458
|
+
vmid,
|
|
1459
|
+
source_client_session,
|
|
1460
|
+
)
|
|
1388
1461
|
|
|
1389
1462
|
status, elapsed = _stop_container(proxmox, node, vmid)
|
|
1390
1463
|
final_status = status.get("status") or "stopped"
|
|
@@ -1396,7 +1469,7 @@ class StopProxmoxContainerHandler(SyncHandler):
|
|
|
1396
1469
|
if final_status != "running" and elapsed == 0.0
|
|
1397
1470
|
else f"Stopped container {vmid} in {elapsed:.1f}s."
|
|
1398
1471
|
)
|
|
1399
|
-
|
|
1472
|
+
response = {
|
|
1400
1473
|
"event": "proxmox_container_action",
|
|
1401
1474
|
"action": "stop",
|
|
1402
1475
|
"success": True,
|
|
@@ -1406,6 +1479,10 @@ class StopProxmoxContainerHandler(SyncHandler):
|
|
|
1406
1479
|
"status": final_status,
|
|
1407
1480
|
"infra": infra,
|
|
1408
1481
|
}
|
|
1482
|
+
if client_sessions:
|
|
1483
|
+
response["client_sessions"] = client_sessions
|
|
1484
|
+
response["_reply_to_source_session"] = True
|
|
1485
|
+
return response
|
|
1409
1486
|
|
|
1410
1487
|
|
|
1411
1488
|
class RemoveProxmoxContainerHandler(SyncHandler):
|
|
@@ -1421,13 +1498,21 @@ class RemoveProxmoxContainerHandler(SyncHandler):
|
|
|
1421
1498
|
proxmox = _connect_proxmox(config)
|
|
1422
1499
|
node = _get_node_from_config(config)
|
|
1423
1500
|
_ensure_container_managed(proxmox, node, vmid)
|
|
1501
|
+
source_client_session = message.get("source_client_session")
|
|
1502
|
+
client_sessions = [source_client_session] if source_client_session else None
|
|
1503
|
+
|
|
1504
|
+
logger.info(
|
|
1505
|
+
"remove_proxmox_container invoked vmid=%s client_session=%s",
|
|
1506
|
+
vmid,
|
|
1507
|
+
source_client_session,
|
|
1508
|
+
)
|
|
1424
1509
|
|
|
1425
1510
|
stop_status, stop_elapsed = _stop_container(proxmox, node, vmid)
|
|
1426
1511
|
delete_status, delete_elapsed = _delete_container(proxmox, node, vmid)
|
|
1427
1512
|
_remove_container_record(vmid)
|
|
1428
1513
|
|
|
1429
1514
|
infra = get_infra_snapshot()
|
|
1430
|
-
|
|
1515
|
+
response = {
|
|
1431
1516
|
"event": "proxmox_container_action",
|
|
1432
1517
|
"action": "remove",
|
|
1433
1518
|
"success": True,
|
|
@@ -1440,6 +1525,10 @@ class RemoveProxmoxContainerHandler(SyncHandler):
|
|
|
1440
1525
|
"status": "deleted",
|
|
1441
1526
|
"infra": infra,
|
|
1442
1527
|
}
|
|
1528
|
+
if client_sessions:
|
|
1529
|
+
response["client_sessions"] = client_sessions
|
|
1530
|
+
response["_reply_to_source_session"] = True
|
|
1531
|
+
return response
|
|
1443
1532
|
|
|
1444
1533
|
|
|
1445
1534
|
class ConfigureProxmoxInfraHandler(SyncHandler):
|
|
@@ -1453,13 +1542,19 @@ class ConfigureProxmoxInfraHandler(SyncHandler):
|
|
|
1453
1542
|
verify_ssl = bool(message.get("verify_ssl"))
|
|
1454
1543
|
if not token_identifier or not token_value:
|
|
1455
1544
|
raise ValueError("token_identifier and token_value are required")
|
|
1545
|
+
source_client_session = message.get("source_client_session")
|
|
1546
|
+
client_sessions = [source_client_session] if source_client_session else None
|
|
1456
1547
|
snapshot = configure_infrastructure(token_identifier, token_value, verify_ssl=verify_ssl)
|
|
1457
|
-
|
|
1548
|
+
response = {
|
|
1458
1549
|
"event": "proxmox_infra_configured",
|
|
1459
1550
|
"success": True,
|
|
1460
1551
|
"message": "Proxmox infrastructure configured",
|
|
1461
1552
|
"infra": snapshot,
|
|
1462
1553
|
}
|
|
1554
|
+
if client_sessions:
|
|
1555
|
+
response["client_sessions"] = client_sessions
|
|
1556
|
+
response["_reply_to_source_session"] = True
|
|
1557
|
+
return response
|
|
1463
1558
|
|
|
1464
1559
|
|
|
1465
1560
|
class RevertProxmoxInfraHandler(SyncHandler):
|
|
@@ -1468,10 +1563,16 @@ class RevertProxmoxInfraHandler(SyncHandler):
|
|
|
1468
1563
|
return "revert_proxmox_infra"
|
|
1469
1564
|
|
|
1470
1565
|
def execute(self, message: Dict[str, Any]) -> Dict[str, Any]:
|
|
1566
|
+
source_client_session = message.get("source_client_session")
|
|
1567
|
+
client_sessions = [source_client_session] if source_client_session else None
|
|
1471
1568
|
snapshot = revert_infrastructure()
|
|
1472
|
-
|
|
1569
|
+
response = {
|
|
1473
1570
|
"event": "proxmox_infra_reverted",
|
|
1474
1571
|
"success": True,
|
|
1475
1572
|
"message": "Proxmox infrastructure configuration reverted",
|
|
1476
1573
|
"infra": snapshot,
|
|
1477
1574
|
}
|
|
1575
|
+
if client_sessions:
|
|
1576
|
+
response["client_sessions"] = client_sessions
|
|
1577
|
+
response["_reply_to_source_session"] = True
|
|
1578
|
+
return response
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|