portacode 1.5.14.dev1__tar.gz → 1.5.14.dev2__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.14.dev1 → portacode-1.5.14.dev2}/PKG-INFO +1 -1
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/_version.py +2 -2
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/codex_app_server.py +15 -5
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/codex_handlers.py +51 -8
- portacode-1.5.14.dev2/portacode/link_capture/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tests/test_codex_app_server.py +51 -6
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode.egg-info/PKG-INFO +1 -1
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode.egg-info/SOURCES.txt +1 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/.claude/agents/communication-manager.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/.claude/settings.local.json +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/.gitignore +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/.gitmodules +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/LICENSE +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/MANIFEST.in +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/Makefile +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/backup.sh +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/build_android.sh +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/connect.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/connect.sh +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docker-compose.yaml +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/cloudflared-domain-connect-containers-audit.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/creative-team-brief-portacode.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/device-health-alerting-plan.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/devops-messaging-ab-tests.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/homepage-dashboard-positioning-fixes.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/images/device-transfer-button.png +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/images/device-transfer-modal.png +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/images/pair-device-button.png +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/images/pairing-request.png +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/images/student-workspace.png +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/docs/template-guide.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/simple_device/Dockerfile +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/simple_device/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/simple_device/docker-compose.yaml +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/Dockerfile +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/.local/share/portacode/run/gateway.pid +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/.gitignore +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/db.sqlite3 +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/settings.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/wsgi.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/admin.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/apps.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/menu.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/models.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/views.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-01/workspace/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-02/workspace/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-03/workspace/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-04/workspace/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-05/workspace/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-06/workspace/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-07/workspace/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-08/workspace/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-09/workspace/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/data/student-10/workspace/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/docker-compose.yaml +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/galactic_bakeshop/settings.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/galactic_bakeshop/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/manage.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/templates/treats/home.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/treats/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/treats/admin.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/treats/apps.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/treats/menu.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/treats/migrations/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/treats/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/treats/tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/treats/urls.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/initial_content/treats/views.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/examples/workshop_fleet/instructions/WELCOME.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/__main__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/cli.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/codex_loopback_proxy.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/codex_prepare.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/client.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/automation_v2_handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/base.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/chunked_content.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/cloudflare_forwarding.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/cloudflare_tunnel.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/diff_handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/file_handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/file_transfer_handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_aware_file_handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_state/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_state/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_state/file_system_watcher.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_state/git_manager.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_state/handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_state/manager.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_state/models.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_state/test_handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_state/utils.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/project_state_handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/proxmox_infra.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/registry.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/runtime_user.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/session.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/system_handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/tab_factory.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/terminal_handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/test_cloudflare_forwarding.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/test_proxmox_infra.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/test_runtime_user.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/update_handler.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/multiplex.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/terminal.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/test_webmin_proxy_config.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/webmin_proxy_config.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/data.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/exit_codes.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/keypair.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/elinks +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/gio-open +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/gnome-open +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/gvfs-open +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/kde-open +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/kfmclient +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/link_capture_exec.sh +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/link_capture_wrapper.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/links +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/links2 +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/lynx +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/mate-open +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/netsurf +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/sensible-browser +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/w3m +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/x-www-browser +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/link_capture/bin/xdg-open +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/logging_categories.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/pairing.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/restart.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/service.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/static/js/test-ntp-clock.html +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/static/js/utils/ntp-clock.js +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/test_runtime_paths.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/test_service.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/test_terminal_exposed_services.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tests/test_codex_handlers.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tunneling/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tunneling/cloudflared_login.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tunneling/ensure_cloudflared.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tunneling/ensure_pyyaml.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tunneling/forwarding_state.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tunneling/get_domain.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tunneling/privileged.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tunneling/service_install.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/tunneling/state.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/updater.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/utils/NTP_ARCHITECTURE.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/utils/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/utils/diff_apply.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/utils/diff_renderer.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/utils/ntp_clock.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/utils/runtime_paths.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode.egg-info/dependency_links.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode.egg-info/entry_points.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode.egg-info/requires.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode.egg-info/top_level.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/.gitignore +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/persistent_workspace/Dockerfile +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/persistent_workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/persistent_workspace/entrypoint.sh +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/persistent_workspace/manage_classroom.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/temporary_workspace/Dockerfile +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/temporary_workspace/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/temporary_workspace/docker-compose.yaml +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/temporary_workspace/docs/device_transfere.png +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/temporary_workspace/docs/pairing_approval.png +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode_for_school/temporary_workspace/entrypoint.sh +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/pyproject.toml +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/restore.sh +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/run_tests.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/scripts/diagnose_codex_gateway.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/setup.cfg +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/setup.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test.sh +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/test_device_online.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/test_file_operations.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/test_git_status_ui.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/test_login_flow.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/test_navigate_testing_folder.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/test_play_store_screenshots.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/test_terminal_buffer_performance.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/test_terminal_interaction.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/test_terminal_loading_race_condition.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_modules/test_terminal_start.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_request_id.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/test_session_terminal_shutdown.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/.env.example +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/README.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/cli.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/core/__init__.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/core/base_test.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/core/cli_manager.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/core/hierarchical_runner.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/core/playwright_manager.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/core/runner.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/core/shared_cli_manager.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/core/test_discovery.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/testing_framework/requirements.txt +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/UI_UX/opening_a_file_on_desktop_results_in_nothing.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/UI_UX/server_occasionally_stops_communicating_with_all_devices.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/agent_context_management.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/django_server_time_sync.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/issues/device_performance_degradation.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/issues/git_data_not_captured_in_proxmox.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/issues/indefinite_resource_loading.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/issues/portacode_service_silently_down.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/issues/premature_terminal_exit.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/issues/project_cpu_hotspots.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/issues/terminals_exit_upon_starting.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/issues/websocket_client_silently_dead.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/issues/wrong_item_classification_on_client_side.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/todo/smartphone_terminal_input_frustrations.md +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/tools/generate_play_store_assets.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/tools/pairing_tester.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/tools/run_screenshot_suite.sh +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/tools/test_python_ntp_clock.py +0 -0
- {portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/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.14.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 5, 14, '
|
|
21
|
+
__version__ = version = '1.5.14.dev2'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 5, 14, 'dev2')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -126,8 +126,12 @@ class CodexAppServer:
|
|
|
126
126
|
# JSON-RPC I/O
|
|
127
127
|
# ------------------------------------------------------------------
|
|
128
128
|
async def _initialize(self) -> None:
|
|
129
|
-
"""Send the initialize handshake and wait for its response.
|
|
130
|
-
|
|
129
|
+
"""Send the initialize handshake and wait for its response.
|
|
130
|
+
|
|
131
|
+
Uses `_request_on_running_proc` so we do not re-enter `start()` while
|
|
132
|
+
`start()` already holds `_lock` (asyncio.Lock is not reentrant).
|
|
133
|
+
"""
|
|
134
|
+
response = await self._request_on_running_proc(
|
|
131
135
|
"initialize",
|
|
132
136
|
{
|
|
133
137
|
"clientInfo": self.client_info,
|
|
@@ -143,12 +147,18 @@ class CodexAppServer:
|
|
|
143
147
|
) -> Dict[str, Any]:
|
|
144
148
|
"""Send a JSON-RPC request and return the response object."""
|
|
145
149
|
await self.start()
|
|
150
|
+
return await self._request_on_running_proc(method, params, timeout=timeout)
|
|
151
|
+
|
|
152
|
+
async def _request_on_running_proc(
|
|
153
|
+
self, method: str, params: Dict[str, Any], timeout: float = 60.0
|
|
154
|
+
) -> Dict[str, Any]:
|
|
155
|
+
"""Write a JSON-RPC request to an already-spawned app-server process."""
|
|
146
156
|
assert self._proc is not None and self._proc.stdin is not None
|
|
147
157
|
|
|
148
158
|
request_id = self._next_id
|
|
149
159
|
self._next_id += 1
|
|
150
160
|
message = {"jsonrpc": "2.0", "id": request_id, "method": method, "params": params}
|
|
151
|
-
payload = json.dumps(message, ensure_ascii=False)
|
|
161
|
+
payload = json.dumps(message, ensure_ascii=False, separators=(",", ":"))
|
|
152
162
|
|
|
153
163
|
loop = asyncio.get_running_loop()
|
|
154
164
|
future: asyncio.Future = loop.create_future()
|
|
@@ -172,7 +182,7 @@ class CodexAppServer:
|
|
|
172
182
|
await self.start()
|
|
173
183
|
assert self._proc is not None and self._proc.stdin is not None
|
|
174
184
|
message = {"jsonrpc": "2.0", "method": method, "params": params}
|
|
175
|
-
payload = json.dumps(message, ensure_ascii=False)
|
|
185
|
+
payload = json.dumps(message, ensure_ascii=False, separators=(",", ":"))
|
|
176
186
|
self._proc.stdin.write((payload + "\n").encode("utf-8"))
|
|
177
187
|
await self._proc.stdin.drain()
|
|
178
188
|
|
|
@@ -180,7 +190,7 @@ class CodexAppServer:
|
|
|
180
190
|
"""Reply to a server->client request with a JSON-RPC error."""
|
|
181
191
|
assert self._proc is not None and self._proc.stdin is not None
|
|
182
192
|
response = {"jsonrpc": "2.0", "id": request_id, "error": {"code": code, "message": message}}
|
|
183
|
-
payload = json.dumps(response, ensure_ascii=False)
|
|
193
|
+
payload = json.dumps(response, ensure_ascii=False, separators=(",", ":"))
|
|
184
194
|
self._proc.stdin.write((payload + "\n").encode("utf-8"))
|
|
185
195
|
await self._proc.stdin.drain()
|
|
186
196
|
|
{portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/portacode/connection/handlers/codex_handlers.py
RENAMED
|
@@ -86,20 +86,57 @@ def _project_id(message: Dict[str, Any]) -> Optional[str]:
|
|
|
86
86
|
return message.get("project_id")
|
|
87
87
|
|
|
88
88
|
|
|
89
|
-
class
|
|
89
|
+
class CodexAsyncHandler(AsyncHandler):
|
|
90
|
+
"""AsyncHandler that replies to `source_client_session` per WEBSOCKET_PROTOCOL.md."""
|
|
91
|
+
|
|
92
|
+
async def handle(self, message: Dict[str, Any], reply_channel: Optional[str] = None) -> None:
|
|
93
|
+
try:
|
|
94
|
+
response = await self.execute(message)
|
|
95
|
+
if response is None:
|
|
96
|
+
return
|
|
97
|
+
if "request_id" in message and "request_id" not in response:
|
|
98
|
+
response["request_id"] = message["request_id"]
|
|
99
|
+
|
|
100
|
+
source_client_session = message.get("source_client_session")
|
|
101
|
+
project_id = response.get("project_id") or _project_id(message)
|
|
102
|
+
if project_id and "project_id" not in response:
|
|
103
|
+
response["project_id"] = project_id
|
|
104
|
+
|
|
105
|
+
if source_client_session:
|
|
106
|
+
payload = dict(response)
|
|
107
|
+
payload["client_sessions"] = [source_client_session]
|
|
108
|
+
await self.control_channel.send(payload)
|
|
109
|
+
return
|
|
110
|
+
|
|
111
|
+
await self.send_response(response, reply_channel, project_id)
|
|
112
|
+
except Exception as exc:
|
|
113
|
+
LOGGER.exception("handler: Error in codex handler %s: %s", self.command_name, exc)
|
|
114
|
+
await self.send_error(
|
|
115
|
+
str(exc),
|
|
116
|
+
reply_channel,
|
|
117
|
+
_project_id(message),
|
|
118
|
+
request_id=message.get("request_id"),
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class CodexStatusHandler(CodexAsyncHandler):
|
|
90
123
|
"""Report whether Codex is installed and the app-server is healthy."""
|
|
91
124
|
|
|
125
|
+
@property
|
|
92
126
|
def command_name(self) -> str:
|
|
93
127
|
return "codex_status"
|
|
94
128
|
|
|
95
129
|
async def execute(self, message: Dict[str, Any]) -> Dict[str, Any]:
|
|
96
130
|
installed = bool(CodexAppServer.get_binary_path())
|
|
97
|
-
|
|
131
|
+
# Avoid blocking the asyncio loop with a sync subprocess during status.
|
|
132
|
+
version = None
|
|
98
133
|
ready = False
|
|
99
134
|
error_message: Optional[str] = None
|
|
100
135
|
|
|
101
136
|
if installed:
|
|
102
137
|
try:
|
|
138
|
+
loop = asyncio.get_running_loop()
|
|
139
|
+
version = await loop.run_in_executor(None, CodexAppServer.version)
|
|
103
140
|
manager = _get_manager(self)
|
|
104
141
|
await manager.ensure_started()
|
|
105
142
|
ready = await manager.bridge.healthy()
|
|
@@ -121,9 +158,10 @@ class CodexStatusHandler(AsyncHandler):
|
|
|
121
158
|
return payload
|
|
122
159
|
|
|
123
160
|
|
|
124
|
-
class CodexThreadListHandler(
|
|
161
|
+
class CodexThreadListHandler(CodexAsyncHandler):
|
|
125
162
|
"""List Codex threads for a given project cwd."""
|
|
126
163
|
|
|
164
|
+
@property
|
|
127
165
|
def command_name(self) -> str:
|
|
128
166
|
return "codex_thread_list"
|
|
129
167
|
|
|
@@ -155,9 +193,10 @@ class CodexThreadListHandler(AsyncHandler):
|
|
|
155
193
|
return payload
|
|
156
194
|
|
|
157
195
|
|
|
158
|
-
class CodexThreadStartHandler(
|
|
196
|
+
class CodexThreadStartHandler(CodexAsyncHandler):
|
|
159
197
|
"""Start a new Codex thread in the project directory."""
|
|
160
198
|
|
|
199
|
+
@property
|
|
161
200
|
def command_name(self) -> str:
|
|
162
201
|
return "codex_thread_start"
|
|
163
202
|
|
|
@@ -194,9 +233,10 @@ class CodexThreadStartHandler(AsyncHandler):
|
|
|
194
233
|
return payload
|
|
195
234
|
|
|
196
235
|
|
|
197
|
-
class CodexThreadResumeHandler(
|
|
236
|
+
class CodexThreadResumeHandler(CodexAsyncHandler):
|
|
198
237
|
"""Resume a Codex thread and return its history."""
|
|
199
238
|
|
|
239
|
+
@property
|
|
200
240
|
def command_name(self) -> str:
|
|
201
241
|
return "codex_thread_resume"
|
|
202
242
|
|
|
@@ -231,9 +271,10 @@ class CodexThreadResumeHandler(AsyncHandler):
|
|
|
231
271
|
return payload
|
|
232
272
|
|
|
233
273
|
|
|
234
|
-
class CodexTurnStartHandler(
|
|
274
|
+
class CodexTurnStartHandler(CodexAsyncHandler):
|
|
235
275
|
"""Send a user turn to a Codex thread."""
|
|
236
276
|
|
|
277
|
+
@property
|
|
237
278
|
def command_name(self) -> str:
|
|
238
279
|
return "codex_turn_start"
|
|
239
280
|
|
|
@@ -271,9 +312,10 @@ class CodexTurnStartHandler(AsyncHandler):
|
|
|
271
312
|
return payload
|
|
272
313
|
|
|
273
314
|
|
|
274
|
-
class CodexTurnInterruptHandler(
|
|
315
|
+
class CodexTurnInterruptHandler(CodexAsyncHandler):
|
|
275
316
|
"""Interrupt a running Codex turn."""
|
|
276
317
|
|
|
318
|
+
@property
|
|
277
319
|
def command_name(self) -> str:
|
|
278
320
|
return "codex_turn_interrupt"
|
|
279
321
|
|
|
@@ -294,7 +336,7 @@ class CodexTurnInterruptHandler(AsyncHandler):
|
|
|
294
336
|
return payload
|
|
295
337
|
|
|
296
338
|
|
|
297
|
-
class CodexPrepareHandler(
|
|
339
|
+
class CodexPrepareHandler(CodexAsyncHandler):
|
|
298
340
|
"""Run `portacode prepare codex` on the device in the background.
|
|
299
341
|
|
|
300
342
|
Streams progress as `codex_prepare_progress` events and finishes with a
|
|
@@ -302,6 +344,7 @@ class CodexPrepareHandler(AsyncHandler):
|
|
|
302
344
|
show manual instructions when sudo is required).
|
|
303
345
|
"""
|
|
304
346
|
|
|
347
|
+
@property
|
|
305
348
|
def command_name(self) -> str:
|
|
306
349
|
return "codex_prepare"
|
|
307
350
|
|
|
@@ -11,11 +11,14 @@ from portacode.connection.codex_app_server import CodexAppServer, CodexAppServer
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class FakeWriteStream:
|
|
14
|
-
def __init__(self) -> None:
|
|
14
|
+
def __init__(self, process: "FakeProcess | None" = None) -> None:
|
|
15
15
|
self.written: list[bytes] = []
|
|
16
|
+
self._process = process
|
|
16
17
|
|
|
17
18
|
def write(self, data: bytes) -> None:
|
|
18
19
|
self.written.append(data)
|
|
20
|
+
if self._process is not None:
|
|
21
|
+
self._process._maybe_auto_respond(data)
|
|
19
22
|
|
|
20
23
|
async def drain(self) -> None:
|
|
21
24
|
pass
|
|
@@ -41,13 +44,38 @@ class FakeReadStream:
|
|
|
41
44
|
class FakeProcess:
|
|
42
45
|
returncode: int | None = None
|
|
43
46
|
|
|
44
|
-
def __init__(
|
|
47
|
+
def __init__(
|
|
48
|
+
self,
|
|
49
|
+
responses: list[dict] | None = None,
|
|
50
|
+
*,
|
|
51
|
+
auto_initialize: bool = False,
|
|
52
|
+
) -> None:
|
|
45
53
|
self.queue: asyncio.Queue[bytes] = asyncio.Queue()
|
|
46
54
|
for response in responses or []:
|
|
47
|
-
self.queue.put_nowait(
|
|
48
|
-
|
|
55
|
+
self.queue.put_nowait(
|
|
56
|
+
(json.dumps(response, separators=(",", ":")) + "\n").encode("utf-8")
|
|
57
|
+
)
|
|
58
|
+
self.stdin = FakeWriteStream(self if auto_initialize else None)
|
|
49
59
|
self.stdout = FakeReadStream(self.queue)
|
|
50
60
|
self.stderr = FakeReadStream(asyncio.Queue())
|
|
61
|
+
self._auto_initialize = auto_initialize
|
|
62
|
+
|
|
63
|
+
def _maybe_auto_respond(self, data: bytes) -> None:
|
|
64
|
+
if not self._auto_initialize:
|
|
65
|
+
return
|
|
66
|
+
try:
|
|
67
|
+
message = json.loads(data.decode("utf-8").strip())
|
|
68
|
+
except Exception:
|
|
69
|
+
return
|
|
70
|
+
if message.get("method") != "initialize":
|
|
71
|
+
return
|
|
72
|
+
request_id = message.get("id")
|
|
73
|
+
if request_id is None:
|
|
74
|
+
return
|
|
75
|
+
self.queue.put_nowait((json.dumps(
|
|
76
|
+
{"jsonrpc": "2.0", "id": request_id, "result": {"protocolVersion": "v2"}},
|
|
77
|
+
separators=(",", ":"),
|
|
78
|
+
) + "\n").encode("utf-8"))
|
|
51
79
|
|
|
52
80
|
async def wait(self) -> int:
|
|
53
81
|
return self.returncode or 0
|
|
@@ -85,12 +113,28 @@ async def test_initialize_handshake():
|
|
|
85
113
|
|
|
86
114
|
@pytest.mark.asyncio
|
|
87
115
|
async def test_request_response_correlation():
|
|
116
|
+
# Only preload the initialize response. Queuing the call response early can
|
|
117
|
+
# race the reader ahead of the pending-future registration.
|
|
88
118
|
proc = FakeProcess([
|
|
89
119
|
{"jsonrpc": "2.0", "id": 1, "result": {"protocolVersion": "v2"}},
|
|
90
|
-
{"jsonrpc": "2.0", "id": 2, "result": {"id": "th-abc", "name": "test"}},
|
|
91
120
|
])
|
|
92
121
|
bridge = CodexAppServer(_process_factory=_factory_for(proc))
|
|
122
|
+
await bridge.start()
|
|
123
|
+
|
|
124
|
+
async def _respond_to_thread_start() -> None:
|
|
125
|
+
# Wait until the request is written, then enqueue the matching response.
|
|
126
|
+
for _ in range(50):
|
|
127
|
+
if any(b'"method":"thread/start"' in chunk for chunk in proc.stdin.written):
|
|
128
|
+
break
|
|
129
|
+
await asyncio.sleep(0.01)
|
|
130
|
+
proc.queue.put_nowait((json.dumps(
|
|
131
|
+
{"jsonrpc": "2.0", "id": 2, "result": {"id": "th-abc", "name": "test"}},
|
|
132
|
+
separators=(",", ":"),
|
|
133
|
+
) + "\n").encode("utf-8"))
|
|
134
|
+
|
|
135
|
+
respond_task = asyncio.create_task(_respond_to_thread_start())
|
|
93
136
|
result = await bridge.call("thread/start", {"cwd": "/tmp/proj"})
|
|
137
|
+
await respond_task
|
|
94
138
|
|
|
95
139
|
assert result["id"] == "th-abc"
|
|
96
140
|
assert any(b'"method":"thread/start"' in chunk and b'/tmp/proj' in chunk for chunk in proc.stdin.written)
|
|
@@ -148,7 +192,8 @@ async def test_missing_binary_raises():
|
|
|
148
192
|
@pytest.mark.asyncio
|
|
149
193
|
async def test_restart_after_crash():
|
|
150
194
|
first = FakeProcess([{"jsonrpc": "2.0", "id": 1, "result": {"protocolVersion": "v2"}}])
|
|
151
|
-
|
|
195
|
+
# Auto-echo initialize with whatever request id the restarted bridge uses.
|
|
196
|
+
second = FakeProcess(auto_initialize=True)
|
|
152
197
|
|
|
153
198
|
bridge = CodexAppServer(_process_factory=_factory_for(first, second))
|
|
154
199
|
await bridge.start()
|
|
@@ -340,6 +340,7 @@ portacode/connection/handlers/project_state/models.py
|
|
|
340
340
|
portacode/connection/handlers/project_state/test_handlers.py
|
|
341
341
|
portacode/connection/handlers/project_state/utils.py
|
|
342
342
|
portacode/link_capture/__init__.py
|
|
343
|
+
portacode/link_capture/__pycache__/__init__.cpython-311.pyc
|
|
343
344
|
portacode/link_capture/bin/elinks
|
|
344
345
|
portacode/link_capture/bin/gio-open
|
|
345
346
|
portacode/link_capture/bin/gnome-open
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.14.dev1 → portacode-1.5.14.dev2}/docs/cloudflared-domain-connect-containers-audit.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{portacode-1.5.14.dev1 → portacode-1.5.14.dev2}/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
|