portacode 1.5.29.dev0__tar.gz → 1.5.31.dev0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/PKG-INFO +1 -1
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/_version.py +2 -2
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/codex_prepare.py +20 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/browser_handlers.py +50 -7
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/test_browser_handlers.py +55 -1
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tests/test_codex_prepare.py +17 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode.egg-info/PKG-INFO +1 -1
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/.claude/agents/communication-manager.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/.claude/settings.local.json +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/.gitignore +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/.gitmodules +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/AGENTS.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/LICENSE +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/MANIFEST.in +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/Makefile +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/build_android.sh +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/connect.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/connect.sh +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/docs/cloudflared-domain-connect-containers-audit.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/docs/creative-team-brief-portacode.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/docs/device-health-alerting-plan.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/docs/devops-messaging-ab-tests.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/docs/homepage-dashboard-positioning-fixes.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/docs/template-guide.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/simple_device/Dockerfile +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/simple_device/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/simple_device/docker-compose.yaml +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/Dockerfile +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/.local/share/portacode/run/gateway.pid +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/.gitignore +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/db.sqlite3 +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/settings.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/wsgi.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/admin.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/apps.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/menu.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/models.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/views.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/docker-compose.yaml +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/manage.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/templates/treats/home.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/treats/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/treats/admin.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/treats/apps.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/treats/menu.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/treats/migrations/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/treats/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/treats/tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/treats/urls.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/initial_content/treats/views.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/examples/workshop_fleet/instructions/WELCOME.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/__main__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/cli.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/codex_loopback_proxy.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/codex_usage_limit.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/client.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/codex_app_server.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/automation_v2_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/base.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/chunked_content.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/cloudflare_forwarding.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/cloudflare_tunnel.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/codex_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/diff_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/file_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/file_transfer_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_aware_file_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_state/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_state/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_state/file_system_watcher.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_state/git_manager.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_state/handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_state/manager.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_state/models.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_state/test_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_state/utils.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/project_state_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/proxmox_infra.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/registry.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/resumable_transfer_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/runtime_user.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/session.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/system_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/tab_factory.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/terminal_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/test_cloudflare_forwarding.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/test_file_move_copy.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/test_proxmox_infra.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/test_runtime_user.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/update_handler.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/multiplex.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/terminal.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/test_webmin_proxy_config.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/webmin_proxy_config.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/data.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/exit_codes.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/github_credential.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/keypair.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/__pycache__/__init__.cpython-38.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-311.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-38.pyc +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/elinks +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/gio-open +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/gnome-open +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/gvfs-open +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/kde-open +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/kfmclient +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/link_capture_exec.sh +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/link_capture_wrapper.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/links +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/links2 +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/lynx +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/mate-open +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/netsurf +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/sensible-browser +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/w3m +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/x-www-browser +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/link_capture/bin/xdg-open +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/logging_categories.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/pairing.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/provisioning_cache.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/restart.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/service.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/singleton.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/static/js/test-ntp-clock.html +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/static/js/utils/ntp-clock.js +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/test_runtime_paths.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/test_service.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/test_singleton.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/test_terminal_exposed_services.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tests/test_codex_app_server.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tests/test_codex_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tests/test_codex_loopback_proxy.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tests/test_github_credential.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tests/test_image_read_handler.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tests/test_resumable_transfer_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tests/test_system_handlers.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tunneling/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tunneling/cloudflared_login.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tunneling/ensure_cloudflared.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tunneling/ensure_pyyaml.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tunneling/forwarding_state.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tunneling/get_domain.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tunneling/privileged.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tunneling/service_install.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/tunneling/state.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/updater.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/utils/NTP_ARCHITECTURE.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/utils/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/utils/diff_apply.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/utils/diff_renderer.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/utils/ntp_clock.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/utils/runtime_paths.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode.egg-info/SOURCES.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode.egg-info/dependency_links.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode.egg-info/entry_points.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode.egg-info/requires.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode.egg-info/top_level.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/.gitignore +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/persistent_workspace/Dockerfile +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/persistent_workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/persistent_workspace/entrypoint.sh +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/persistent_workspace/manage_classroom.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/temporary_workspace/Dockerfile +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/temporary_workspace/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/temporary_workspace/docker-compose.yaml +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/temporary_workspace/docs/device_transfere.png +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/temporary_workspace/docs/pairing_approval.png +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode_for_school/temporary_workspace/entrypoint.sh +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/pyproject.toml +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/run_tests.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/scripts/diagnose_codex_gateway.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/setup.cfg +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/setup.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test.sh +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/test_device_online.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/test_file_operations.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/test_git_status_ui.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/test_login_flow.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/test_navigate_testing_folder.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/test_play_store_screenshots.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/test_terminal_buffer_performance.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/test_terminal_interaction.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/test_terminal_loading_race_condition.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_modules/test_terminal_start.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_request_id.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/test_session_terminal_shutdown.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/.env.example +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/README.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/cli.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/core/__init__.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/core/base_test.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/core/cli_manager.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/core/hierarchical_runner.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/core/playwright_manager.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/core/runner.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/core/shared_cli_manager.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/core/test_discovery.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/testing_framework/requirements.txt +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/UI_UX/opening_a_file_on_desktop_results_in_nothing.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/UI_UX/server_occasionally_stops_communicating_with_all_devices.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/agent_context_management.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/django_server_time_sync.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/issues/device_performance_degradation.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/issues/git_data_not_captured_in_proxmox.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/issues/indefinite_resource_loading.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/issues/portacode_service_silently_down.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/issues/premature_terminal_exit.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/issues/project_cpu_hotspots.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/issues/terminals_exit_upon_starting.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/issues/websocket_client_silently_dead.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/issues/wrong_item_classification_on_client_side.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/todo/smartphone_terminal_input_frustrations.md +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/tools/generate_play_store_assets.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/tools/pairing_tester.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/tools/run_screenshot_suite.sh +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/tools/test_python_ntp_clock.py +0 -0
- {portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/validate.sh +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.5.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 5,
|
|
21
|
+
__version__ = version = '1.5.31.dev0'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 5, 31, 'dev0')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -343,6 +343,12 @@ def ensure_codex_home() -> Path:
|
|
|
343
343
|
sessions_dir = codex_home / "sessions"
|
|
344
344
|
sessions_dir.mkdir(parents=True, exist_ok=True)
|
|
345
345
|
|
|
346
|
+
# The Portacode service may run as root even though Codex is launched as
|
|
347
|
+
# the requested runtime user. Repair the two directories we create here
|
|
348
|
+
# unconditionally so a root service cannot leave Codex unable to save
|
|
349
|
+
# threads. Keep this non-recursive to avoid touching live session files.
|
|
350
|
+
_repair_codex_home_ownership(codex_home, sessions_dir)
|
|
351
|
+
|
|
346
352
|
root_codex = Path("/root/.codex")
|
|
347
353
|
root_sessions = root_codex / "sessions"
|
|
348
354
|
seeded_paths: list[Path] = []
|
|
@@ -405,6 +411,20 @@ def ensure_codex_home() -> Path:
|
|
|
405
411
|
return codex_home
|
|
406
412
|
|
|
407
413
|
|
|
414
|
+
def _repair_codex_home_ownership(codex_home: Path, sessions_dir: Path) -> None:
|
|
415
|
+
try:
|
|
416
|
+
from portacode.connection.handlers.runtime_user import (
|
|
417
|
+
chown_path_if_possible,
|
|
418
|
+
get_default_runtime_user,
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
owner = get_default_runtime_user()
|
|
422
|
+
chown_path_if_possible(codex_home, owner)
|
|
423
|
+
chown_path_if_possible(sessions_dir, owner)
|
|
424
|
+
except Exception:
|
|
425
|
+
pass
|
|
426
|
+
|
|
427
|
+
|
|
408
428
|
def apply_codex_env_to_mapping(
|
|
409
429
|
env: MutableMapping[str, str],
|
|
410
430
|
path: Optional[Path] = None,
|
{portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/portacode/connection/handlers/browser_handlers.py
RENAMED
|
@@ -12,6 +12,7 @@ from pathlib import Path
|
|
|
12
12
|
from typing import Any, Dict
|
|
13
13
|
|
|
14
14
|
from .base import AsyncHandler
|
|
15
|
+
from .chunked_content import create_chunked_response, should_chunk_content
|
|
15
16
|
from .runtime_user import get_default_runtime_user, get_runtime_user_home, mkdir_with_owner, wrap_argv_for_user
|
|
16
17
|
|
|
17
18
|
|
|
@@ -21,6 +22,7 @@ _WORKERS_LOCK: asyncio.Lock | None = None
|
|
|
21
22
|
_NODE_PATH: str | None = None
|
|
22
23
|
_NODE_PATH_LOCK: asyncio.Lock | None = None
|
|
23
24
|
_WORKER_IDLE_SECONDS = 300.0
|
|
25
|
+
_MAX_WORKER_RESPONSE_BYTES = 16 * 1024 * 1024
|
|
24
26
|
logger = logging.getLogger(__name__)
|
|
25
27
|
_RUNNER = r"""
|
|
26
28
|
const fs = require('fs');
|
|
@@ -33,7 +35,7 @@ const locator = (p,s) => {
|
|
|
33
35
|
else if (s.text) l=p.getByText(s.text, {exact:!!s.exact});
|
|
34
36
|
else if (s.testid) l=p.getByTestId(s.testid);
|
|
35
37
|
else l=p.locator(s.css || s.selector);
|
|
36
|
-
return s.nth
|
|
38
|
+
return s.nth == null ? l : l.nth(s.nth);
|
|
37
39
|
};
|
|
38
40
|
let context=null, page=null;
|
|
39
41
|
const closeContext = async () => {
|
|
@@ -92,11 +94,15 @@ const run = async cfg => {
|
|
|
92
94
|
return out;
|
|
93
95
|
};
|
|
94
96
|
const rl=readline.createInterface({input:process.stdin,crlfDelay:Infinity});
|
|
97
|
+
const writeResult = out => {
|
|
98
|
+
const payload=JSON.stringify(out);
|
|
99
|
+
process.stdout.write(Buffer.byteLength(payload,'utf8')+'\n'+payload);
|
|
100
|
+
};
|
|
95
101
|
rl.on('line', line => {
|
|
96
102
|
rl.pause();
|
|
97
103
|
(async()=>run(JSON.parse(line)))()
|
|
98
|
-
.then(
|
|
99
|
-
.catch(e=>
|
|
104
|
+
.then(writeResult)
|
|
105
|
+
.catch(e=>writeResult({ok:false,error:String(e)}))
|
|
100
106
|
.finally(()=>rl.resume());
|
|
101
107
|
});
|
|
102
108
|
rl.on('close', async()=>{await closeContext(); process.exit(0);});
|
|
@@ -188,15 +194,32 @@ class _BrowserWorker:
|
|
|
188
194
|
try:
|
|
189
195
|
self.process.stdin.write((json.dumps(config) + "\n").encode())
|
|
190
196
|
await self.process.stdin.drain()
|
|
191
|
-
|
|
192
|
-
if not
|
|
197
|
+
header = await asyncio.wait_for(self.process.stdout.readline(), timeout=timeout)
|
|
198
|
+
if not header:
|
|
193
199
|
detail = bytes(self.stderr_tail).decode(errors="replace")[-500:]
|
|
194
200
|
await self._stop_locked()
|
|
195
201
|
raise RuntimeError(
|
|
196
202
|
f"Playwright worker exited unexpectedly: {detail}"
|
|
197
203
|
)
|
|
198
|
-
|
|
199
|
-
|
|
204
|
+
try:
|
|
205
|
+
response_size = int(header)
|
|
206
|
+
except ValueError as exc:
|
|
207
|
+
raise ValueError("invalid Playwright worker response frame") from exc
|
|
208
|
+
if response_size < 0 or response_size > _MAX_WORKER_RESPONSE_BYTES:
|
|
209
|
+
raise ValueError(
|
|
210
|
+
f"Playwright worker response exceeds {_MAX_WORKER_RESPONSE_BYTES} bytes"
|
|
211
|
+
)
|
|
212
|
+
payload = await asyncio.wait_for(
|
|
213
|
+
self.process.stdout.readexactly(response_size), timeout=timeout
|
|
214
|
+
)
|
|
215
|
+
result = json.loads(payload)
|
|
216
|
+
except (
|
|
217
|
+
asyncio.TimeoutError,
|
|
218
|
+
asyncio.IncompleteReadError,
|
|
219
|
+
BrokenPipeError,
|
|
220
|
+
ValueError,
|
|
221
|
+
json.JSONDecodeError,
|
|
222
|
+
) as exc:
|
|
200
223
|
await self._stop_locked()
|
|
201
224
|
if isinstance(exc, asyncio.TimeoutError):
|
|
202
225
|
raise RuntimeError("Browser run exceeded its bounded execution time") from exc
|
|
@@ -239,6 +262,26 @@ class BrowserRunHandler(AsyncHandler):
|
|
|
239
262
|
def command_name(self) -> str:
|
|
240
263
|
return "browser_run"
|
|
241
264
|
|
|
265
|
+
async def send_response(self, payload, reply_channel=None, project_id=None):
|
|
266
|
+
"""Chunk large browser results while preserving the normal response envelope."""
|
|
267
|
+
if payload.get("event") == "browser_run_response":
|
|
268
|
+
serialized = json.dumps(payload, separators=(",", ":"))
|
|
269
|
+
if should_chunk_content(serialized):
|
|
270
|
+
base_response = {
|
|
271
|
+
"event": "browser_run_response",
|
|
272
|
+
"success": bool(payload.get("success")),
|
|
273
|
+
"browser_chunked": True,
|
|
274
|
+
}
|
|
275
|
+
for key in ("request_id", "trace"):
|
|
276
|
+
if key in payload:
|
|
277
|
+
base_response[key] = payload[key]
|
|
278
|
+
for chunk in create_chunked_response(
|
|
279
|
+
base_response, "chunk_content", serialized
|
|
280
|
+
):
|
|
281
|
+
await super().send_response(chunk, reply_channel, project_id)
|
|
282
|
+
return
|
|
283
|
+
await super().send_response(payload, reply_channel, project_id)
|
|
284
|
+
|
|
242
285
|
async def execute(self, message: Dict[str, Any]) -> Dict[str, Any]:
|
|
243
286
|
session_id = str(message.get("session_id") or "default")
|
|
244
287
|
if not _SAFE_ID.fullmatch(session_id):
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import unittest
|
|
2
|
-
|
|
2
|
+
import asyncio
|
|
3
|
+
import json
|
|
4
|
+
from types import SimpleNamespace
|
|
5
|
+
from unittest.mock import AsyncMock, Mock, patch
|
|
3
6
|
|
|
4
7
|
from . import browser_handlers
|
|
5
8
|
from .browser_handlers import BrowserRunHandler
|
|
@@ -60,3 +63,54 @@ class BrowserRunHandlerTests(unittest.IsolatedAsyncioTestCase):
|
|
|
60
63
|
self.assertIsNot(first, other_user)
|
|
61
64
|
self.assertIsNot(first, other_session)
|
|
62
65
|
browser_handlers._WORKERS.clear()
|
|
66
|
+
|
|
67
|
+
async def test_worker_reads_large_length_prefixed_response(self):
|
|
68
|
+
payload = {"ok": True, "screenshots": [{"data": "a" * 200_000}]}
|
|
69
|
+
encoded = json.dumps(payload).encode()
|
|
70
|
+
stdout = asyncio.StreamReader()
|
|
71
|
+
stdout.feed_data(str(len(encoded)).encode() + b"\n" + encoded)
|
|
72
|
+
stdout.feed_eof()
|
|
73
|
+
|
|
74
|
+
class Stdin:
|
|
75
|
+
def write(self, _value):
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
async def drain(self):
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
worker = browser_handlers._BrowserWorker(
|
|
82
|
+
user="tester", session_id="large", argv=["node"], env={}
|
|
83
|
+
)
|
|
84
|
+
worker.process = SimpleNamespace(
|
|
85
|
+
stdin=Stdin(), stdout=stdout, returncode=None
|
|
86
|
+
)
|
|
87
|
+
worker._start = AsyncMock()
|
|
88
|
+
worker._schedule_idle_close = Mock()
|
|
89
|
+
|
|
90
|
+
self.assertEqual(await worker.run({}, timeout=1), payload)
|
|
91
|
+
|
|
92
|
+
async def test_large_browser_response_uses_existing_chunk_format(self):
|
|
93
|
+
channel = AsyncMock()
|
|
94
|
+
handler = BrowserRunHandler(channel, {})
|
|
95
|
+
payload = {
|
|
96
|
+
"event": "browser_run_response",
|
|
97
|
+
"request_id": "request-1",
|
|
98
|
+
"success": True,
|
|
99
|
+
"screenshots": [{"data": "a" * 300_000}],
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
await handler.send_response(payload)
|
|
103
|
+
|
|
104
|
+
sent = [call.args[0] for call in channel.send.await_args_list]
|
|
105
|
+
self.assertGreater(len(sent), 1)
|
|
106
|
+
self.assertTrue(all(item["browser_chunked"] for item in sent))
|
|
107
|
+
self.assertEqual(
|
|
108
|
+
{item["transfer_id"] for item in sent}, {sent[0]["transfer_id"]}
|
|
109
|
+
)
|
|
110
|
+
self.assertEqual(
|
|
111
|
+
"".join(item["chunk_content"] for item in sent),
|
|
112
|
+
json.dumps(payload, separators=(",", ":")),
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
def test_null_nth_is_treated_as_omitted(self):
|
|
116
|
+
self.assertIn("s.nth == null ? l : l.nth(s.nth)", browser_handlers._RUNNER)
|
|
@@ -9,6 +9,7 @@ from portacode.codex_prepare import (
|
|
|
9
9
|
CodexPreparationError,
|
|
10
10
|
_run,
|
|
11
11
|
_install_node_if_needed,
|
|
12
|
+
ensure_codex_home,
|
|
12
13
|
install_codex_dependencies,
|
|
13
14
|
resolve_codex_home,
|
|
14
15
|
write_codex_config,
|
|
@@ -133,3 +134,19 @@ def test_write_codex_config_forces_local_proxy(tmp_path, monkeypatch):
|
|
|
133
134
|
assert "openai_base_url" in text
|
|
134
135
|
assert '[projects."/home/bishoy/souldesign_container"]' in text
|
|
135
136
|
assert 'trust_level = "trusted"' in text
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def test_ensure_codex_home_repairs_runtime_user_directory_ownership(tmp_path, monkeypatch):
|
|
140
|
+
home = tmp_path / ".codex"
|
|
141
|
+
ownership_calls = []
|
|
142
|
+
monkeypatch.setattr("portacode.codex_prepare.resolve_codex_home", lambda: home)
|
|
143
|
+
monkeypatch.setattr("portacode.codex_prepare._persist_codex_home_env", lambda path: None)
|
|
144
|
+
monkeypatch.setattr("portacode.codex_prepare.write_codex_config", lambda path: path / "config.toml")
|
|
145
|
+
monkeypatch.setitem(
|
|
146
|
+
ensure_codex_home.__globals__,
|
|
147
|
+
"_repair_codex_home_ownership",
|
|
148
|
+
lambda codex_home, sessions_dir: ownership_calls.append((codex_home, sessions_dir)),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
assert ensure_codex_home() == home
|
|
152
|
+
assert ownership_calls == [(home, home / "sessions")]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/docs/cloudflared-domain-connect-containers-audit.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{portacode-1.5.29.dev0 → portacode-1.5.31.dev0}/docs/homepage-dashboard-positioning-fixes.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|