portacode 1.4.12.dev9__tar.gz → 1.4.13.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/PKG-INFO +1 -1
  2. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/_version.py +2 -2
  3. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +2 -0
  4. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/base.py +45 -15
  5. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/proxmox_infra.py +110 -9
  6. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/PKG-INFO +1 -1
  7. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/.claude/agents/communication-manager.md +0 -0
  8. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/.claude/settings.local.json +0 -0
  9. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/.gitignore +0 -0
  10. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/.gitmodules +0 -0
  11. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/LICENSE +0 -0
  12. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/MANIFEST.in +0 -0
  13. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/Makefile +0 -0
  14. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/README.md +0 -0
  15. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/backup.sh +0 -0
  16. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/connect.py +0 -0
  17. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/connect.sh +0 -0
  18. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docker-compose.yaml +0 -0
  19. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docs/images/device-transfer-button.png +0 -0
  20. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docs/images/device-transfer-modal.png +0 -0
  21. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docs/images/pair-device-button.png +0 -0
  22. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docs/images/pairing-request.png +0 -0
  23. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/docs/images/student-workspace.png +0 -0
  24. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/README.md +0 -0
  25. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/simple_device/Dockerfile +0 -0
  26. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/simple_device/README.md +0 -0
  27. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode +0 -0
  28. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode.pub +0 -0
  29. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/simple_device/docker-compose.yaml +0 -0
  30. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/Dockerfile +0 -0
  31. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/README.md +0 -0
  32. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode +0 -0
  33. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode.pub +0 -0
  34. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/.local/share/portacode/run/gateway.pid +0 -0
  35. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/.gitignore +0 -0
  36. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/README.md +0 -0
  37. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/db.sqlite3 +0 -0
  38. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__init__.py +0 -0
  39. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/__init__.cpython-311.pyc +0 -0
  40. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/settings.cpython-311.pyc +0 -0
  41. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/urls.cpython-311.pyc +0 -0
  42. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/wsgi.cpython-311.pyc +0 -0
  43. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/asgi.py +0 -0
  44. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/settings.py +0 -0
  45. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/urls.py +0 -0
  46. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/wsgi.py +0 -0
  47. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/manage.py +0 -0
  48. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/requirements.txt +0 -0
  49. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/templates/treats/home.html +0 -0
  50. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__init__.py +0 -0
  51. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/__init__.cpython-311.pyc +0 -0
  52. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/admin.cpython-311.pyc +0 -0
  53. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/apps.cpython-311.pyc +0 -0
  54. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/menu.cpython-311.pyc +0 -0
  55. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/models.cpython-311.pyc +0 -0
  56. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/urls.cpython-311.pyc +0 -0
  57. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/views.cpython-311.pyc +0 -0
  58. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/admin.py +0 -0
  59. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/apps.py +0 -0
  60. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/menu.py +0 -0
  61. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__init__.py +0 -0
  62. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
  63. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/models.py +0 -0
  64. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/tests.py +0 -0
  65. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/urls.py +0 -0
  66. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-01/workspace/treats/views.py +0 -0
  67. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode +0 -0
  68. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode.pub +0 -0
  69. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/README.md +0 -0
  70. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/__init__.py +0 -0
  71. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/asgi.py +0 -0
  72. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/settings.py +0 -0
  73. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/urls.py +0 -0
  74. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/wsgi.py +0 -0
  75. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/manage.py +0 -0
  76. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/requirements.txt +0 -0
  77. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/templates/treats/home.html +0 -0
  78. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/__init__.py +0 -0
  79. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/admin.py +0 -0
  80. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/apps.py +0 -0
  81. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/menu.py +0 -0
  82. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/migrations/__init__.py +0 -0
  83. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/models.py +0 -0
  84. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/tests.py +0 -0
  85. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/urls.py +0 -0
  86. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-02/workspace/treats/views.py +0 -0
  87. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode +0 -0
  88. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode.pub +0 -0
  89. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/README.md +0 -0
  90. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/__init__.py +0 -0
  91. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/asgi.py +0 -0
  92. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/settings.py +0 -0
  93. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/urls.py +0 -0
  94. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/wsgi.py +0 -0
  95. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/manage.py +0 -0
  96. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/requirements.txt +0 -0
  97. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/templates/treats/home.html +0 -0
  98. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/__init__.py +0 -0
  99. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/admin.py +0 -0
  100. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/apps.py +0 -0
  101. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/menu.py +0 -0
  102. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/migrations/__init__.py +0 -0
  103. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/models.py +0 -0
  104. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/tests.py +0 -0
  105. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/urls.py +0 -0
  106. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-03/workspace/treats/views.py +0 -0
  107. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode +0 -0
  108. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode.pub +0 -0
  109. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/README.md +0 -0
  110. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/__init__.py +0 -0
  111. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/asgi.py +0 -0
  112. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/settings.py +0 -0
  113. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/urls.py +0 -0
  114. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/wsgi.py +0 -0
  115. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/manage.py +0 -0
  116. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/requirements.txt +0 -0
  117. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/templates/treats/home.html +0 -0
  118. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/__init__.py +0 -0
  119. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/admin.py +0 -0
  120. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/apps.py +0 -0
  121. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/menu.py +0 -0
  122. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/migrations/__init__.py +0 -0
  123. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/models.py +0 -0
  124. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/tests.py +0 -0
  125. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/urls.py +0 -0
  126. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-04/workspace/treats/views.py +0 -0
  127. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode +0 -0
  128. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode.pub +0 -0
  129. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/README.md +0 -0
  130. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/__init__.py +0 -0
  131. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/asgi.py +0 -0
  132. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/settings.py +0 -0
  133. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/urls.py +0 -0
  134. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/wsgi.py +0 -0
  135. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/manage.py +0 -0
  136. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/requirements.txt +0 -0
  137. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/templates/treats/home.html +0 -0
  138. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/__init__.py +0 -0
  139. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/admin.py +0 -0
  140. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/apps.py +0 -0
  141. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/menu.py +0 -0
  142. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/migrations/__init__.py +0 -0
  143. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/models.py +0 -0
  144. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/tests.py +0 -0
  145. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/urls.py +0 -0
  146. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-05/workspace/treats/views.py +0 -0
  147. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode +0 -0
  148. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode.pub +0 -0
  149. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/README.md +0 -0
  150. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/__init__.py +0 -0
  151. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/asgi.py +0 -0
  152. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/settings.py +0 -0
  153. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/urls.py +0 -0
  154. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/wsgi.py +0 -0
  155. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/manage.py +0 -0
  156. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/requirements.txt +0 -0
  157. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/templates/treats/home.html +0 -0
  158. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/__init__.py +0 -0
  159. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/admin.py +0 -0
  160. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/apps.py +0 -0
  161. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/menu.py +0 -0
  162. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/migrations/__init__.py +0 -0
  163. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/models.py +0 -0
  164. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/tests.py +0 -0
  165. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/urls.py +0 -0
  166. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-06/workspace/treats/views.py +0 -0
  167. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode +0 -0
  168. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode.pub +0 -0
  169. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/README.md +0 -0
  170. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/__init__.py +0 -0
  171. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/asgi.py +0 -0
  172. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/settings.py +0 -0
  173. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/urls.py +0 -0
  174. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/wsgi.py +0 -0
  175. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/manage.py +0 -0
  176. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/requirements.txt +0 -0
  177. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/templates/treats/home.html +0 -0
  178. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/__init__.py +0 -0
  179. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/admin.py +0 -0
  180. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/apps.py +0 -0
  181. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/menu.py +0 -0
  182. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/migrations/__init__.py +0 -0
  183. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/models.py +0 -0
  184. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/tests.py +0 -0
  185. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/urls.py +0 -0
  186. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-07/workspace/treats/views.py +0 -0
  187. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode +0 -0
  188. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode.pub +0 -0
  189. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/README.md +0 -0
  190. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/__init__.py +0 -0
  191. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/asgi.py +0 -0
  192. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/settings.py +0 -0
  193. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/urls.py +0 -0
  194. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/wsgi.py +0 -0
  195. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/manage.py +0 -0
  196. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/requirements.txt +0 -0
  197. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/templates/treats/home.html +0 -0
  198. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/__init__.py +0 -0
  199. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/admin.py +0 -0
  200. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/apps.py +0 -0
  201. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/menu.py +0 -0
  202. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/migrations/__init__.py +0 -0
  203. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/models.py +0 -0
  204. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/tests.py +0 -0
  205. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/urls.py +0 -0
  206. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-08/workspace/treats/views.py +0 -0
  207. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode +0 -0
  208. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode.pub +0 -0
  209. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/README.md +0 -0
  210. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/__init__.py +0 -0
  211. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/asgi.py +0 -0
  212. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/settings.py +0 -0
  213. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/urls.py +0 -0
  214. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/wsgi.py +0 -0
  215. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/manage.py +0 -0
  216. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/requirements.txt +0 -0
  217. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/templates/treats/home.html +0 -0
  218. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/__init__.py +0 -0
  219. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/admin.py +0 -0
  220. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/apps.py +0 -0
  221. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/menu.py +0 -0
  222. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/migrations/__init__.py +0 -0
  223. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/models.py +0 -0
  224. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/tests.py +0 -0
  225. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/urls.py +0 -0
  226. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-09/workspace/treats/views.py +0 -0
  227. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode +0 -0
  228. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode.pub +0 -0
  229. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/README.md +0 -0
  230. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/__init__.py +0 -0
  231. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/asgi.py +0 -0
  232. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/settings.py +0 -0
  233. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/urls.py +0 -0
  234. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/wsgi.py +0 -0
  235. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/manage.py +0 -0
  236. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/requirements.txt +0 -0
  237. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/templates/treats/home.html +0 -0
  238. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/__init__.py +0 -0
  239. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/admin.py +0 -0
  240. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/apps.py +0 -0
  241. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/menu.py +0 -0
  242. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/migrations/__init__.py +0 -0
  243. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/models.py +0 -0
  244. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/tests.py +0 -0
  245. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/urls.py +0 -0
  246. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/data/student-10/workspace/treats/views.py +0 -0
  247. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/docker-compose.yaml +0 -0
  248. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/README.md +0 -0
  249. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/__init__.py +0 -0
  250. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/asgi.py +0 -0
  251. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/settings.py +0 -0
  252. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/urls.py +0 -0
  253. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/galactic_bakeshop/wsgi.py +0 -0
  254. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/manage.py +0 -0
  255. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/requirements.txt +0 -0
  256. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/templates/treats/home.html +0 -0
  257. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/__init__.py +0 -0
  258. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/admin.py +0 -0
  259. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/apps.py +0 -0
  260. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/menu.py +0 -0
  261. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/migrations/__init__.py +0 -0
  262. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/models.py +0 -0
  263. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/tests.py +0 -0
  264. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/urls.py +0 -0
  265. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/initial_content/treats/views.py +0 -0
  266. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/examples/workshop_fleet/instructions/WELCOME.md +0 -0
  267. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/README.md +0 -0
  268. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/__init__.py +0 -0
  269. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/__main__.py +0 -0
  270. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/cli.py +0 -0
  271. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/README.md +0 -0
  272. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/__init__.py +0 -0
  273. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/client.py +0 -0
  274. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/README.md +0 -0
  275. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/__init__.py +0 -0
  276. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/chunked_content.py +0 -0
  277. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/diff_handlers.py +0 -0
  278. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/file_handlers.py +0 -0
  279. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_aware_file_handlers.py +0 -0
  280. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/README.md +0 -0
  281. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/__init__.py +0 -0
  282. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/file_system_watcher.py +0 -0
  283. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/git_manager.py +0 -0
  284. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/handlers.py +0 -0
  285. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/manager.py +0 -0
  286. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/models.py +0 -0
  287. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state/utils.py +0 -0
  288. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/project_state_handlers.py +0 -0
  289. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/registry.py +0 -0
  290. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/session.py +0 -0
  291. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/system_handlers.py +0 -0
  292. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/tab_factory.py +0 -0
  293. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/terminal_handlers.py +0 -0
  294. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/handlers/update_handler.py +0 -0
  295. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/multiplex.py +0 -0
  296. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/connection/terminal.py +0 -0
  297. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/data.py +0 -0
  298. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/keypair.py +0 -0
  299. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/__init__.py +0 -0
  300. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/__pycache__/__init__.cpython-311.pyc +0 -0
  301. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-311.pyc +0 -0
  302. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/elinks +0 -0
  303. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/gio-open +0 -0
  304. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/gnome-open +0 -0
  305. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/gvfs-open +0 -0
  306. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/kde-open +0 -0
  307. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/kfmclient +0 -0
  308. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/link_capture_exec.sh +0 -0
  309. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/link_capture_wrapper.py +0 -0
  310. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/links +0 -0
  311. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/links2 +0 -0
  312. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/lynx +0 -0
  313. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/mate-open +0 -0
  314. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/netsurf +0 -0
  315. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/sensible-browser +0 -0
  316. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/w3m +0 -0
  317. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/x-www-browser +0 -0
  318. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/link_capture/bin/xdg-open +0 -0
  319. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/logging_categories.py +0 -0
  320. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/pairing.py +0 -0
  321. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/service.py +0 -0
  322. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/static/js/test-ntp-clock.html +0 -0
  323. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/static/js/utils/ntp-clock.js +0 -0
  324. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/utils/NTP_ARCHITECTURE.md +0 -0
  325. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/utils/__init__.py +0 -0
  326. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/utils/diff_apply.py +0 -0
  327. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/utils/diff_renderer.py +0 -0
  328. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode/utils/ntp_clock.py +0 -0
  329. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/SOURCES.txt +0 -0
  330. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/dependency_links.txt +0 -0
  331. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/entry_points.txt +0 -0
  332. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/requires.txt +0 -0
  333. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/portacode.egg-info/top_level.txt +0 -0
  334. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/pyproject.toml +0 -0
  335. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/restore.sh +0 -0
  336. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/run_tests.py +0 -0
  337. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/setup.cfg +0 -0
  338. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/setup.py +0 -0
  339. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test.sh +0 -0
  340. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/README.md +0 -0
  341. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/__init__.py +0 -0
  342. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_device_online.py +0 -0
  343. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_file_operations.py +0 -0
  344. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_git_status_ui.py +0 -0
  345. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_login_flow.py +0 -0
  346. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_navigate_testing_folder.py +0 -0
  347. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_play_store_screenshots.py +0 -0
  348. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_terminal_buffer_performance.py +0 -0
  349. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_terminal_interaction.py +0 -0
  350. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_terminal_loading_race_condition.py +0 -0
  351. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_modules/test_terminal_start.py +0 -0
  352. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/test_request_id.py +0 -0
  353. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/.env.example +0 -0
  354. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/README.md +0 -0
  355. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/__init__.py +0 -0
  356. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/cli.py +0 -0
  357. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/__init__.py +0 -0
  358. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/base_test.py +0 -0
  359. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/cli_manager.py +0 -0
  360. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/hierarchical_runner.py +0 -0
  361. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/playwright_manager.py +0 -0
  362. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/runner.py +0 -0
  363. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/shared_cli_manager.py +0 -0
  364. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/core/test_discovery.py +0 -0
  365. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/testing_framework/requirements.txt +0 -0
  366. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/UI_UX/opening_a_file_on_desktop_results_in_nothing.md +0 -0
  367. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/agent_context_management.md +0 -0
  368. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/django_server_time_sync.md +0 -0
  369. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/device_performance_degradation.md +0 -0
  370. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/git_data_not_captured_in_proxmox.md +0 -0
  371. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/indefinite_resource_loading.md +0 -0
  372. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/portacode_service_silently_down.md +0 -0
  373. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/premature_terminal_exit.md +0 -0
  374. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/project_cpu_hotspots.md +0 -0
  375. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/terminals_exit_upon_starting.md +0 -0
  376. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/issues/wrong_item_classification_on_client_side.md +0 -0
  377. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/todo/smartphone_terminal_input_frustrations.md +0 -0
  378. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/tools/generate_play_store_assets.py +0 -0
  379. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/tools/pairing_tester.py +0 -0
  380. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/tools/run_screenshot_suite.sh +0 -0
  381. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/tools/test_python_ntp_clock.py +0 -0
  382. {portacode-1.4.12.dev9 → portacode-1.4.13.dev1}/validate.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.4.12.dev9
3
+ Version: 1.4.13.dev1
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.4.12.dev9'
32
- __version_tuple__ = version_tuple = (1, 4, 12, 'dev9')
31
+ __version__ = version = '1.4.13.dev1'
32
+ __version_tuple__ = version_tuple = (1, 4, 13, 'dev1')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -27,6 +27,8 @@ The Portacode server acts as a **routing middleman** between client sessions and
27
27
 
28
28
  - **`source_client_session`** (Server → Device): Server **adds this** when forwarding client commands to devices (so device knows which client sent the command and can target responses back). Clients never include this field.
29
29
 
30
+ Device handlers that want to respond only to the session that issued a given command can rely on the helper defined in `portacode/connection/handlers/base.py` (`BaseHandler.send_response_to_source_session`). It wraps the boilerplate of reusing `request_id`/`trace`, injecting `client_sessions=[source_client_session]`, and sending via the control channel so the handler does not need to manually reconstruct routing metadata for each reply.
31
+
30
32
  This document describes the complete protocol for communicating with devices through the server, guiding app developers on how to get their client sessions to communicate with devices.
31
33
 
32
34
  ## Table of Contents
@@ -88,6 +88,42 @@ class BaseHandler(ABC):
88
88
  if reply_channel:
89
89
  payload["reply_channel"] = reply_channel
90
90
  await self.control_channel.send(payload)
91
+
92
+ async def send_response_to_source_session(
93
+ self,
94
+ message: Dict[str, Any],
95
+ payload: Dict[str, Any],
96
+ reply_channel: Optional[str] = None,
97
+ ) -> None:
98
+ """Send a response directly to the client session that issued ``message``.
99
+
100
+ This bypasses ``ClientSessionManager`` routing and ensures only the session
101
+ whose ``source_client_session`` was injected by the server will receive the
102
+ response. The helper also copies ``request_id``/``trace`` timing data so tracing
103
+ and logging remain consistent.
104
+ """
105
+ response = dict(payload)
106
+ request_id = message.get("request_id")
107
+ if request_id and "request_id" not in response:
108
+ response["request_id"] = request_id
109
+
110
+ if "trace" in message and "request_id" in message and "trace" not in response:
111
+ trace_data = dict(message["trace"])
112
+ handler_complete_time = ntp_clock.now_ms()
113
+ if handler_complete_time is not None:
114
+ trace_data["handler_complete"] = handler_complete_time
115
+ if "client_send" in trace_data:
116
+ trace_data["ping"] = handler_complete_time - trace_data["client_send"]
117
+ response["trace"] = trace_data
118
+
119
+ source_client_session = message.get("source_client_session")
120
+ if source_client_session:
121
+ response["client_sessions"] = [source_client_session]
122
+
123
+ if reply_channel:
124
+ response["reply_channel"] = reply_channel
125
+
126
+ await self.control_channel.send(response)
91
127
 
92
128
  async def send_error(self, message: str, reply_channel: Optional[str] = None, project_id: str = None) -> None:
93
129
  """Send an error response with client session awareness.
@@ -141,22 +177,16 @@ class AsyncHandler(BaseHandler):
141
177
  if "request_id" in message and "request_id" not in response:
142
178
  response["request_id"] = message["request_id"]
143
179
 
144
- # Pass through trace from request to response (add to existing trace, don't create new one)
145
- if "trace" in message and "request_id" in message:
146
- response["trace"] = dict(message["trace"])
180
+ if "trace" in message and "request_id" in message and "trace" not in response:
181
+ trace_data = dict(message["trace"])
147
182
  handler_complete_time = ntp_clock.now_ms()
148
183
  if handler_complete_time is not None:
149
- response["trace"]["handler_complete"] = handler_complete_time
150
- # Update ping to show total time from client_send
151
- if "client_send" in response["trace"]:
152
- response["trace"]["ping"] = handler_complete_time - response["trace"]["client_send"]
153
- logger.info(f"✅ Handler completed: {message['request_id']} ({self.command_name})")
154
-
155
- # Extract project_id from response for session targeting
156
- project_id = response.get("project_id")
157
- logger.info("handler: %s response project_id=%s, response=%s",
158
- self.command_name, project_id, response)
159
- await self.send_response(response, reply_channel, project_id)
184
+ trace_data["handler_complete"] = handler_complete_time
185
+ if "client_send" in trace_data:
186
+ trace_data["ping"] = handler_complete_time - trace_data["client_send"]
187
+ response["trace"] = trace_data
188
+ logger.info(f"✅ Handler completed: {message['request_id']} ({self.command_name})")
189
+
160
190
  else:
161
191
  logger.info("handler: %s handled response transmission directly", self.command_name)
162
192
  except Exception as exc:
@@ -216,4 +246,4 @@ class SyncHandler(BaseHandler):
216
246
  logger.exception("Error in sync handler %s: %s", self.command_name, exc)
217
247
  # Extract project_id from original message for error targeting
218
248
  project_id = message.get("project_id")
219
- await self.send_error(str(exc), reply_channel, project_id)
249
+ await self.send_error(str(exc), reply_channel, project_id)
@@ -59,6 +59,7 @@ def _emit_progress_event(
59
59
  message: str,
60
60
  phase: str,
61
61
  request_id: Optional[str],
62
+ client_sessions: Optional[List[str]] = None,
62
63
  details: Optional[Dict[str, Any]] = None,
63
64
  ) -> None:
64
65
  loop = handler.context.get("event_loop")
@@ -84,6 +85,8 @@ def _emit_progress_event(
84
85
  payload["request_id"] = request_id
85
86
  if details:
86
87
  payload["details"] = details
88
+ if client_sessions:
89
+ payload["client_sessions"] = client_sessions
87
90
 
88
91
  future = asyncio.run_coroutine_threadsafe(handler.send_response(payload), loop)
89
92
  future.add_done_callback(
@@ -1050,8 +1053,14 @@ class CreateProxmoxContainerHandler(SyncHandler):
1050
1053
  return "create_proxmox_container"
1051
1054
 
1052
1055
  def execute(self, message: Dict[str, Any]) -> Dict[str, Any]:
1053
- logger.info("create_proxmox_container command received")
1054
1056
  request_id = message.get("request_id")
1057
+ source_client_session = message.get("source_client_session")
1058
+ logger.info(
1059
+ "create_proxmox_container command received request_id=%s client_session=%s",
1060
+ request_id,
1061
+ source_client_session,
1062
+ )
1063
+ client_sessions = [source_client_session] if source_client_session else None
1055
1064
  bootstrap_user, bootstrap_password, bootstrap_ssh_key = _get_provisioning_user_info(message)
1056
1065
  bootstrap_steps = _build_bootstrap_steps(bootstrap_user, bootstrap_password, bootstrap_ssh_key)
1057
1066
  total_steps = 3 + len(bootstrap_steps) + 2
@@ -1075,6 +1084,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
1075
1084
  message=start_message,
1076
1085
  phase="lifecycle",
1077
1086
  request_id=request_id,
1087
+ client_sessions=client_sessions,
1078
1088
  )
1079
1089
  try:
1080
1090
  result = action()
@@ -1089,6 +1099,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
1089
1099
  message=f"{step_label} failed: {exc}",
1090
1100
  phase="lifecycle",
1091
1101
  request_id=request_id,
1102
+ client_sessions=client_sessions,
1092
1103
  details={"error": str(exc)},
1093
1104
  )
1094
1105
  raise
@@ -1102,6 +1113,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
1102
1113
  message=success_message,
1103
1114
  phase="lifecycle",
1104
1115
  request_id=request_id,
1116
+ client_sessions=client_sessions,
1105
1117
  )
1106
1118
  current_step_index += 1
1107
1119
  return result
@@ -1131,7 +1143,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
1131
1143
  payload["cpuunits"] = max(int(payload["cpus"] * 1024), 10)
1132
1144
  payload["memory"] = int(payload["ram_mib"])
1133
1145
  payload["node"] = node
1134
- logger.debug(
1146
+ logger.info(
1135
1147
  "Provisioning container node=%s template=%s ram=%s cpu=%s storage=%s",
1136
1148
  node,
1137
1149
  payload["template"],
@@ -1144,6 +1156,12 @@ class CreateProxmoxContainerHandler(SyncHandler):
1144
1156
  payload["created_at"] = datetime.utcnow().isoformat() + "Z"
1145
1157
  payload["status"] = "creating"
1146
1158
  _write_container_record(vmid, payload)
1159
+ logger.info(
1160
+ "Container record written vmid=%s hostname=%s client_session=%s",
1161
+ vmid,
1162
+ payload["hostname"],
1163
+ source_client_session,
1164
+ )
1147
1165
  return proxmox, node, vmid, payload
1148
1166
 
1149
1167
  proxmox, node, vmid, payload = _run_lifecycle_step(
@@ -1202,9 +1220,16 @@ class CreateProxmoxContainerHandler(SyncHandler):
1202
1220
  message=message_text,
1203
1221
  phase="bootstrap",
1204
1222
  request_id=request_id,
1223
+ client_sessions=client_sessions,
1205
1224
  details=details or None,
1206
1225
  )
1207
1226
 
1227
+ logger.info(
1228
+ "Bootstrapping Portacode in container vmid=%s user=%s client_session=%s",
1229
+ vmid,
1230
+ payload["username"],
1231
+ source_client_session,
1232
+ )
1208
1233
  public_key, steps = _bootstrap_portacode(
1209
1234
  vmid,
1210
1235
  payload["username"],
@@ -1217,7 +1242,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
1217
1242
  )
1218
1243
  current_step_index += len(bootstrap_steps)
1219
1244
 
1220
- return {
1245
+ response = {
1221
1246
  "event": "proxmox_container_created",
1222
1247
  "success": True,
1223
1248
  "message": f"Container {vmid} is ready and Portacode key captured.",
@@ -1234,6 +1259,10 @@ class CreateProxmoxContainerHandler(SyncHandler):
1234
1259
  },
1235
1260
  "setup_steps": steps,
1236
1261
  }
1262
+ if client_sessions:
1263
+ response["client_sessions"] = client_sessions
1264
+ response["_reply_to_source_session"] = True
1265
+ return response
1237
1266
 
1238
1267
 
1239
1268
  class StartPortacodeServiceHandler(SyncHandler):
@@ -1261,6 +1290,15 @@ class StartPortacodeServiceHandler(SyncHandler):
1261
1290
  start_index = int(message.get("step_index", 1))
1262
1291
  total_steps = int(message.get("total_steps", start_index + 2))
1263
1292
  request_id = message.get("request_id")
1293
+ source_client_session = message.get("source_client_session")
1294
+ client_sessions = [source_client_session] if source_client_session else None
1295
+
1296
+ logger.info(
1297
+ "start_portacode_service invoked vmid=%s user=%s client_session=%s",
1298
+ vmid,
1299
+ user,
1300
+ source_client_session,
1301
+ )
1264
1302
 
1265
1303
  auth_step_name = "setup_device_authentication"
1266
1304
  auth_label = "Setting up device authentication"
@@ -1274,6 +1312,7 @@ class StartPortacodeServiceHandler(SyncHandler):
1274
1312
  message="Notifying the server of the new device…",
1275
1313
  phase="service",
1276
1314
  request_id=request_id,
1315
+ client_sessions=client_sessions,
1277
1316
  )
1278
1317
  _emit_progress_event(
1279
1318
  self,
@@ -1285,6 +1324,7 @@ class StartPortacodeServiceHandler(SyncHandler):
1285
1324
  message="Authentication metadata recorded.",
1286
1325
  phase="service",
1287
1326
  request_id=request_id,
1327
+ client_sessions=client_sessions,
1288
1328
  )
1289
1329
 
1290
1330
  install_step = start_index + 1
@@ -1299,6 +1339,7 @@ class StartPortacodeServiceHandler(SyncHandler):
1299
1339
  message="Running sudo portacode service install…",
1300
1340
  phase="service",
1301
1341
  request_id=request_id,
1342
+ client_sessions=client_sessions,
1302
1343
  )
1303
1344
 
1304
1345
  cmd = f"su - {user} -c 'sudo -S portacode service install'"
@@ -1315,6 +1356,7 @@ class StartPortacodeServiceHandler(SyncHandler):
1315
1356
  message=f"{install_label} failed: {res.get('stderr') or res.get('stdout')}",
1316
1357
  phase="service",
1317
1358
  request_id=request_id,
1359
+ client_sessions=client_sessions,
1318
1360
  details={
1319
1361
  "stderr": res.get("stderr"),
1320
1362
  "stdout": res.get("stdout"),
@@ -1322,6 +1364,12 @@ class StartPortacodeServiceHandler(SyncHandler):
1322
1364
  )
1323
1365
  raise RuntimeError(res.get("stderr") or res.get("stdout") or "Service install failed")
1324
1366
 
1367
+ logger.info(
1368
+ "portacode service install command completed vmid=%s returncode=%s",
1369
+ vmid,
1370
+ res["returncode"],
1371
+ )
1372
+
1325
1373
  _emit_progress_event(
1326
1374
  self,
1327
1375
  step_index=install_step,
@@ -1332,14 +1380,19 @@ class StartPortacodeServiceHandler(SyncHandler):
1332
1380
  message="Portacode service install finished.",
1333
1381
  phase="service",
1334
1382
  request_id=request_id,
1383
+ client_sessions=client_sessions,
1335
1384
  )
1336
1385
 
1337
- return {
1386
+ response = {
1338
1387
  "event": "proxmox_service_started",
1339
1388
  "success": True,
1340
1389
  "message": "Portacode service install completed",
1341
1390
  "ctid": str(vmid),
1342
1391
  }
1392
+ if client_sessions:
1393
+ response["client_sessions"] = client_sessions
1394
+ response["_reply_to_source_session"] = True
1395
+ return response
1343
1396
 
1344
1397
 
1345
1398
  class StartProxmoxContainerHandler(SyncHandler):
@@ -1355,12 +1408,20 @@ class StartProxmoxContainerHandler(SyncHandler):
1355
1408
  proxmox = _connect_proxmox(config)
1356
1409
  node = _get_node_from_config(config)
1357
1410
  _ensure_container_managed(proxmox, node, vmid)
1411
+ source_client_session = message.get("source_client_session")
1412
+ client_sessions = [source_client_session] if source_client_session else None
1413
+
1414
+ logger.info(
1415
+ "start_proxmox_container invoked vmid=%s client_session=%s",
1416
+ vmid,
1417
+ source_client_session,
1418
+ )
1358
1419
 
1359
1420
  status, elapsed = _start_container(proxmox, node, vmid)
1360
1421
  _update_container_record(vmid, {"status": "running"})
1361
1422
 
1362
1423
  infra = get_infra_snapshot()
1363
- return {
1424
+ response = {
1364
1425
  "event": "proxmox_container_action",
1365
1426
  "action": "start",
1366
1427
  "success": True,
@@ -1370,6 +1431,10 @@ class StartProxmoxContainerHandler(SyncHandler):
1370
1431
  "status": status.get("status"),
1371
1432
  "infra": infra,
1372
1433
  }
1434
+ if client_sessions:
1435
+ response["client_sessions"] = client_sessions
1436
+ response["_reply_to_source_session"] = True
1437
+ return response
1373
1438
 
1374
1439
 
1375
1440
  class StopProxmoxContainerHandler(SyncHandler):
@@ -1385,6 +1450,14 @@ class StopProxmoxContainerHandler(SyncHandler):
1385
1450
  proxmox = _connect_proxmox(config)
1386
1451
  node = _get_node_from_config(config)
1387
1452
  _ensure_container_managed(proxmox, node, vmid)
1453
+ source_client_session = message.get("source_client_session")
1454
+ client_sessions = [source_client_session] if source_client_session else None
1455
+
1456
+ logger.info(
1457
+ "stop_proxmox_container invoked vmid=%s client_session=%s",
1458
+ vmid,
1459
+ source_client_session,
1460
+ )
1388
1461
 
1389
1462
  status, elapsed = _stop_container(proxmox, node, vmid)
1390
1463
  final_status = status.get("status") or "stopped"
@@ -1396,7 +1469,7 @@ class StopProxmoxContainerHandler(SyncHandler):
1396
1469
  if final_status != "running" and elapsed == 0.0
1397
1470
  else f"Stopped container {vmid} in {elapsed:.1f}s."
1398
1471
  )
1399
- return {
1472
+ response = {
1400
1473
  "event": "proxmox_container_action",
1401
1474
  "action": "stop",
1402
1475
  "success": True,
@@ -1406,6 +1479,10 @@ class StopProxmoxContainerHandler(SyncHandler):
1406
1479
  "status": final_status,
1407
1480
  "infra": infra,
1408
1481
  }
1482
+ if client_sessions:
1483
+ response["client_sessions"] = client_sessions
1484
+ response["_reply_to_source_session"] = True
1485
+ return response
1409
1486
 
1410
1487
 
1411
1488
  class RemoveProxmoxContainerHandler(SyncHandler):
@@ -1421,13 +1498,21 @@ class RemoveProxmoxContainerHandler(SyncHandler):
1421
1498
  proxmox = _connect_proxmox(config)
1422
1499
  node = _get_node_from_config(config)
1423
1500
  _ensure_container_managed(proxmox, node, vmid)
1501
+ source_client_session = message.get("source_client_session")
1502
+ client_sessions = [source_client_session] if source_client_session else None
1503
+
1504
+ logger.info(
1505
+ "remove_proxmox_container invoked vmid=%s client_session=%s",
1506
+ vmid,
1507
+ source_client_session,
1508
+ )
1424
1509
 
1425
1510
  stop_status, stop_elapsed = _stop_container(proxmox, node, vmid)
1426
1511
  delete_status, delete_elapsed = _delete_container(proxmox, node, vmid)
1427
1512
  _remove_container_record(vmid)
1428
1513
 
1429
1514
  infra = get_infra_snapshot()
1430
- return {
1515
+ response = {
1431
1516
  "event": "proxmox_container_action",
1432
1517
  "action": "remove",
1433
1518
  "success": True,
@@ -1440,6 +1525,10 @@ class RemoveProxmoxContainerHandler(SyncHandler):
1440
1525
  "status": "deleted",
1441
1526
  "infra": infra,
1442
1527
  }
1528
+ if client_sessions:
1529
+ response["client_sessions"] = client_sessions
1530
+ response["_reply_to_source_session"] = True
1531
+ return response
1443
1532
 
1444
1533
 
1445
1534
  class ConfigureProxmoxInfraHandler(SyncHandler):
@@ -1453,13 +1542,19 @@ class ConfigureProxmoxInfraHandler(SyncHandler):
1453
1542
  verify_ssl = bool(message.get("verify_ssl"))
1454
1543
  if not token_identifier or not token_value:
1455
1544
  raise ValueError("token_identifier and token_value are required")
1545
+ source_client_session = message.get("source_client_session")
1546
+ client_sessions = [source_client_session] if source_client_session else None
1456
1547
  snapshot = configure_infrastructure(token_identifier, token_value, verify_ssl=verify_ssl)
1457
- return {
1548
+ response = {
1458
1549
  "event": "proxmox_infra_configured",
1459
1550
  "success": True,
1460
1551
  "message": "Proxmox infrastructure configured",
1461
1552
  "infra": snapshot,
1462
1553
  }
1554
+ if client_sessions:
1555
+ response["client_sessions"] = client_sessions
1556
+ response["_reply_to_source_session"] = True
1557
+ return response
1463
1558
 
1464
1559
 
1465
1560
  class RevertProxmoxInfraHandler(SyncHandler):
@@ -1468,10 +1563,16 @@ class RevertProxmoxInfraHandler(SyncHandler):
1468
1563
  return "revert_proxmox_infra"
1469
1564
 
1470
1565
  def execute(self, message: Dict[str, Any]) -> Dict[str, Any]:
1566
+ source_client_session = message.get("source_client_session")
1567
+ client_sessions = [source_client_session] if source_client_session else None
1471
1568
  snapshot = revert_infrastructure()
1472
- return {
1569
+ response = {
1473
1570
  "event": "proxmox_infra_reverted",
1474
1571
  "success": True,
1475
1572
  "message": "Proxmox infrastructure configuration reverted",
1476
1573
  "infra": snapshot,
1477
1574
  }
1575
+ if client_sessions:
1576
+ response["client_sessions"] = client_sessions
1577
+ response["_reply_to_source_session"] = True
1578
+ return response
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.4.12.dev9
3
+ Version: 1.4.13.dev1
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
File without changes