portacode 1.4.19__tar.gz → 1.4.19.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. {portacode-1.4.19 → portacode-1.4.19.dev0}/PKG-INFO +1 -1
  2. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/_version.py +2 -2
  3. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +3 -4
  4. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/proxmox_infra.py +17 -156
  5. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode.egg-info/PKG-INFO +1 -1
  6. {portacode-1.4.19 → portacode-1.4.19.dev0}/.claude/agents/communication-manager.md +0 -0
  7. {portacode-1.4.19 → portacode-1.4.19.dev0}/.claude/settings.local.json +0 -0
  8. {portacode-1.4.19 → portacode-1.4.19.dev0}/.gitignore +0 -0
  9. {portacode-1.4.19 → portacode-1.4.19.dev0}/.gitmodules +0 -0
  10. {portacode-1.4.19 → portacode-1.4.19.dev0}/LICENSE +0 -0
  11. {portacode-1.4.19 → portacode-1.4.19.dev0}/MANIFEST.in +0 -0
  12. {portacode-1.4.19 → portacode-1.4.19.dev0}/Makefile +0 -0
  13. {portacode-1.4.19 → portacode-1.4.19.dev0}/README.md +0 -0
  14. {portacode-1.4.19 → portacode-1.4.19.dev0}/backup.sh +0 -0
  15. {portacode-1.4.19 → portacode-1.4.19.dev0}/connect.py +0 -0
  16. {portacode-1.4.19 → portacode-1.4.19.dev0}/connect.sh +0 -0
  17. {portacode-1.4.19 → portacode-1.4.19.dev0}/docker-compose.yaml +0 -0
  18. {portacode-1.4.19 → portacode-1.4.19.dev0}/docs/images/device-transfer-button.png +0 -0
  19. {portacode-1.4.19 → portacode-1.4.19.dev0}/docs/images/device-transfer-modal.png +0 -0
  20. {portacode-1.4.19 → portacode-1.4.19.dev0}/docs/images/pair-device-button.png +0 -0
  21. {portacode-1.4.19 → portacode-1.4.19.dev0}/docs/images/pairing-request.png +0 -0
  22. {portacode-1.4.19 → portacode-1.4.19.dev0}/docs/images/student-workspace.png +0 -0
  23. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/README.md +0 -0
  24. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/simple_device/Dockerfile +0 -0
  25. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/simple_device/README.md +0 -0
  26. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode +0 -0
  27. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode.pub +0 -0
  28. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/simple_device/docker-compose.yaml +0 -0
  29. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/Dockerfile +0 -0
  30. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/README.md +0 -0
  31. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode +0 -0
  32. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode.pub +0 -0
  33. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/.local/share/portacode/run/gateway.pid +0 -0
  34. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/.gitignore +0 -0
  35. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/README.md +0 -0
  36. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/db.sqlite3 +0 -0
  37. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__init__.py +0 -0
  38. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/__init__.cpython-311.pyc +0 -0
  39. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/settings.cpython-311.pyc +0 -0
  40. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/urls.cpython-311.pyc +0 -0
  41. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/wsgi.cpython-311.pyc +0 -0
  42. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/asgi.py +0 -0
  43. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/settings.py +0 -0
  44. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/urls.py +0 -0
  45. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/wsgi.py +0 -0
  46. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/manage.py +0 -0
  47. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/requirements.txt +0 -0
  48. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/templates/treats/home.html +0 -0
  49. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__init__.py +0 -0
  50. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/__init__.cpython-311.pyc +0 -0
  51. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/admin.cpython-311.pyc +0 -0
  52. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/apps.cpython-311.pyc +0 -0
  53. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/menu.cpython-311.pyc +0 -0
  54. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/models.cpython-311.pyc +0 -0
  55. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/urls.cpython-311.pyc +0 -0
  56. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/views.cpython-311.pyc +0 -0
  57. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/admin.py +0 -0
  58. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/apps.py +0 -0
  59. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/menu.py +0 -0
  60. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__init__.py +0 -0
  61. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
  62. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/models.py +0 -0
  63. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/tests.py +0 -0
  64. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/urls.py +0 -0
  65. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-01/workspace/treats/views.py +0 -0
  66. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode +0 -0
  67. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode.pub +0 -0
  68. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/README.md +0 -0
  69. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/__init__.py +0 -0
  70. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/asgi.py +0 -0
  71. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/settings.py +0 -0
  72. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/urls.py +0 -0
  73. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/wsgi.py +0 -0
  74. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/manage.py +0 -0
  75. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/requirements.txt +0 -0
  76. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/templates/treats/home.html +0 -0
  77. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/__init__.py +0 -0
  78. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/admin.py +0 -0
  79. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/apps.py +0 -0
  80. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/menu.py +0 -0
  81. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/migrations/__init__.py +0 -0
  82. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/models.py +0 -0
  83. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/tests.py +0 -0
  84. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/urls.py +0 -0
  85. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-02/workspace/treats/views.py +0 -0
  86. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode +0 -0
  87. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode.pub +0 -0
  88. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/README.md +0 -0
  89. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/__init__.py +0 -0
  90. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/asgi.py +0 -0
  91. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/settings.py +0 -0
  92. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/urls.py +0 -0
  93. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/wsgi.py +0 -0
  94. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/manage.py +0 -0
  95. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/requirements.txt +0 -0
  96. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/templates/treats/home.html +0 -0
  97. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/__init__.py +0 -0
  98. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/admin.py +0 -0
  99. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/apps.py +0 -0
  100. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/menu.py +0 -0
  101. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/migrations/__init__.py +0 -0
  102. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/models.py +0 -0
  103. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/tests.py +0 -0
  104. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/urls.py +0 -0
  105. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-03/workspace/treats/views.py +0 -0
  106. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode +0 -0
  107. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode.pub +0 -0
  108. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/README.md +0 -0
  109. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/__init__.py +0 -0
  110. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/asgi.py +0 -0
  111. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/settings.py +0 -0
  112. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/urls.py +0 -0
  113. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/wsgi.py +0 -0
  114. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/manage.py +0 -0
  115. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/requirements.txt +0 -0
  116. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/templates/treats/home.html +0 -0
  117. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/__init__.py +0 -0
  118. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/admin.py +0 -0
  119. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/apps.py +0 -0
  120. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/menu.py +0 -0
  121. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/migrations/__init__.py +0 -0
  122. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/models.py +0 -0
  123. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/tests.py +0 -0
  124. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/urls.py +0 -0
  125. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-04/workspace/treats/views.py +0 -0
  126. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode +0 -0
  127. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode.pub +0 -0
  128. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/README.md +0 -0
  129. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/__init__.py +0 -0
  130. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/asgi.py +0 -0
  131. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/settings.py +0 -0
  132. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/urls.py +0 -0
  133. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/wsgi.py +0 -0
  134. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/manage.py +0 -0
  135. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/requirements.txt +0 -0
  136. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/templates/treats/home.html +0 -0
  137. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/__init__.py +0 -0
  138. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/admin.py +0 -0
  139. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/apps.py +0 -0
  140. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/menu.py +0 -0
  141. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/migrations/__init__.py +0 -0
  142. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/models.py +0 -0
  143. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/tests.py +0 -0
  144. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/urls.py +0 -0
  145. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-05/workspace/treats/views.py +0 -0
  146. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode +0 -0
  147. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode.pub +0 -0
  148. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/README.md +0 -0
  149. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/__init__.py +0 -0
  150. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/asgi.py +0 -0
  151. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/settings.py +0 -0
  152. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/urls.py +0 -0
  153. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/wsgi.py +0 -0
  154. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/manage.py +0 -0
  155. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/requirements.txt +0 -0
  156. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/templates/treats/home.html +0 -0
  157. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/__init__.py +0 -0
  158. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/admin.py +0 -0
  159. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/apps.py +0 -0
  160. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/menu.py +0 -0
  161. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/migrations/__init__.py +0 -0
  162. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/models.py +0 -0
  163. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/tests.py +0 -0
  164. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/urls.py +0 -0
  165. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-06/workspace/treats/views.py +0 -0
  166. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode +0 -0
  167. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode.pub +0 -0
  168. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/README.md +0 -0
  169. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/__init__.py +0 -0
  170. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/asgi.py +0 -0
  171. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/settings.py +0 -0
  172. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/urls.py +0 -0
  173. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/wsgi.py +0 -0
  174. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/manage.py +0 -0
  175. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/requirements.txt +0 -0
  176. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/templates/treats/home.html +0 -0
  177. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/__init__.py +0 -0
  178. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/admin.py +0 -0
  179. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/apps.py +0 -0
  180. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/menu.py +0 -0
  181. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/migrations/__init__.py +0 -0
  182. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/models.py +0 -0
  183. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/tests.py +0 -0
  184. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/urls.py +0 -0
  185. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-07/workspace/treats/views.py +0 -0
  186. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode +0 -0
  187. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode.pub +0 -0
  188. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/README.md +0 -0
  189. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/__init__.py +0 -0
  190. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/asgi.py +0 -0
  191. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/settings.py +0 -0
  192. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/urls.py +0 -0
  193. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/wsgi.py +0 -0
  194. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/manage.py +0 -0
  195. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/requirements.txt +0 -0
  196. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/templates/treats/home.html +0 -0
  197. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/__init__.py +0 -0
  198. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/admin.py +0 -0
  199. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/apps.py +0 -0
  200. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/menu.py +0 -0
  201. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/migrations/__init__.py +0 -0
  202. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/models.py +0 -0
  203. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/tests.py +0 -0
  204. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/urls.py +0 -0
  205. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-08/workspace/treats/views.py +0 -0
  206. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode +0 -0
  207. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode.pub +0 -0
  208. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/README.md +0 -0
  209. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/__init__.py +0 -0
  210. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/asgi.py +0 -0
  211. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/settings.py +0 -0
  212. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/urls.py +0 -0
  213. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/wsgi.py +0 -0
  214. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/manage.py +0 -0
  215. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/requirements.txt +0 -0
  216. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/templates/treats/home.html +0 -0
  217. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/__init__.py +0 -0
  218. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/admin.py +0 -0
  219. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/apps.py +0 -0
  220. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/menu.py +0 -0
  221. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/migrations/__init__.py +0 -0
  222. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/models.py +0 -0
  223. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/tests.py +0 -0
  224. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/urls.py +0 -0
  225. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-09/workspace/treats/views.py +0 -0
  226. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode +0 -0
  227. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode.pub +0 -0
  228. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/README.md +0 -0
  229. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/__init__.py +0 -0
  230. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/asgi.py +0 -0
  231. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/settings.py +0 -0
  232. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/urls.py +0 -0
  233. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/wsgi.py +0 -0
  234. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/manage.py +0 -0
  235. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/requirements.txt +0 -0
  236. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/templates/treats/home.html +0 -0
  237. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/__init__.py +0 -0
  238. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/admin.py +0 -0
  239. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/apps.py +0 -0
  240. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/menu.py +0 -0
  241. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/migrations/__init__.py +0 -0
  242. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/models.py +0 -0
  243. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/tests.py +0 -0
  244. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/urls.py +0 -0
  245. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/data/student-10/workspace/treats/views.py +0 -0
  246. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/docker-compose.yaml +0 -0
  247. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/README.md +0 -0
  248. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/__init__.py +0 -0
  249. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/asgi.py +0 -0
  250. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/settings.py +0 -0
  251. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/urls.py +0 -0
  252. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/galactic_bakeshop/wsgi.py +0 -0
  253. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/manage.py +0 -0
  254. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/requirements.txt +0 -0
  255. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/templates/treats/home.html +0 -0
  256. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/treats/__init__.py +0 -0
  257. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/treats/admin.py +0 -0
  258. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/treats/apps.py +0 -0
  259. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/treats/menu.py +0 -0
  260. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/treats/migrations/__init__.py +0 -0
  261. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/treats/models.py +0 -0
  262. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/treats/tests.py +0 -0
  263. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/treats/urls.py +0 -0
  264. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/initial_content/treats/views.py +0 -0
  265. {portacode-1.4.19 → portacode-1.4.19.dev0}/examples/workshop_fleet/instructions/WELCOME.md +0 -0
  266. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/README.md +0 -0
  267. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/__init__.py +0 -0
  268. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/__main__.py +0 -0
  269. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/cli.py +0 -0
  270. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/README.md +0 -0
  271. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/__init__.py +0 -0
  272. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/client.py +0 -0
  273. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/README.md +0 -0
  274. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/__init__.py +0 -0
  275. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/base.py +0 -0
  276. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/chunked_content.py +0 -0
  277. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/diff_handlers.py +0 -0
  278. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/file_handlers.py +0 -0
  279. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/project_aware_file_handlers.py +0 -0
  280. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/project_state/README.md +0 -0
  281. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/project_state/__init__.py +0 -0
  282. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/project_state/file_system_watcher.py +0 -0
  283. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/project_state/git_manager.py +0 -0
  284. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/project_state/handlers.py +0 -0
  285. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/project_state/manager.py +0 -0
  286. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/project_state/models.py +0 -0
  287. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/project_state/utils.py +0 -0
  288. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/project_state_handlers.py +0 -0
  289. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/registry.py +0 -0
  290. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/session.py +0 -0
  291. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/system_handlers.py +0 -0
  292. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/tab_factory.py +0 -0
  293. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/terminal_handlers.py +0 -0
  294. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/test_proxmox_infra.py +0 -0
  295. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/handlers/update_handler.py +0 -0
  296. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/multiplex.py +0 -0
  297. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/connection/terminal.py +0 -0
  298. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/data.py +0 -0
  299. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/keypair.py +0 -0
  300. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/__init__.py +0 -0
  301. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/__pycache__/__init__.cpython-311.pyc +0 -0
  302. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-311.pyc +0 -0
  303. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/elinks +0 -0
  304. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/gio-open +0 -0
  305. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/gnome-open +0 -0
  306. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/gvfs-open +0 -0
  307. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/kde-open +0 -0
  308. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/kfmclient +0 -0
  309. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/link_capture_exec.sh +0 -0
  310. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/link_capture_wrapper.py +0 -0
  311. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/links +0 -0
  312. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/links2 +0 -0
  313. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/lynx +0 -0
  314. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/mate-open +0 -0
  315. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/netsurf +0 -0
  316. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/sensible-browser +0 -0
  317. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/w3m +0 -0
  318. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/x-www-browser +0 -0
  319. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/link_capture/bin/xdg-open +0 -0
  320. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/logging_categories.py +0 -0
  321. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/pairing.py +0 -0
  322. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/service.py +0 -0
  323. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/static/js/test-ntp-clock.html +0 -0
  324. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/static/js/utils/ntp-clock.js +0 -0
  325. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/utils/NTP_ARCHITECTURE.md +0 -0
  326. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/utils/__init__.py +0 -0
  327. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/utils/diff_apply.py +0 -0
  328. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/utils/diff_renderer.py +0 -0
  329. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode/utils/ntp_clock.py +0 -0
  330. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode.egg-info/SOURCES.txt +0 -0
  331. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode.egg-info/dependency_links.txt +0 -0
  332. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode.egg-info/entry_points.txt +0 -0
  333. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode.egg-info/requires.txt +0 -0
  334. {portacode-1.4.19 → portacode-1.4.19.dev0}/portacode.egg-info/top_level.txt +0 -0
  335. {portacode-1.4.19 → portacode-1.4.19.dev0}/pyproject.toml +0 -0
  336. {portacode-1.4.19 → portacode-1.4.19.dev0}/restore.sh +0 -0
  337. {portacode-1.4.19 → portacode-1.4.19.dev0}/run_tests.py +0 -0
  338. {portacode-1.4.19 → portacode-1.4.19.dev0}/setup.cfg +0 -0
  339. {portacode-1.4.19 → portacode-1.4.19.dev0}/setup.py +0 -0
  340. {portacode-1.4.19 → portacode-1.4.19.dev0}/test.sh +0 -0
  341. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/README.md +0 -0
  342. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/__init__.py +0 -0
  343. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/test_device_online.py +0 -0
  344. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/test_file_operations.py +0 -0
  345. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/test_git_status_ui.py +0 -0
  346. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/test_login_flow.py +0 -0
  347. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/test_navigate_testing_folder.py +0 -0
  348. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/test_play_store_screenshots.py +0 -0
  349. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/test_terminal_buffer_performance.py +0 -0
  350. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/test_terminal_interaction.py +0 -0
  351. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/test_terminal_loading_race_condition.py +0 -0
  352. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_modules/test_terminal_start.py +0 -0
  353. {portacode-1.4.19 → portacode-1.4.19.dev0}/test_request_id.py +0 -0
  354. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/.env.example +0 -0
  355. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/README.md +0 -0
  356. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/__init__.py +0 -0
  357. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/cli.py +0 -0
  358. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/core/__init__.py +0 -0
  359. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/core/base_test.py +0 -0
  360. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/core/cli_manager.py +0 -0
  361. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/core/hierarchical_runner.py +0 -0
  362. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/core/playwright_manager.py +0 -0
  363. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/core/runner.py +0 -0
  364. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/core/shared_cli_manager.py +0 -0
  365. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/core/test_discovery.py +0 -0
  366. {portacode-1.4.19 → portacode-1.4.19.dev0}/testing_framework/requirements.txt +0 -0
  367. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/UI_UX/opening_a_file_on_desktop_results_in_nothing.md +0 -0
  368. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/agent_context_management.md +0 -0
  369. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/django_server_time_sync.md +0 -0
  370. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/issues/device_performance_degradation.md +0 -0
  371. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/issues/git_data_not_captured_in_proxmox.md +0 -0
  372. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/issues/indefinite_resource_loading.md +0 -0
  373. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/issues/portacode_service_silently_down.md +0 -0
  374. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/issues/premature_terminal_exit.md +0 -0
  375. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/issues/project_cpu_hotspots.md +0 -0
  376. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/issues/terminals_exit_upon_starting.md +0 -0
  377. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/issues/wrong_item_classification_on_client_side.md +0 -0
  378. {portacode-1.4.19 → portacode-1.4.19.dev0}/todo/smartphone_terminal_input_frustrations.md +0 -0
  379. {portacode-1.4.19 → portacode-1.4.19.dev0}/tools/generate_play_store_assets.py +0 -0
  380. {portacode-1.4.19 → portacode-1.4.19.dev0}/tools/pairing_tester.py +0 -0
  381. {portacode-1.4.19 → portacode-1.4.19.dev0}/tools/run_screenshot_suite.sh +0 -0
  382. {portacode-1.4.19 → portacode-1.4.19.dev0}/tools/test_python_ntp_clock.py +0 -0
  383. {portacode-1.4.19 → portacode-1.4.19.dev0}/validate.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.4.19
3
+ Version: 1.4.19.dev0
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.19'
32
- __version_tuple__ = version_tuple = (1, 4, 19)
31
+ __version__ = version = '1.4.19.dev0'
32
+ __version_tuple__ = version_tuple = (1, 4, 19, 'dev0')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -380,7 +380,7 @@ Starts a previously provisioned, Portacode-managed LXC container. Handled by [`S
380
380
 
381
381
  **Payload Fields:**
382
382
 
383
- * `ctid` (string, optional): Identifier of the container to start. If omitted, the handler resolves the CTID from the managed container records using `child_device_id`.
383
+ * `ctid` (string, required): Identifier of the container to start.
384
384
  * `child_device_id` (string, required): Dashboard `Device.id` of the container that triggered the request; the handler validates the CT belongs to that device before issuing the start.
385
385
 
386
386
  **Responses:**
@@ -394,7 +394,7 @@ Stops a running Portacode-managed container. Handled by [`StopProxmoxContainerHa
394
394
 
395
395
  **Payload Fields:**
396
396
 
397
- * `ctid` (string, optional): Identifier of the container to stop. If omitted, the handler resolves the CTID from managed container records and, if needed, by scanning managed container descriptions for the matching `device_id` marker.
397
+ * `ctid` (string, required): Identifier of the container to stop.
398
398
  * `child_device_id` (string, required): Dashboard `Device.id` that owns the container; the handler rejects the request if the CT is mapped to another device.
399
399
 
400
400
  **Responses:**
@@ -408,13 +408,12 @@ Deletes a managed container from Proxmox (stopping it first if necessary) and re
408
408
 
409
409
  **Payload Fields:**
410
410
 
411
- * `ctid` (string, optional): Identifier of the container to delete. If omitted, the handler resolves the CTID from managed container records and, if needed, by scanning managed container descriptions for the matching `device_id` marker.
411
+ * `ctid` (string, optional): Identifier of the container to delete. If omitted, the handler resolves the CTID from the managed container records using `child_device_id`.
412
412
  * `child_device_id` (string, required): Dashboard `Device.id` that should own the container metadata being purged.
413
413
 
414
414
  **Responses:**
415
415
 
416
416
  * Emits a [`proxmox_container_action`](#proxmox_container_action-event) event with `action="remove"` and the refreshed infra snapshot after deletion.
417
- * If no managed container matches the requested `child_device_id`, emits a `proxmox_container_action` event with `success=false`, `status="not_found"`, and a human-readable message (no error event).
418
417
  * Emits an [`error`](#error) event on failure.
419
418
 
420
419
  ### `proxmox_container_created`
@@ -17,7 +17,6 @@ import sys
17
17
  import tempfile
18
18
  import time
19
19
  import threading
20
- import random
21
20
  from datetime import datetime, timezone
22
21
  from pathlib import Path
23
22
  from typing import Any, Callable, Dict, Iterable, List, Optional, Sequence, Tuple
@@ -34,44 +33,6 @@ REPO_ROOT = Path(__file__).resolve().parents[3]
34
33
  NET_SETUP_SCRIPT = REPO_ROOT / "proxmox_management" / "net_setup.py"
35
34
  CONTAINERS_DIR = CONFIG_DIR / "containers"
36
35
  MANAGED_MARKER = "portacode-managed:true"
37
- DEVICE_ID_MARKER = "device_id="
38
- PROVISIONING_ID_MARKER = "provisioning_id="
39
-
40
-
41
- def _sanitize_description_value(value: Any) -> str:
42
- return str(value).strip().replace(";", "_")
43
-
44
-
45
- def _build_managed_description(
46
- base: Optional[str],
47
- *,
48
- device_id: Optional[str] = None,
49
- provisioning_id: Optional[str] = None,
50
- ) -> str:
51
- parts = [part for part in (base or "").split(";") if part]
52
- if MANAGED_MARKER not in parts:
53
- parts.insert(0, MANAGED_MARKER)
54
- if device_id:
55
- device_id_value = _sanitize_description_value(device_id)
56
- if not any(part.startswith(DEVICE_ID_MARKER) for part in parts):
57
- parts.append(f"{DEVICE_ID_MARKER}{device_id_value}")
58
- if provisioning_id:
59
- provisioning_value = _sanitize_description_value(provisioning_id)
60
- if not any(part.startswith(PROVISIONING_ID_MARKER) for part in parts):
61
- parts.append(f"{PROVISIONING_ID_MARKER}{provisioning_value}")
62
- return ";".join(parts)
63
-
64
-
65
- def _extract_marker_value(description: str, prefix: str) -> Optional[str]:
66
- for part in description.split(";"):
67
- part = part.strip()
68
- if part.startswith(prefix):
69
- return part[len(prefix) :].strip()
70
- return None
71
-
72
-
73
- def _parse_device_id_from_description(description: str) -> Optional[str]:
74
- return _extract_marker_value(description, DEVICE_ID_MARKER)
75
36
 
76
37
  DEFAULT_HOST = "localhost"
77
38
  DEFAULT_NODE_NAME = os.uname().nodename.split(".", 1)[0]
@@ -1296,21 +1257,12 @@ def _validate_positive_number(value: Any, default: float) -> float:
1296
1257
 
1297
1258
 
1298
1259
  def _wait_for_task(proxmox: Any, node: str, upid: str) -> Tuple[Dict[str, Any], float]:
1299
- from proxmoxer.core import ResourceException
1300
1260
  start = time.time()
1301
- poll = 2.0
1302
1261
  while True:
1303
- try:
1304
- status = proxmox.nodes(node).tasks(upid).status.get()
1305
- except ResourceException as e:
1306
- if str(e).startswith("599 "):
1307
- # transient proxy glitch; task may still be running
1308
- time.sleep(poll + random.random() * 0.5) # small jitter
1309
- continue
1310
- raise
1262
+ status = proxmox.nodes(node).tasks(upid).status.get()
1311
1263
  if status.get("status") == "stopped":
1312
1264
  return status, time.time() - start
1313
- time.sleep(poll)
1265
+ time.sleep(1)
1314
1266
 
1315
1267
 
1316
1268
  def _list_running_managed(proxmox: Any, node: str) -> List[Tuple[str, Dict[str, Any]]]:
@@ -1448,10 +1400,6 @@ def _parse_ctid(message: Dict[str, Any]) -> int:
1448
1400
  raise ValueError("ctid is required")
1449
1401
 
1450
1402
 
1451
- class _DeviceLookupError(ValueError):
1452
- pass
1453
-
1454
-
1455
1403
  def _resolve_vmid_for_device(device_id: str) -> int:
1456
1404
  _initialize_managed_containers_state()
1457
1405
  records = list(_MANAGED_CONTAINERS_STATE.get("records", {}).values())
@@ -1468,77 +1416,21 @@ def _resolve_vmid_for_device(device_id: str) -> int:
1468
1416
  return int(str(vmid).strip())
1469
1417
  except ValueError:
1470
1418
  raise ValueError("ctid must be an integer") from None
1471
- raise _DeviceLookupError(
1472
- f"No managed container record found for device_id {device_id!r}."
1473
- )
1474
-
1475
-
1476
- def _resolve_vmid_for_device_in_proxmox(
1477
- proxmox: Any, node: str, device_id: str
1478
- ) -> int:
1479
- device_id_value = str(device_id).strip()
1480
- matches: List[int] = []
1481
- try:
1482
- containers = proxmox.nodes(node).lxc.get()
1483
- except Exception as exc: # pragma: no cover - proxmox failure
1484
- raise _DeviceLookupError(
1485
- f"Unable to query Proxmox containers for device_id {device_id_value!r}: {exc}"
1486
- ) from exc
1487
- for entry in containers or []:
1488
- vmid = entry.get("vmid")
1489
- if vmid is None:
1490
- continue
1491
- try:
1492
- cfg = proxmox.nodes(node).lxc(str(vmid)).config.get()
1493
- except Exception:
1494
- continue
1495
- description = (cfg or {}).get("description") or ""
1496
- if MANAGED_MARKER not in description:
1497
- continue
1498
- desc_device_id = _parse_device_id_from_description(description)
1499
- if desc_device_id is None:
1500
- continue
1501
- if str(desc_device_id) != device_id_value:
1502
- continue
1503
- matches.append(int(str(vmid).strip()))
1504
- if not matches:
1505
- raise _DeviceLookupError(
1506
- f"No managed container found for device_id {device_id_value!r}. It may already be deleted."
1507
- )
1508
- if len(matches) > 1:
1509
- raise _DeviceLookupError(
1510
- f"Multiple managed containers found for device_id {device_id_value!r}: {matches}."
1511
- )
1512
- return matches[0]
1419
+ raise ValueError("ctid is required for remove_proxmox_container")
1513
1420
 
1514
1421
 
1515
1422
  def _ensure_container_managed(
1516
1423
  proxmox: Any, node: str, vmid: int, *, device_id: Optional[str] = None
1517
1424
  ) -> Tuple[Dict[str, Any], Dict[str, Any]]:
1518
- try:
1519
- record = _read_container_record(vmid)
1520
- except FileNotFoundError:
1521
- record = {}
1425
+ record = _read_container_record(vmid)
1522
1426
  ct_cfg = proxmox.nodes(node).lxc(str(vmid)).config.get()
1523
- description = (ct_cfg or {}).get("description") or ""
1524
- if not ct_cfg or MANAGED_MARKER not in description:
1427
+ if not ct_cfg or MANAGED_MARKER not in (ct_cfg.get("description") or ""):
1525
1428
  raise RuntimeError(f"Container {vmid} is not managed by Portacode.")
1526
1429
  record_device_id = record.get("device_id")
1527
- description_device_id = _parse_device_id_from_description(description)
1528
- if device_id:
1529
- device_id_value = str(device_id)
1530
- if description_device_id and str(description_device_id) != device_id_value:
1531
- raise RuntimeError(
1532
- f"Container {vmid} is managed for device {description_device_id!r}, not {device_id_value!r}."
1533
- )
1534
- if record_device_id and str(record_device_id) != device_id_value:
1535
- raise RuntimeError(
1536
- f"Container {vmid} is managed for device {record_device_id!r}, not {device_id_value!r}."
1537
- )
1538
- if not description_device_id and not record_device_id:
1539
- raise RuntimeError(
1540
- f"Container {vmid} is missing a device_id marker; refusing to operate without ctid."
1541
- )
1430
+ if device_id and str(record_device_id or "") != str(device_id):
1431
+ raise RuntimeError(
1432
+ f"Container {vmid} is managed for device {record_device_id!r}, not {device_id!r}."
1433
+ )
1542
1434
  return record, ct_cfg
1543
1435
 
1544
1436
 
@@ -2223,11 +2115,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
2223
2115
  payload, device_id=device_id, request_id=request_id
2224
2116
  )
2225
2117
  provisioning_id = secrets.token_hex(6)
2226
- payload["description"] = _build_managed_description(
2227
- payload.get("description"),
2228
- device_id=device_id,
2229
- provisioning_id=provisioning_id,
2230
- )
2118
+ payload["description"] = f"{payload.get('description', MANAGED_MARKER)};provisioning_id={provisioning_id}"
2231
2119
 
2232
2120
  def _provision_background() -> None:
2233
2121
  nonlocal current_step_index
@@ -2617,19 +2505,13 @@ class StartProxmoxContainerHandler(SyncHandler):
2617
2505
  return "start_proxmox_container"
2618
2506
 
2619
2507
  def execute(self, message: Dict[str, Any]) -> Dict[str, Any]:
2508
+ vmid = _parse_ctid(message)
2620
2509
  child_device_id = (message.get("child_device_id") or "").strip()
2621
2510
  if not child_device_id:
2622
2511
  raise ValueError("child_device_id is required for start_proxmox_container")
2623
2512
  config = _ensure_infra_configured()
2624
2513
  proxmox = _connect_proxmox(config)
2625
2514
  node = _get_node_from_config(config)
2626
- try:
2627
- vmid = _parse_ctid(message)
2628
- except ValueError:
2629
- try:
2630
- vmid = _resolve_vmid_for_device(child_device_id)
2631
- except _DeviceLookupError:
2632
- vmid = _resolve_vmid_for_device_in_proxmox(proxmox, node, child_device_id)
2633
2515
  _ensure_container_managed(proxmox, node, vmid, device_id=child_device_id)
2634
2516
 
2635
2517
  status, elapsed = _start_container(proxmox, node, vmid)
@@ -2656,19 +2538,13 @@ class StopProxmoxContainerHandler(SyncHandler):
2656
2538
  return "stop_proxmox_container"
2657
2539
 
2658
2540
  def execute(self, message: Dict[str, Any]) -> Dict[str, Any]:
2541
+ vmid = _parse_ctid(message)
2659
2542
  child_device_id = (message.get("child_device_id") or "").strip()
2660
2543
  if not child_device_id:
2661
2544
  raise ValueError("child_device_id is required for stop_proxmox_container")
2662
2545
  config = _ensure_infra_configured()
2663
2546
  proxmox = _connect_proxmox(config)
2664
2547
  node = _get_node_from_config(config)
2665
- try:
2666
- vmid = _parse_ctid(message)
2667
- except ValueError:
2668
- try:
2669
- vmid = _resolve_vmid_for_device(child_device_id)
2670
- except _DeviceLookupError:
2671
- vmid = _resolve_vmid_for_device_in_proxmox(proxmox, node, child_device_id)
2672
2548
  _ensure_container_managed(proxmox, node, vmid, device_id=child_device_id)
2673
2549
 
2674
2550
  status, elapsed = _stop_container(proxmox, node, vmid)
@@ -2704,30 +2580,14 @@ class RemoveProxmoxContainerHandler(SyncHandler):
2704
2580
  child_device_id = (message.get("child_device_id") or "").strip()
2705
2581
  if not child_device_id:
2706
2582
  raise ValueError("child_device_id is required for remove_proxmox_container")
2583
+ try:
2584
+ vmid = _parse_ctid(message)
2585
+ except ValueError:
2586
+ vmid = _resolve_vmid_for_device(child_device_id)
2707
2587
  request_id = message.get("request_id")
2708
2588
  config = _ensure_infra_configured()
2709
2589
  proxmox = _connect_proxmox(config)
2710
2590
  node = _get_node_from_config(config)
2711
- try:
2712
- vmid = _parse_ctid(message)
2713
- except ValueError:
2714
- try:
2715
- vmid = _resolve_vmid_for_device(child_device_id)
2716
- except _DeviceLookupError:
2717
- try:
2718
- vmid = _resolve_vmid_for_device_in_proxmox(proxmox, node, child_device_id)
2719
- except _DeviceLookupError as exc:
2720
- infra = get_infra_snapshot()
2721
- return {
2722
- "event": "proxmox_container_action",
2723
- "action": "remove",
2724
- "success": False,
2725
- "message": str(exc),
2726
- "status": "not_found",
2727
- "child_device_id": child_device_id,
2728
- "request_id": request_id,
2729
- "infra": infra,
2730
- }
2731
2591
  _ensure_container_managed(proxmox, node, vmid, device_id=child_device_id)
2732
2592
 
2733
2593
  stop_status, stop_elapsed = _stop_container(proxmox, node, vmid)
@@ -2747,6 +2607,7 @@ class RemoveProxmoxContainerHandler(SyncHandler):
2747
2607
  },
2748
2608
  "status": "deleted",
2749
2609
  "child_device_id": child_device_id,
2610
+ "on_behalf_of_device": child_device_id,
2750
2611
  "request_id": request_id,
2751
2612
  "infra": infra,
2752
2613
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.4.19
3
+ Version: 1.4.19.dev0
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes