pixlstash 1.7.0.dev2__tar.gz → 1.7.0.dev4__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 (389) hide show
  1. {pixlstash-1.7.0.dev2/pixlstash.egg-info → pixlstash-1.7.0.dev4}/PKG-INFO +5 -4
  2. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/README.md +4 -3
  3. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/frontend/package-lock.json +2 -2
  4. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/frontend/package.json +1 -1
  5. pixlstash-1.7.0.dev4/pixlstash/data/anchors/clipiqa_bad.npy +0 -0
  6. pixlstash-1.7.0.dev4/pixlstash/data/anchors/clipiqa_good.npy +0 -0
  7. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/__init__.py +1 -0
  8. pixlstash-1.7.0.dev4/pixlstash/db_models/detection.py +95 -0
  9. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/picture.py +8 -0
  10. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/tag.py +6 -0
  11. pixlstash-1.7.0.dev2/pixlstash/frontend/dist/assets/index-BdRiWzmx.css → pixlstash-1.7.0.dev4/pixlstash/frontend/dist/assets/index-C0DqJBy2.css +1 -1
  12. pixlstash-1.7.0.dev4/pixlstash/frontend/dist/assets/index-MvC0qIft.js +16 -0
  13. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/index.html +2 -2
  14. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/inference/engine.py +16 -0
  15. pixlstash-1.7.0.dev4/pixlstash/migrations/versions/0061_add_detection.py +63 -0
  16. pixlstash-1.7.0.dev4/pixlstash/migrations/versions/0062_recompute_smart_score_calibrated_anomaly.py +46 -0
  17. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/picture_scoring.py +91 -36
  18. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/characters.py +25 -6
  19. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/filesystem.py +90 -51
  20. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/import_folders.py +24 -3
  21. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/picture_sets.py +65 -11
  22. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/_crud.py +166 -0
  23. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/_export.py +2 -0
  24. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/_import.py +17 -2
  25. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/_misc.py +11 -6
  26. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/_thumbnails.py +29 -0
  27. pixlstash-1.7.0.dev4/pixlstash/routes/reference_folders.py +1587 -0
  28. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/stacks.py +11 -6
  29. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/tag_predictions.py +33 -8
  30. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/tag_suggestions.py +55 -17
  31. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/tags.py +131 -1
  32. pixlstash-1.7.0.dev4/pixlstash/routes/test_hooks.py +234 -0
  33. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/server.py +17 -0
  34. pixlstash-1.7.0.dev4/pixlstash/services/impossible_tag_clear_service.py +140 -0
  35. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/impossible_tag_scan_service.py +41 -55
  36. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/plugin_service.py +9 -1
  37. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/tagger_run_service.py +42 -0
  38. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tagger_plugins/florence2.py +171 -0
  39. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tagger_plugins/pixlstash_tagger.py +1 -1
  40. pixlstash-1.7.0.dev4/pixlstash/tasks/detection_task.py +200 -0
  41. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_watch_folder_import_finder.py +31 -2
  42. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/smart_score_task.py +21 -64
  43. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/task_type.py +1 -0
  44. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/watch_folder_import_task.py +25 -2
  45. pixlstash-1.7.0.dev4/pixlstash/utils/quality/anomaly_penalty.py +254 -0
  46. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/quality/smart_score_utils.py +108 -14
  47. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/export_utils.py +154 -0
  48. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/person_tags.py +44 -0
  49. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/vault.py +66 -3
  50. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4/pixlstash.egg-info}/PKG-INFO +5 -4
  51. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash.egg-info/SOURCES.txt +17 -2
  52. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pyproject.toml +1 -1
  53. pixlstash-1.7.0.dev4/tests/test_anomaly_penalty.py +275 -0
  54. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_architecture_guardrails.py +11 -4
  55. pixlstash-1.7.0.dev4/tests/test_detection_florence.py +146 -0
  56. pixlstash-1.7.0.dev4/tests/test_detection_model.py +193 -0
  57. pixlstash-1.7.0.dev4/tests/test_detections_scope.py +245 -0
  58. pixlstash-1.7.0.dev4/tests/test_impossible_clear.py +130 -0
  59. pixlstash-1.7.0.dev4/tests/test_impossible_clear_authz.py +190 -0
  60. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_impossible_filter.py +3 -1
  61. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_person_tags.py +34 -0
  62. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_reference_folder_sidecars.py +296 -0
  63. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_watch_folder_worker.py +99 -0
  64. pixlstash-1.7.0.dev2/pixlstash/frontend/dist/assets/index-C5zoCHch.js +0 -16
  65. pixlstash-1.7.0.dev2/pixlstash/routes/reference_folders.py +0 -566
  66. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/LICENSE +0 -0
  67. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/MANIFEST.in +0 -0
  68. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/frontend/LICENSE +0 -0
  69. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/LICENSE +0 -0
  70. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/__init__.py +0 -0
  71. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/alembic.ini +0 -0
  72. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/app.py +0 -0
  73. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/auth.py +0 -0
  74. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/data/anchors/builtin_bad.npy +0 -0
  75. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/data/anchors/builtin_good.npy +0 -0
  76. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/data/comfyui-workflows/built-in/Flux2-Klein-Image-Edit.json +0 -0
  77. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/data/comfyui-workflows/built-in/Flux2-Klein-t2i.json +0 -0
  78. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/data/comfyui-workflows/built-in/Upscale-2x-RealESRGAN.json +0 -0
  79. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/data/scalar-assets/ScreenshotToken.jpg +0 -0
  80. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/data/scalar-assets/ScreenshotTokens.jpg +0 -0
  81. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/data/scalar-assets/ScreenshotsUserSettings.jpg +0 -0
  82. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/data/scalar-assets/WhereIsUserSettings.jpg +0 -0
  83. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/data/scalar-assets/logo.png +0 -0
  84. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/database.py +0 -0
  85. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/character.py +0 -0
  86. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/deleted_file_log.py +0 -0
  87. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/face.py +0 -0
  88. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/guest_score.py +0 -0
  89. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/guest_session.py +0 -0
  90. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/import_folder.py +0 -0
  91. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/metadata.py +0 -0
  92. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/picture_likeness.py +0 -0
  93. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/picture_project.py +0 -0
  94. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/picture_set.py +0 -0
  95. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/picture_stack.py +0 -0
  96. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/project.py +0 -0
  97. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/quality.py +0 -0
  98. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/reference_folder.py +0 -0
  99. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/snapshot.py +0 -0
  100. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/tag_prediction.py +0 -0
  101. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/tag_suggestion.py +0 -0
  102. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/tagger_run.py +0 -0
  103. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/user.py +0 -0
  104. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/db_models/user_token.py +0 -0
  105. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/event_types.py +0 -0
  106. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/Empty.png +0 -0
  107. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/EmptyTrash.png +0 -0
  108. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/Logo.png +0 -0
  109. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/Watermark.png +0 -0
  110. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/assets/Tiny5-Regular-WaYIHWdr.ttf +0 -0
  111. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
  112. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
  113. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
  114. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
  115. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/favicon.ico +0 -0
  116. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/frontend/dist/vite.svg +0 -0
  117. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_loading_dataset_prepper.py +0 -0
  118. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/__init__.py +0 -0
  119. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/base.py +0 -0
  120. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/built-in/blur_sharpen.py +0 -0
  121. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/built-in/brightness_contrast.py +0 -0
  122. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/built-in/colour_filter.py +0 -0
  123. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/built-in/pixelate.py +0 -0
  124. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/built-in/plugin_template.py +0 -0
  125. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/built-in/rotate.py +0 -0
  126. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/built-in/scaling.py +0 -0
  127. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/registry.py +0 -0
  128. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/image_plugins/service.py +0 -0
  129. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/inference/__init__.py +0 -0
  130. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/inference/model_lifecycle.py +0 -0
  131. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/inference/vram_budget.py +0 -0
  132. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/inference/workflows/__init__.py +0 -0
  133. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/inference/workflows/clip_embedding.py +0 -0
  134. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/inference/workflows/description.py +0 -0
  135. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/inference/workflows/face_embedding.py +0 -0
  136. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/inference/workflows/tagging.py +0 -0
  137. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/inference/workflows/text_embedding.py +0 -0
  138. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/env.py +0 -0
  139. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/script.py.mako +0 -0
  140. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0001_baseline.py +0 -0
  141. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0002_add_text_score.py +0 -0
  142. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0003_add_original_file_name.py +0 -0
  143. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0004_add_comfyui_fields.py +0 -0
  144. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0005_add_projects.py +0 -0
  145. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0006_add_attachment_url.py +0 -0
  146. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0007_add_picture_project_id.py +0 -0
  147. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0008_add_compact_mode.py +0 -0
  148. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0009_add_picture_project_membership.py +0 -0
  149. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0010_project_name_uniqueness.py +0 -0
  150. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0011_pictureset_name_uniqueness.py +0 -0
  151. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0012_character_name_uniqueness.py +0 -0
  152. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0013_tag_prediction.py +0 -0
  153. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0014_tag_prediction_composite_index.py +0 -0
  154. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0015_tag_prediction_model_version_rename.py +0 -0
  155. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0016_tag_prediction_confirm_applied.py +0 -0
  156. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0017_anomaly_tag_uncertainty.py +0 -0
  157. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0018_anomaly_tag_uncertainty_disagreement.py +0 -0
  158. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0019_pending_character_id.py +0 -0
  159. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0020_source_picture_id.py +0 -0
  160. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0021_tagger_enabled_flags.py +0 -0
  161. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0022_add_check_for_updates.py +0 -0
  162. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0023_add_show_keyboard_hint.py +0 -0
  163. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0024_add_deleted_file_log.py +0 -0
  164. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0025_add_reference_folders.py +0 -0
  165. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0026_add_caption_file_and_sync_captions.py +0 -0
  166. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0027_add_caption_file_mtime.py +0 -0
  167. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0028_add_smart_score.py +0 -0
  168. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0029_add_import_excluded_to_picture.py +0 -0
  169. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0030_add_import_folders.py +0 -0
  170. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0031_migrate_watch_folders_to_import_folder.py +0 -0
  171. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0032_add_reference_folder_host_path.py +0 -0
  172. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0033_add_import_folder_host_path.py +0 -0
  173. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0034_add_token_scope_fields.py +0 -0
  174. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0035_drop_face_quality.py +0 -0
  175. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0036_add_token_include_attachments.py +0 -0
  176. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0037_add_user_public_url.py +0 -0
  177. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0038_add_watermark_fields.py +0 -0
  178. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0039_drop_color_histogram.py +0 -0
  179. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0040_move_text_score_to_picture.py +0 -0
  180. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0041_guest_scores.py +0 -0
  181. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0042_guest_session_cookie_token.py +0 -0
  182. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0043_pictureset_icon_color.py +0 -0
  183. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0044_add_grid_sort_indexes.py +0 -0
  184. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0045_tagger_settings.py +0 -0
  185. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0046_tag_sentinel_rename.py +0 -0
  186. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0047_add_stack_leader_grid_indexes.py +0 -0
  187. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0048_normalize_stack_positions.py +0 -0
  188. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0049_snapshots.py +0 -0
  189. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0050_reset_metadata_hash_membership.py +0 -0
  190. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0051_deleted_file_log_path_sha.py +0 -0
  191. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0052_drop_import_excluded_sentinel.py +0 -0
  192. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0053_add_face_model_pack.py +0 -0
  193. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0054_add_sidebar_docked.py +0 -0
  194. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0055_add_sidebar_width.py +0 -0
  195. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0056_add_hide_purge_snapshot_warning.py +0 -0
  196. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0057_split_caption_sidecars.py +0 -0
  197. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0058_add_tag_suggestion.py +0 -0
  198. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0059_add_tagger_run.py +0 -0
  199. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/migrations/versions/0060_tag_prediction_label_ledger.py +0 -0
  200. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/pixl_logging.py +0 -0
  201. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/__init__.py +0 -0
  202. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/_helpers.py +0 -0
  203. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/comfyui.py +0 -0
  204. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/config.py +0 -0
  205. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/guest_scores.py +0 -0
  206. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/__init__.py +0 -0
  207. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/_face_search.py +0 -0
  208. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/_helpers.py +0 -0
  209. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/_likeness_search.py +0 -0
  210. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/_listing.py +0 -0
  211. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/pictures/_search.py +0 -0
  212. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/projects.py +0 -0
  213. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/share.py +0 -0
  214. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/snapshots.py +0 -0
  215. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/tagger_runs.py +0 -0
  216. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/routes/taggers.py +0 -0
  217. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/__init__.py +0 -0
  218. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/config_service.py +0 -0
  219. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/restore_service.py +0 -0
  220. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/search_query_service.py +0 -0
  221. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/share_service.py +0 -0
  222. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/snapshot_service.py +0 -0
  223. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/stack_membership.py +0 -0
  224. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/tag_prediction_service.py +0 -0
  225. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/tag_scan_service.py +0 -0
  226. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/services/tag_suggestion_service.py +0 -0
  227. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/stacking.py +0 -0
  228. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/startup_checks.py +0 -0
  229. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tagger_plugins/__init__.py +0 -0
  230. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tagger_plugins/base.py +0 -0
  231. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tagger_plugins/clip_service.py +0 -0
  232. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tagger_plugins/joycaption.py +0 -0
  233. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tagger_plugins/registry.py +0 -0
  234. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tagger_plugins/sbert.py +0 -0
  235. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tagger_plugins/wd14.py +0 -0
  236. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/task_runner.py +0 -0
  237. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/__init__.py +0 -0
  238. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/base_task.py +0 -0
  239. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/base_task_finder.py +0 -0
  240. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/comfyui_extraction_task.py +0 -0
  241. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/description_task.py +0 -0
  242. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/ensure_gfs_snapshot_finder.py +0 -0
  243. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/ensure_gfs_snapshot_task.py +0 -0
  244. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/face_detection_task.py +0 -0
  245. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/face_extraction_task.py +0 -0
  246. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/face_model_refresh_task.py +0 -0
  247. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/image_embedding_task.py +0 -0
  248. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/likeness_parameters_task.py +0 -0
  249. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/likeness_task.py +0 -0
  250. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_comfyui_extraction_finder.py +0 -0
  251. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_description_finder.py +0 -0
  252. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_face_extraction_finder.py +0 -0
  253. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_face_model_refresh_finder.py +0 -0
  254. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_file_purge_finder.py +0 -0
  255. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_file_purge_task.py +0 -0
  256. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_image_embedding_finder.py +0 -0
  257. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_likeness_finder.py +0 -0
  258. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_likeness_parameters_finder.py +0 -0
  259. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_quality_finder.py +0 -0
  260. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_smart_score_finder.py +0 -0
  261. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_source_face_likeness_finder.py +0 -0
  262. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_tag_finder.py +0 -0
  263. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_tag_prediction_finder.py +0 -0
  264. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_text_embedding_finder.py +0 -0
  265. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/missing_text_score_finder.py +0 -0
  266. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/quality_task.py +0 -0
  267. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/reference_folder_scan_finder.py +0 -0
  268. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/reference_folder_scan_task.py +0 -0
  269. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/source_face_likeness_task.py +0 -0
  270. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/tag_prediction_backfill_task.py +0 -0
  271. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/tag_task.py +0 -0
  272. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/text_embedding_task.py +0 -0
  273. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/tasks/text_score_task.py +0 -0
  274. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/__init__.py +0 -0
  275. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/atomic_write.py +0 -0
  276. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/caption_file_utils.py +0 -0
  277. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/comfyui_utilities.py +0 -0
  278. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/face_tags.py +0 -0
  279. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/host_path_utils.py +0 -0
  280. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/image_processing/__init__.py +0 -0
  281. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/image_processing/face_utils.py +0 -0
  282. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/image_processing/image_utils.py +0 -0
  283. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/image_processing/video_utils.py +0 -0
  284. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/insightface_batched.py +0 -0
  285. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/insightface_model_utils.py +0 -0
  286. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/likeness/__init__.py +0 -0
  287. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/likeness/likeness_parameter_utils.py +0 -0
  288. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/likeness/likeness_utils.py +0 -0
  289. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/model_utils.py +0 -0
  290. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/near_neighbor.py +0 -0
  291. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/path_mapper.py +0 -0
  292. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/quality/__init__.py +0 -0
  293. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/quality/quality_utils.py +0 -0
  294. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/query/__init__.py +0 -0
  295. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/query/predicate_filter.py +0 -0
  296. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/rate_limiter.py +0 -0
  297. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/reference_folder_validator.py +0 -0
  298. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/reference_folder_watcher.py +0 -0
  299. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/request_origin.py +0 -0
  300. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/__init__.py +0 -0
  301. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/caption_utils.py +0 -0
  302. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/filter_helpers.py +0 -0
  303. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/label_ledger.py +0 -0
  304. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/path_utils.py +0 -0
  305. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/picture_stats.py +0 -0
  306. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/serialization_utils.py +0 -0
  307. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/system_utils.py +0 -0
  308. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/tag_prediction_utils.py +0 -0
  309. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/service/user_settings_utils.py +0 -0
  310. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/snapshot_compression.py +0 -0
  311. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/stack/__init__.py +0 -0
  312. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/stack/stack_utils.py +0 -0
  313. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/vram_utils.py +0 -0
  314. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/utils/watermark.py +0 -0
  315. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/work_planner.py +0 -0
  316. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash/worker_config.py +0 -0
  317. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash.egg-info/dependency_links.txt +0 -0
  318. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash.egg-info/entry_points.txt +0 -0
  319. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash.egg-info/requires.txt +0 -0
  320. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/pixlstash.egg-info/top_level.txt +0 -0
  321. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/setup.cfg +0 -0
  322. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/setup.py +0 -0
  323. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_api_coverage.py +0 -0
  324. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_authentication.py +0 -0
  325. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_backend_order_stability.py +0 -0
  326. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_batch_apply_scores.py +0 -0
  327. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_batch_character_likeness_scope.py +0 -0
  328. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_build_desktop_runtime.py +0 -0
  329. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_characters_api.py +0 -0
  330. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_clip_text_embedding_similarity.py +0 -0
  331. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_comfyui_workflow_extraction.py +0 -0
  332. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_default_device_override.py +0 -0
  333. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_docker_windows_host_paths.py +0 -0
  334. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_export_api.py +0 -0
  335. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_face_detection_extreme_aspect_ratio.py +0 -0
  336. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_face_extraction_speed.py +0 -0
  337. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_facial_features_worker.py +0 -0
  338. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_find_orphaned_files.py +0 -0
  339. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_florence.py +0 -0
  340. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_full_pipeline.py +0 -0
  341. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_gfs_snapshot_schedule.py +0 -0
  342. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_guest_scoring.py +0 -0
  343. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_image_embedding_worker.py +0 -0
  344. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_image_plugins_api.py +0 -0
  345. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_insightface_model_pack.py +0 -0
  346. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_label_ledger.py +0 -0
  347. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_likeness_and_face_search.py +0 -0
  348. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_likeness_worker.py +0 -0
  349. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_many_to_many_face_data.py +0 -0
  350. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_metadata_hash.py +0 -0
  351. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_migrations.py +0 -0
  352. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_openapi_response_schemas.py +0 -0
  353. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_picture_mutation_scope.py +0 -0
  354. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_picture_plugins.py +0 -0
  355. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_picture_sets.py +0 -0
  356. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_picture_stack_utils.py +0 -0
  357. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_pictures_stream.py +0 -0
  358. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_predicate_filter.py +0 -0
  359. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_projects_api.py +0 -0
  360. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_quality_task_shutdown.py +0 -0
  361. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_rate_limiter.py +0 -0
  362. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_read_token_security.py +0 -0
  363. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_restore.py +0 -0
  364. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_rocm_device_check.py +0 -0
  365. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_server.py +0 -0
  366. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_server_external_listener.py +0 -0
  367. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_server_simple.py +0 -0
  368. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_smart_score_consistency.py +0 -0
  369. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_snapshot_compression.py +0 -0
  370. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_snapshots.py +0 -0
  371. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_snapshots_auth.py +0 -0
  372. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_ssl_generation.py +0 -0
  373. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_stack_position_invariant.py +0 -0
  374. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_stacks_api.py +0 -0
  375. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_stacks_membership.py +0 -0
  376. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_startup_banner_encoding.py +0 -0
  377. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_stats_api.py +0 -0
  378. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_tag_prediction_backfill.py +0 -0
  379. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_tag_predictions_api.py +0 -0
  380. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_tag_suggestions_api.py +0 -0
  381. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_tag_task.py +0 -0
  382. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_tag_worker.py +0 -0
  383. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_tagger_plugin_registry.py +0 -0
  384. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_tagger_runs_api.py +0 -0
  385. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_user_settings_tagger_settings.py +0 -0
  386. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_vram_batch_budget.py +0 -0
  387. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_websocket_auth.py +0 -0
  388. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_work_planner.py +0 -0
  389. {pixlstash-1.7.0.dev2 → pixlstash-1.7.0.dev4}/tests/test_workers_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pixlstash
3
- Version: 1.7.0.dev2
3
+ Version: 1.7.0.dev4
4
4
  Summary: Self-hosted picture library with AI tagging, semantic search, and a clean web UI
5
5
  Author-email: Gaute Lindkvist <lindkvis@gmail.com>
6
6
  License-Expression: GPL-3.0-only AND MIT
@@ -110,9 +110,10 @@ PixlStash runs on your machine and serves the UI at a local (or Internet-facing)
110
110
  </a>
111
111
  </p>
112
112
 
113
- PixlStash is available as a **native desktop app for Windows and Linux**
114
- (no Python or browser tab required), as a Docker image, or as a pip package
115
- (which also runs on macOS). The desktop app ships a ready-to-run CPU runtime,
113
+ PixlStash is available as a **native desktop app for Windows, macOS (Apple
114
+ Silicon), and Linux** (no Python or browser tab required), as a Docker image, or
115
+ as a pip package that runs anywhere Python does (including Intel Macs). The
116
+ desktop app ships a ready-to-run CPU runtime,
116
117
  so it works offline out of the box, and auto-detects your hardware to offer
117
118
  optional GPU acceleration (NVIDIA CUDA, or experimental AMD ROCm), which it
118
119
  installs on demand straight from PyPI / PyTorch.
@@ -36,9 +36,10 @@ PixlStash runs on your machine and serves the UI at a local (or Internet-facing)
36
36
  </a>
37
37
  </p>
38
38
 
39
- PixlStash is available as a **native desktop app for Windows and Linux**
40
- (no Python or browser tab required), as a Docker image, or as a pip package
41
- (which also runs on macOS). The desktop app ships a ready-to-run CPU runtime,
39
+ PixlStash is available as a **native desktop app for Windows, macOS (Apple
40
+ Silicon), and Linux** (no Python or browser tab required), as a Docker image, or
41
+ as a pip package that runs anywhere Python does (including Intel Macs). The
42
+ desktop app ships a ready-to-run CPU runtime,
42
43
  so it works offline out of the box, and auto-detects your hardware to offer
43
44
  optional GPU acceleration (NVIDIA CUDA, or experimental AMD ROCm), which it
44
45
  installs on demand straight from PyPI / PyTorch.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pixlstash-frontend",
3
- "version": "1.7.0-dev.2",
3
+ "version": "1.7.0-dev.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pixlstash-frontend",
9
- "version": "1.7.0-dev.2",
9
+ "version": "1.7.0-dev.4",
10
10
  "dependencies": {
11
11
  "@mdi/font": "^7.4.47",
12
12
  "axios": "^1.16.0",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pixlstash-frontend",
3
3
  "private": true,
4
- "version": "1.7.0-dev.2",
4
+ "version": "1.7.0-dev.4",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -1,5 +1,6 @@
1
1
  from .character import Character # noqa: F401
2
2
  from .deleted_file_log import DeletedFileLog # noqa: F401
3
+ from .detection import Detection # noqa: F401
3
4
  from .face import Face # noqa: F401
4
5
  from .picture import Picture, SortMechanism # noqa: F401
5
6
  from .picture_project import PictureProjectMember # noqa: F401
@@ -0,0 +1,95 @@
1
+ import json
2
+
3
+ from sqlalchemy import Float
4
+ from sqlmodel import (
5
+ Column,
6
+ ForeignKey,
7
+ Integer,
8
+ select,
9
+ String,
10
+ SQLModel,
11
+ Field,
12
+ Relationship,
13
+ UniqueConstraint,
14
+ )
15
+ from typing import List, Optional, TYPE_CHECKING
16
+
17
+ if TYPE_CHECKING:
18
+ from .picture import Picture
19
+
20
+
21
+ class Detection(SQLModel, table=True):
22
+ """An object-detection bounding box for a picture.
23
+
24
+ Mirrors :class:`~pixlstash.db_models.face.Face`'s bbox-as-JSON convention so
25
+ the frontend overlay, scope enforcement, and copy-on-output logic can be
26
+ reused — but stores an open-vocabulary ``label`` (e.g. ``"dog"``) instead of
27
+ a face/character. Produced by a user-triggered detection pass (see
28
+ :class:`~pixlstash.tasks.detection_task.DetectionTask`), never by a
29
+ background WorkFinder.
30
+ """
31
+
32
+ id: int = Field(default=None, primary_key=True)
33
+
34
+ picture_id: int = Field(
35
+ sa_column=Column(
36
+ Integer,
37
+ ForeignKey("picture.id", ondelete="CASCADE"),
38
+ index=True,
39
+ ),
40
+ default=None,
41
+ )
42
+ frame_index: int = Field(default=0)
43
+ detection_index: int = Field(default=0)
44
+
45
+ label: Optional[str] = Field(
46
+ sa_column=Column("label", String, default=None, index=True)
47
+ )
48
+ bbox_: Optional[str] = Field(sa_column=Column("bbox", String, default=None))
49
+ # Florence grounding/OD returns no per-box confidence, so score is nullable;
50
+ # other detectors may populate it.
51
+ score: Optional[float] = Field(sa_column=Column("score", Float, default=None))
52
+ # Detector provenance, e.g. "florence2:od" or "florence2:grounding".
53
+ source: Optional[str] = Field(sa_column=Column("source", String, default=None))
54
+ # JSON escape-hatch for future per-detection data (masks, generation params).
55
+ attributes_: Optional[str] = Field(
56
+ sa_column=Column("attributes", String, default=None)
57
+ )
58
+
59
+ # Relationships
60
+ picture: Optional["Picture"] = Relationship(back_populates="detections")
61
+
62
+ __table_args__ = (UniqueConstraint("picture_id", "frame_index", "detection_index"),)
63
+
64
+ def __init__(self, *args, bbox=None, **kwargs):
65
+ super().__init__(*args, **kwargs)
66
+ if bbox is not None:
67
+ self.bbox = bbox
68
+
69
+ @property
70
+ def bbox(self) -> Optional[List[int]]:
71
+ """Return the bounding box as ``[x1, y1, x2, y2]`` pixels, or None."""
72
+ if self.bbox_:
73
+ return json.loads(self.bbox_)
74
+ return None
75
+
76
+ @bbox.setter
77
+ def bbox(self, bbox: List[int]):
78
+ """Set the bounding box from a list of integers."""
79
+ self.bbox_ = json.dumps(bbox)
80
+
81
+ @classmethod
82
+ def find(cls, session, **filters) -> List["Detection"]:
83
+ """Find detections by picture_id, frame_index, and/or detection_index.
84
+
85
+ Supports passing a list for picture_id (uses ``IN`` if so).
86
+ """
87
+ query = select(cls)
88
+ for attr, value in filters.items():
89
+ if hasattr(cls, attr):
90
+ col = getattr(cls, attr)
91
+ if attr == "picture_id" and isinstance(value, list):
92
+ query = query.where(col.in_(value))
93
+ else:
94
+ query = query.where(col == value)
95
+ return session.exec(query).all()
@@ -35,6 +35,7 @@ from pixlstash.pixl_logging import get_logger
35
35
 
36
36
  if TYPE_CHECKING:
37
37
  from .character import Character
38
+ from .detection import Detection
38
39
  from .picture_likeness import PictureLikeness
39
40
  from .project import Project
40
41
  from .reference_folder import ReferenceFolder
@@ -307,6 +308,13 @@ class Picture(SQLModel, table=True):
307
308
  "passive_deletes": True,
308
309
  },
309
310
  )
311
+ detections: List["Detection"] = Relationship(
312
+ back_populates="picture",
313
+ sa_relationship_kwargs={
314
+ "cascade": "all, delete-orphan",
315
+ "passive_deletes": True,
316
+ },
317
+ )
310
318
  tags: List["Tag"] = Relationship(
311
319
  back_populates="picture",
312
320
  sa_relationship_kwargs={
@@ -20,6 +20,12 @@ DEFAULT_SMART_SCORE_PENALIZED_TAGS = {
20
20
  "silicone breasts": 0,
21
21
  "malformed foot": 4,
22
22
  "pixelated": 2,
23
+ # IQA / signal-degradation tags (added 2026-06-20). Weights are an initial
24
+ # proposal to tune; the tagger detection thresholds come from the post-train gate.
25
+ "compression artifacts": 3,
26
+ "noise": 2,
27
+ "oversaturation": 2,
28
+ "watermark": 4,
23
29
  }
24
30
  # Tags that PixlTagger merges into a parent just before training (its tag_remap),
25
31
  # mirrored here as PixlStash's own editable copy. A picture tagged with a child here