pixlstash 1.10.0.dev2__tar.gz → 1.10.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 (663) hide show
  1. {pixlstash-1.10.0.dev2/pixlstash.egg-info → pixlstash-1.10.0.dev4}/PKG-INFO +100 -8
  2. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/README.md +98 -7
  3. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/frontend/package-lock.json +2 -2
  4. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/frontend/package.json +1 -1
  5. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/app.py +44 -13
  6. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/auth.py +22 -0
  7. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/authz/registry.py +181 -3
  8. pixlstash-1.10.0.dev4/pixlstash/cli.py +1097 -0
  9. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/picture.py +26 -0
  10. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/event_types.py +4 -0
  11. pixlstash-1.10.0.dev4/pixlstash/frontend/dist/assets/index-CdVBD2b_.js +24 -0
  12. pixlstash-1.10.0.dev2/pixlstash/frontend/dist/assets/index-CSXgkS-W.css → pixlstash-1.10.0.dev4/pixlstash/frontend/dist/assets/index-p4jSzf7N.css +1 -1
  13. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/index.html +2 -2
  14. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/hub/cli_hint.py +9 -0
  15. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/hub/db.py +28 -0
  16. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/hub/registry.py +7 -4
  17. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/hub/schema.py +196 -1
  18. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/base.py +48 -5
  19. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/built-in/blur_sharpen.py +3 -0
  20. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/built-in/brightness_contrast.py +3 -0
  21. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/built-in/colour_filter.py +3 -0
  22. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/built-in/pixelate.py +3 -0
  23. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/built-in/plugin_template.py +19 -5
  24. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/built-in/rotate.py +3 -0
  25. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/built-in/scaling.py +3 -0
  26. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/registry.py +73 -13
  27. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/service.py +87 -7
  28. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/inference/engine.py +2 -2
  29. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/inference/workflows/description.py +20 -2
  30. pixlstash-1.10.0.dev4/pixlstash/migrations/versions/0104_add_picture_orientation.py +76 -0
  31. pixlstash-1.10.0.dev4/pixlstash/plugin_check.py +452 -0
  32. pixlstash-1.10.0.dev4/pixlstash/plugin_install.py +1047 -0
  33. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/characters.py +6 -2
  34. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/comfyui.py +8 -10
  35. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/filesystem.py +29 -0
  36. pixlstash-1.10.0.dev4/pixlstash/routes/model_files.py +837 -0
  37. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/model_folders.py +117 -8
  38. pixlstash-1.10.0.dev4/pixlstash/routes/model_icons.py +212 -0
  39. pixlstash-1.10.0.dev4/pixlstash/routes/model_imports.py +671 -0
  40. pixlstash-1.10.0.dev4/pixlstash/routes/model_moves.py +1039 -0
  41. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/model_shelf.py +446 -40
  42. pixlstash-1.10.0.dev4/pixlstash/routes/model_stacks.py +437 -0
  43. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/picture_sets.py +21 -10
  44. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_crud.py +237 -0
  45. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_listing.py +21 -1
  46. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_misc.py +6 -2
  47. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_search.py +4 -0
  48. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_thumbnails.py +11 -2
  49. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/taggers.py +50 -22
  50. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/scoring/smart_score.py +54 -20
  51. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/server.py +85 -0
  52. pixlstash-1.10.0.dev4/pixlstash/services/builtin_caches.py +383 -0
  53. pixlstash-1.10.0.dev4/pixlstash/services/builtin_models.py +880 -0
  54. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/dedup_tier_service.py +19 -8
  55. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/library_backup_service.py +167 -12
  56. pixlstash-1.10.0.dev4/pixlstash/services/library_restore_service.py +826 -0
  57. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/managed_model_store.py +84 -0
  58. pixlstash-1.10.0.dev4/pixlstash/services/model_features.py +274 -0
  59. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/model_folder_scanner.py +118 -18
  60. pixlstash-1.10.0.dev4/pixlstash/services/model_icons.py +173 -0
  61. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/model_mover.py +293 -6
  62. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/model_shelf_service.py +273 -17
  63. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/operation_log_service.py +350 -5
  64. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/plugin_service.py +13 -10
  65. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/run_importer.py +165 -10
  66. pixlstash-1.10.0.dev4/pixlstash/services/stack_detector.py +786 -0
  67. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tagger_plugins/base.py +34 -0
  68. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tagger_plugins/florence2.py +9 -0
  69. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tagger_plugins/joycaption.py +16 -0
  70. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tagger_plugins/pixlstash_tagger.py +6 -0
  71. pixlstash-1.10.0.dev4/pixlstash/tagger_plugins/plugin_template.py +237 -0
  72. pixlstash-1.10.0.dev4/pixlstash/tagger_plugins/registry.py +493 -0
  73. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tagger_plugins/wd14.py +10 -0
  74. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/task_runner.py +104 -2
  75. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/__init__.py +4 -0
  76. pixlstash-1.10.0.dev4/pixlstash/tasks/base_task.py +169 -0
  77. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/checkpoint_hash_task.py +28 -1
  78. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/description_task.py +13 -0
  79. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/face_extraction_task.py +14 -3
  80. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/image_embedding_task.py +22 -7
  81. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_checkpoint_hash_finder.py +28 -3
  82. pixlstash-1.10.0.dev4/pixlstash/tasks/missing_orientation_finder.py +30 -0
  83. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_thumbnail_finder.py +5 -2
  84. pixlstash-1.10.0.dev4/pixlstash/tasks/orientation_task.py +111 -0
  85. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/smart_score_task.py +11 -9
  86. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/task_type.py +1 -0
  87. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/thumbnail_generation_task.py +52 -4
  88. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/adapter_header.py +118 -16
  89. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/aitoolkit_run.py +31 -0
  90. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/field_allowlist.py +1 -1
  91. pixlstash-1.10.0.dev4/pixlstash/utils/host_open.py +79 -0
  92. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/image_processing/image_utils.py +44 -9
  93. pixlstash-1.10.0.dev4/pixlstash/utils/image_processing/orientation.py +451 -0
  94. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/insightface_model_utils.py +158 -11
  95. pixlstash-1.10.0.dev4/pixlstash/utils/known_base_models.py +453 -0
  96. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/model_utils.py +78 -5
  97. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/query/predicate_filter.py +21 -0
  98. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/picture_stats.py +24 -6
  99. pixlstash-1.10.0.dev4/pixlstash/utils/system_utils.py +475 -0
  100. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/vram_utils.py +48 -0
  101. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/vault.py +18 -2
  102. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/work_planner.py +6 -0
  103. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/ws/broadcaster.py +14 -0
  104. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4/pixlstash.egg-info}/PKG-INFO +100 -8
  105. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash.egg-info/SOURCES.txt +32 -2
  106. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash.egg-info/requires.txt +1 -0
  107. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pyproject.toml +6 -1
  108. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_adapter_header.py +5 -5
  109. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_aitoolkit_run.py +40 -0
  110. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_architecture_guardrails.py +266 -0
  111. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_authentication.py +20 -30
  112. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_authz_host_capability_16_3.py +387 -31
  113. pixlstash-1.10.0.dev4/tests/test_builtin_models.py +1461 -0
  114. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_checkpoint_hash_finder.py +61 -0
  115. pixlstash-1.10.0.dev4/tests/test_cli_documentation.py +155 -0
  116. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_dedup_tiers_api.py +4 -4
  117. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_docker_windows_host_paths.py +2 -2
  118. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_hub_engine.py +95 -0
  119. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_hub_model_shelf_schema.py +219 -0
  120. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_identity_storage_guardrail.py +70 -0
  121. pixlstash-1.10.0.dev4/tests/test_inline_rotate.py +942 -0
  122. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_insightface_model_pack.py +45 -6
  123. pixlstash-1.10.0.dev4/tests/test_insightface_relocation.py +548 -0
  124. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_ip_locality_fail_closed.py +7 -6
  125. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_justified_thumbnails.py +76 -0
  126. pixlstash-1.10.0.dev4/tests/test_known_base_models.py +109 -0
  127. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_libraries_routes.py +35 -0
  128. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_library_backup.py +2 -2
  129. pixlstash-1.10.0.dev4/tests/test_library_restore_cli.py +546 -0
  130. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_metadata_hash.py +16 -17
  131. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_metadata_hash_batching.py +16 -17
  132. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_model_file_classification.py +139 -5
  133. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_model_folder_scanner.py +1 -1
  134. pixlstash-1.10.0.dev4/tests/test_model_icons.py +139 -0
  135. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_model_move.py +262 -0
  136. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_model_run_import.py +225 -1
  137. pixlstash-1.10.0.dev4/tests/test_model_shelf_api.py +5931 -0
  138. pixlstash-1.10.0.dev4/tests/test_orientation.py +608 -0
  139. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_path_containment.py +83 -0
  140. pixlstash-1.10.0.dev4/tests/test_picture_plugins.py +695 -0
  141. pixlstash-1.10.0.dev4/tests/test_plugin_install.py +1493 -0
  142. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_predicate_filter.py +64 -0
  143. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_read_token_security.py +47 -8
  144. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_restore.py +35 -73
  145. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_scrapheap_retention.py +3 -9
  146. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_server_simple.py +5 -12
  147. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_smart_score_invalidation.py +48 -1
  148. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_snapshots.py +11 -12
  149. pixlstash-1.10.0.dev4/tests/test_stack_detection.py +1203 -0
  150. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_stats_api.py +54 -0
  151. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_tagger_plugin_registry.py +6 -0
  152. pixlstash-1.10.0.dev4/tests/test_tagger_user_plugins.py +320 -0
  153. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_thumbnail_cache_headers.py +47 -0
  154. pixlstash-1.10.0.dev4/tests/test_vram_oom_retry.py +309 -0
  155. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_workers_api.py +5 -0
  156. pixlstash-1.10.0.dev2/pixlstash/cli.py +0 -344
  157. pixlstash-1.10.0.dev2/pixlstash/frontend/dist/assets/index-CTZjJTrd.js +0 -21
  158. pixlstash-1.10.0.dev2/pixlstash/routes/model_imports.py +0 -348
  159. pixlstash-1.10.0.dev2/pixlstash/routes/model_moves.py +0 -631
  160. pixlstash-1.10.0.dev2/pixlstash/tagger_plugins/registry.py +0 -271
  161. pixlstash-1.10.0.dev2/pixlstash/tasks/base_task.py +0 -103
  162. pixlstash-1.10.0.dev2/pixlstash/utils/system_utils.py +0 -249
  163. pixlstash-1.10.0.dev2/tests/test_model_shelf_api.py +0 -2916
  164. pixlstash-1.10.0.dev2/tests/test_picture_plugins.py +0 -328
  165. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/LICENSE +0 -0
  166. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/MANIFEST.in +0 -0
  167. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/frontend/LICENSE +0 -0
  168. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/LICENSE +0 -0
  169. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/__init__.py +0 -0
  170. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/alembic.ini +0 -0
  171. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/authz/__init__.py +0 -0
  172. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/authz/gate.py +0 -0
  173. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/authz/membership.py +0 -0
  174. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/authz/policy.py +0 -0
  175. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/anchors/builtin_bad.npy +0 -0
  176. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/anchors/builtin_good.npy +0 -0
  177. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/anchors/clipiqa_bad.npy +0 -0
  178. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/anchors/clipiqa_good.npy +0 -0
  179. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/comfyui-workflows/built-in/Flux2-Klein-Image-Edit.json +0 -0
  180. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/comfyui-workflows/built-in/Flux2-Klein-t2i.json +0 -0
  181. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/comfyui-workflows/built-in/Upscale-2x-RealESRGAN.json +0 -0
  182. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/scalar-assets/ScreenshotToken.jpg +0 -0
  183. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/scalar-assets/ScreenshotTokens.jpg +0 -0
  184. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/scalar-assets/ScreenshotsUserSettings.jpg +0 -0
  185. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/scalar-assets/WhereIsUserSettings.jpg +0 -0
  186. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/data/scalar-assets/logo.png +0 -0
  187. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/database.py +0 -0
  188. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/__init__.py +0 -0
  189. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/adapter_attachment.py +0 -0
  190. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/character.py +0 -0
  191. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/dedup.py +0 -0
  192. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/deleted_file_log.py +0 -0
  193. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/detection.py +0 -0
  194. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/entity_project.py +0 -0
  195. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/face.py +0 -0
  196. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/guest_score.py +0 -0
  197. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/guest_session.py +0 -0
  198. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/import_folder.py +0 -0
  199. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/library_settings.py +0 -0
  200. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/metadata.py +0 -0
  201. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/mixed_stack.py +0 -0
  202. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/operation.py +0 -0
  203. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/pending_score_invalidation.py +0 -0
  204. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/picture_likeness.py +0 -0
  205. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/picture_project.py +0 -0
  206. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/picture_set.py +0 -0
  207. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/picture_stack.py +0 -0
  208. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/project.py +0 -0
  209. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/quality.py +0 -0
  210. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/reference_folder.py +0 -0
  211. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/review.py +0 -0
  212. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/snapshot.py +0 -0
  213. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/tag.py +0 -0
  214. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/tag_health.py +0 -0
  215. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/tag_prediction.py +0 -0
  216. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/tag_suggestion.py +0 -0
  217. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/tagger_run.py +0 -0
  218. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/user.py +0 -0
  219. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/db_models/user_token.py +0 -0
  220. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/Empty.png +0 -0
  221. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/EmptyTrash.png +0 -0
  222. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/Logo.png +0 -0
  223. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/Watermark.png +0 -0
  224. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/assets/Tiny5-Regular-WaYIHWdr.ttf +0 -0
  225. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
  226. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
  227. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
  228. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
  229. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/favicon.ico +0 -0
  230. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/frontend/dist/vite.svg +0 -0
  231. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/hub/__init__.py +0 -0
  232. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/hub/bootstrap.py +0 -0
  233. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/hub/engine.py +0 -0
  234. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_loading_dataset_prepper.py +0 -0
  235. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/image_plugins/__init__.py +0 -0
  236. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/inference/__init__.py +0 -0
  237. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/inference/model_lifecycle.py +0 -0
  238. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/inference/vram_budget.py +0 -0
  239. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/inference/workflows/__init__.py +0 -0
  240. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/inference/workflows/clip_embedding.py +0 -0
  241. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/inference/workflows/face_embedding.py +0 -0
  242. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/inference/workflows/tagging.py +0 -0
  243. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/inference/workflows/text_embedding.py +0 -0
  244. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/listeners.py +0 -0
  245. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/maintenance.py +0 -0
  246. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/middleware/library_admission.py +0 -0
  247. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/env.py +0 -0
  248. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/script.py.mako +0 -0
  249. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0001_baseline.py +0 -0
  250. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0002_add_text_score.py +0 -0
  251. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0003_add_original_file_name.py +0 -0
  252. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0004_add_comfyui_fields.py +0 -0
  253. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0005_add_projects.py +0 -0
  254. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0006_add_attachment_url.py +0 -0
  255. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0007_add_picture_project_id.py +0 -0
  256. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0008_add_compact_mode.py +0 -0
  257. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0009_add_picture_project_membership.py +0 -0
  258. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0010_project_name_uniqueness.py +0 -0
  259. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0011_pictureset_name_uniqueness.py +0 -0
  260. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0012_character_name_uniqueness.py +0 -0
  261. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0013_tag_prediction.py +0 -0
  262. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0014_tag_prediction_composite_index.py +0 -0
  263. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0015_tag_prediction_model_version_rename.py +0 -0
  264. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0016_tag_prediction_confirm_applied.py +0 -0
  265. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0017_anomaly_tag_uncertainty.py +0 -0
  266. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0018_anomaly_tag_uncertainty_disagreement.py +0 -0
  267. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0019_pending_character_id.py +0 -0
  268. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0020_source_picture_id.py +0 -0
  269. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0021_tagger_enabled_flags.py +0 -0
  270. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0022_add_check_for_updates.py +0 -0
  271. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0023_add_show_keyboard_hint.py +0 -0
  272. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0024_add_deleted_file_log.py +0 -0
  273. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0025_add_reference_folders.py +0 -0
  274. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0026_add_caption_file_and_sync_captions.py +0 -0
  275. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0027_add_caption_file_mtime.py +0 -0
  276. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0028_add_smart_score.py +0 -0
  277. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0029_add_import_excluded_to_picture.py +0 -0
  278. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0030_add_import_folders.py +0 -0
  279. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0031_migrate_watch_folders_to_import_folder.py +0 -0
  280. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0032_add_reference_folder_host_path.py +0 -0
  281. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0033_add_import_folder_host_path.py +0 -0
  282. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0034_add_token_scope_fields.py +0 -0
  283. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0035_drop_face_quality.py +0 -0
  284. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0036_add_token_include_attachments.py +0 -0
  285. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0037_add_user_public_url.py +0 -0
  286. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0038_add_watermark_fields.py +0 -0
  287. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0039_drop_color_histogram.py +0 -0
  288. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0040_move_text_score_to_picture.py +0 -0
  289. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0041_guest_scores.py +0 -0
  290. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0042_guest_session_cookie_token.py +0 -0
  291. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0043_pictureset_icon_color.py +0 -0
  292. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0044_add_grid_sort_indexes.py +0 -0
  293. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0045_tagger_settings.py +0 -0
  294. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0046_tag_sentinel_rename.py +0 -0
  295. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0047_add_stack_leader_grid_indexes.py +0 -0
  296. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0048_normalize_stack_positions.py +0 -0
  297. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0049_snapshots.py +0 -0
  298. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0050_reset_metadata_hash_membership.py +0 -0
  299. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0051_deleted_file_log_path_sha.py +0 -0
  300. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0052_drop_import_excluded_sentinel.py +0 -0
  301. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0053_add_face_model_pack.py +0 -0
  302. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0054_add_sidebar_docked.py +0 -0
  303. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0055_add_sidebar_width.py +0 -0
  304. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0056_add_hide_purge_snapshot_warning.py +0 -0
  305. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0057_split_caption_sidecars.py +0 -0
  306. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0058_add_tag_suggestion.py +0 -0
  307. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0059_add_tagger_run.py +0 -0
  308. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0060_tag_prediction_label_ledger.py +0 -0
  309. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0061_add_detection.py +0 -0
  310. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0062_recompute_smart_score_calibrated_anomaly.py +0 -0
  311. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0063_rename_pixelated_tag_to_blocky.py +0 -0
  312. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0064_add_sidebar_pinned.py +0 -0
  313. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0065_add_review_sessions.py +0 -0
  314. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0066_add_tag_health.py +0 -0
  315. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0067_add_tag_health_precision_adj.py +0 -0
  316. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0068_add_picture_split.py +0 -0
  317. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0069_add_tag_eval_slice.py +0 -0
  318. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0070_add_tag_health_eval_candidate_n_pos.py +0 -0
  319. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0071_remove_tag_review_scoring_subsystem.py +0 -0
  320. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0072_add_review_receipt_snapshot_and_suggestion_prior_decision.py +0 -0
  321. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0073_add_pictureset_locked.py +0 -0
  322. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0074_recompute_tag_health_exclude_human_decisions.py +0 -0
  323. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0075_add_tag_health_ground_truth.py +0 -0
  324. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0076_recompute_smart_score_after_stale_tag_edits.py +0 -0
  325. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0077_add_deleted_file_log_file_removed.py +0 -0
  326. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0078_add_reference_folder_pending_reimport.py +0 -0
  327. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0079_add_picture_deleted_at.py +0 -0
  328. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0080_add_thumbnail_dimensions.py +0 -0
  329. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0082_add_thumbnail_size_level.py +0 -0
  330. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0083_recompute_smart_score_unapplied_anomaly_predictions.py +0 -0
  331. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0084_recompute_smart_score_rebalanced_weights.py +0 -0
  332. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0085_recompute_smart_score_restored_builtin_anchors.py +0 -0
  333. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0086_add_operation_log.py +0 -0
  334. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0086_reissue_api_tokens.py +0 -0
  335. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0087_add_entity_project_membership.py +0 -0
  336. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0088_add_dedup_tier_tables.py +0 -0
  337. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0089_add_dedupverdict_reopen_batch_id.py +0 -0
  338. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0090_add_usertoken_public_id.py +0 -0
  339. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0091_add_mixed_stack_cohesion_and_dismissal.py +0 -0
  340. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0092_add_stackcohesion_nearest_edges.py +0 -0
  341. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0093_invalidate_stackcohesion_inputs.py +0 -0
  342. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0094_add_telemetry_consent.py +0 -0
  343. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0095_add_finder_partial_indexes.py +0 -0
  344. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0096_add_picture_is_video.py +0 -0
  345. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0097_add_usertoken_library_uuid.py +0 -0
  346. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0098_add_library_settings.py +0 -0
  347. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0099_guest_tables_reference_token_public_id.py +0 -0
  348. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0100_add_pending_score_invalidation.py +0 -0
  349. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0101_add_settings_fingerprint.py +0 -0
  350. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0102_add_snapshot_identity_scrubbed_at.py +0 -0
  351. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/migrations/versions/0103_add_adapter_attachment.py +0 -0
  352. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/openapi_custom.py +0 -0
  353. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/pixl_logging.py +0 -0
  354. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/route_inventory.py +0 -0
  355. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/__init__.py +0 -0
  356. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/_helpers.py +0 -0
  357. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/characters_faces.py +0 -0
  358. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/config.py +0 -0
  359. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/dedup.py +0 -0
  360. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/guest_scores.py +0 -0
  361. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/import_folders.py +0 -0
  362. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/libraries.py +0 -0
  363. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/operations.py +0 -0
  364. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/__init__.py +0 -0
  365. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_anomaly.py +0 -0
  366. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_character_likeness.py +0 -0
  367. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_export.py +0 -0
  368. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_face_search.py +0 -0
  369. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_faces.py +0 -0
  370. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_helpers.py +0 -0
  371. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_import.py +0 -0
  372. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_likeness_search.py +0 -0
  373. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/pictures/_serving.py +0 -0
  374. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/projects.py +0 -0
  375. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/reference_folders.py +0 -0
  376. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/reviews.py +0 -0
  377. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/share.py +0 -0
  378. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/snapshots.py +0 -0
  379. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/stacks.py +0 -0
  380. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/tag_health.py +0 -0
  381. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/tag_predictions.py +0 -0
  382. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/tag_suggestions.py +0 -0
  383. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/tagger_runs.py +0 -0
  384. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/tags.py +0 -0
  385. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/telemetry.py +0 -0
  386. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/routes/test_hooks.py +0 -0
  387. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/scoring/__init__.py +0 -0
  388. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/scoring/character_likeness.py +0 -0
  389. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/__init__.py +0 -0
  390. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/comfyui_recipe_service.py +0 -0
  391. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/comfyui_service.py +0 -0
  392. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/config_service.py +0 -0
  393. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/dedup_sweep_service.py +0 -0
  394. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/dedup_verdict_service.py +0 -0
  395. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/import_dedup_service.py +0 -0
  396. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/impossible_tag_clear_service.py +0 -0
  397. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/keep_cover_only_service.py +0 -0
  398. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/library_generation_coordinator.py +0 -0
  399. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/library_settings_service.py +0 -0
  400. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/library_switch_service.py +0 -0
  401. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/mixed_stack_service.py +0 -0
  402. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/picture_service.py +0 -0
  403. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/portable_identity.py +0 -0
  404. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/project_membership_service.py +0 -0
  405. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/restore/__init__.py +0 -0
  406. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/restore/_models.py +0 -0
  407. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/restore/full_restore.py +0 -0
  408. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/restore/preview.py +0 -0
  409. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/restore/resource_restore.py +0 -0
  410. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/restore/schema_upgrade.py +0 -0
  411. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/review_service.py +0 -0
  412. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/scrapheap_service.py +0 -0
  413. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/search_query_service.py +0 -0
  414. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/set_lock_service.py +0 -0
  415. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/share_service.py +0 -0
  416. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/snapshot_service.py +0 -0
  417. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/stack_membership.py +0 -0
  418. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/tag_health_service.py +0 -0
  419. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/tag_prediction_service.py +0 -0
  420. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/tag_scan_service.py +0 -0
  421. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/tag_suggestion_service.py +0 -0
  422. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/services/tagger_run_service.py +0 -0
  423. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/ssl_setup.py +0 -0
  424. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/stacking.py +0 -0
  425. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/startup_checks.py +0 -0
  426. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tagger_plugins/__init__.py +0 -0
  427. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tagger_plugins/clip_service.py +0 -0
  428. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tagger_plugins/sbert.py +0 -0
  429. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/base_task_finder.py +0 -0
  430. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/comfyui_extraction_task.py +0 -0
  431. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/dedup_scan_finder.py +0 -0
  432. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/dedup_scan_task.py +0 -0
  433. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/detection_task.py +0 -0
  434. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/ensure_gfs_snapshot_finder.py +0 -0
  435. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/ensure_gfs_snapshot_task.py +0 -0
  436. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/face_detection_task.py +0 -0
  437. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/face_model_refresh_task.py +0 -0
  438. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/likeness_parameters_task.py +0 -0
  439. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/likeness_task.py +0 -0
  440. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_comfyui_extraction_finder.py +0 -0
  441. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_description_finder.py +0 -0
  442. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_face_extraction_finder.py +0 -0
  443. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_face_model_refresh_finder.py +0 -0
  444. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_file_purge_finder.py +0 -0
  445. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_file_purge_task.py +0 -0
  446. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_image_embedding_finder.py +0 -0
  447. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_likeness_finder.py +0 -0
  448. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_likeness_parameters_finder.py +0 -0
  449. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_pixel_sha_finder.py +0 -0
  450. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_quality_finder.py +0 -0
  451. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_smart_score_finder.py +0 -0
  452. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_snapshot_identity_scrub_finder.py +0 -0
  453. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_source_face_likeness_finder.py +0 -0
  454. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_stack_cohesion_finder.py +0 -0
  455. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_tag_finder.py +0 -0
  456. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_tag_prediction_finder.py +0 -0
  457. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_text_embedding_finder.py +0 -0
  458. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_text_score_finder.py +0 -0
  459. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/missing_watch_folder_import_finder.py +0 -0
  460. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/model_folder_scan_task.py +0 -0
  461. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/pending_score_invalidation_finder.py +0 -0
  462. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/pending_score_invalidation_task.py +0 -0
  463. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/picture_import_task.py +0 -0
  464. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/pixel_sha_task.py +0 -0
  465. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/quality_task.py +0 -0
  466. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/reference_folder_scan_finder.py +0 -0
  467. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/reference_folder_scan_task.py +0 -0
  468. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/scrapheap_retention_purge_finder.py +0 -0
  469. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/scrapheap_retention_purge_task.py +0 -0
  470. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/snapshot_identity_scrub_task.py +0 -0
  471. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/source_face_likeness_task.py +0 -0
  472. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/stack_cohesion_task.py +0 -0
  473. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/tag_health_auto_rebuild_finder.py +0 -0
  474. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/tag_health_auto_rebuild_task.py +0 -0
  475. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/tag_health_rebuild_task.py +0 -0
  476. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/tag_prediction_backfill_task.py +0 -0
  477. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/tag_task.py +0 -0
  478. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/text_embedding_task.py +0 -0
  479. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/text_score_task.py +0 -0
  480. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/tasks/watch_folder_import_task.py +0 -0
  481. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/telemetry/__init__.py +0 -0
  482. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/telemetry/install_id.py +0 -0
  483. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/telemetry/sender.py +0 -0
  484. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/trusted_sqlite.py +0 -0
  485. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/__init__.py +0 -0
  486. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/atomic_write.py +0 -0
  487. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/caption_file_utils.py +0 -0
  488. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/comfyui_utilities.py +0 -0
  489. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/face_tags.py +0 -0
  490. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/host_path_utils.py +0 -0
  491. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/http_cache.py +0 -0
  492. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/image_processing/__init__.py +0 -0
  493. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/image_processing/face_utils.py +0 -0
  494. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/image_processing/video_utils.py +0 -0
  495. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/insightface_batched.py +0 -0
  496. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/likeness/__init__.py +0 -0
  497. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/likeness/likeness_parameter_utils.py +0 -0
  498. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/likeness/likeness_utils.py +0 -0
  499. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/near_neighbor.py +0 -0
  500. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/path_mapper.py +0 -0
  501. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/path_utils.py +0 -0
  502. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/quality/__init__.py +0 -0
  503. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/quality/anomaly_penalty.py +0 -0
  504. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/quality/quality_utils.py +0 -0
  505. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/quality/smart_score_utils.py +0 -0
  506. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/query/__init__.py +0 -0
  507. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/rate_limiter.py +0 -0
  508. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/reference_folder_validator.py +0 -0
  509. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/reference_folder_watcher.py +0 -0
  510. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/request_origin.py +0 -0
  511. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/serialization_utils.py +0 -0
  512. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/__init__.py +0 -0
  513. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/anomaly_thresholds.py +0 -0
  514. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/caption_utils.py +0 -0
  515. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/export_utils.py +0 -0
  516. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/filter_helpers.py +0 -0
  517. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/label_ledger.py +0 -0
  518. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/person_tags.py +0 -0
  519. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/scope_table.py +0 -0
  520. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/smart_score_invalidation.py +0 -0
  521. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/tag_prediction_utils.py +0 -0
  522. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/service/user_settings_utils.py +0 -0
  523. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/snapshot_compression.py +0 -0
  524. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/sql_chunking.py +0 -0
  525. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/stack/__init__.py +0 -0
  526. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/stack/stack_utils.py +0 -0
  527. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/unprocessable_image_registry.py +0 -0
  528. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/utils/watermark.py +0 -0
  529. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/worker_config.py +0 -0
  530. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash/ws/__init__.py +0 -0
  531. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash.egg-info/dependency_links.txt +0 -0
  532. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash.egg-info/entry_points.txt +0 -0
  533. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/pixlstash.egg-info/top_level.txt +0 -0
  534. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/setup.cfg +0 -0
  535. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/setup.py +0 -0
  536. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_adapter_attachment.py +0 -0
  537. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_anomaly_penalty.py +0 -0
  538. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_anomaly_region_scope.py +0 -0
  539. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_anomaly_thresholds_cache.py +0 -0
  540. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_api_coverage.py +0 -0
  541. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_async_import_staging.py +0 -0
  542. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_auth_read_path.py +0 -0
  543. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_authz_gate_step3.py +0 -0
  544. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_authz_gate_step4.py +0 -0
  545. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_authz_library_pin.py +0 -0
  546. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_backend_order_stability.py +0 -0
  547. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_batch_apply_scores.py +0 -0
  548. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_batch_character_likeness_scope.py +0 -0
  549. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_build_desktop_runtime.py +0 -0
  550. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_character_face_assignment.py +0 -0
  551. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_characters_api.py +0 -0
  552. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_ci_shards.py +0 -0
  553. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_clip_text_embedding_similarity.py +0 -0
  554. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_comfyui_api_prompt_extraction.py +0 -0
  555. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_comfyui_pixlstash_saver.py +0 -0
  556. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_comfyui_recipe_preflight.py +0 -0
  557. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_comfyui_recipe_route.py +0 -0
  558. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_comfyui_stack_filter.py +0 -0
  559. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_comfyui_submit_prompt.py +0 -0
  560. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_comfyui_workflow_extraction.py +0 -0
  561. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_database_engine_config.py +0 -0
  562. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_dedup_mixed_stacks.py +0 -0
  563. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_dedup_sweep_api.py +0 -0
  564. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_dedup_sweep_service.py +0 -0
  565. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_dedup_tier_service.py +0 -0
  566. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_dedup_verdict_service.py +0 -0
  567. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_default_device_override.py +0 -0
  568. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_detection_florence.py +0 -0
  569. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_detection_model.py +0 -0
  570. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_detections_scope.py +0 -0
  571. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_except_hygiene_guardrail.py +0 -0
  572. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_export_api.py +0 -0
  573. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_face_detection_extreme_aspect_ratio.py +0 -0
  574. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_face_extraction_speed.py +0 -0
  575. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_face_score_aggregation.py +0 -0
  576. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_facial_features_worker.py +0 -0
  577. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_find_orphaned_files.py +0 -0
  578. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_finder_query_cost.py +0 -0
  579. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_florence.py +0 -0
  580. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_florence_model_variant.py +0 -0
  581. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_full_pipeline.py +0 -0
  582. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_gfs_snapshot_schedule.py +0 -0
  583. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_guest_scoring.py +0 -0
  584. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_hub_bootstrap.py +0 -0
  585. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_hub_registry.py +0 -0
  586. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_image_embedding_worker.py +0 -0
  587. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_image_plugins_api.py +0 -0
  588. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_import_scrapheap_match.py +0 -0
  589. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_impossible_clear.py +0 -0
  590. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_impossible_clear_authz.py +0 -0
  591. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_impossible_filter.py +0 -0
  592. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_install_type_buckets.py +0 -0
  593. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_invalid_image_endless_retry.py +0 -0
  594. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_keep_cover_only.py +0 -0
  595. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_label_ledger.py +0 -0
  596. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_library_generation_coordinator.py +0 -0
  597. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_library_settings.py +0 -0
  598. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_library_switch.py +0 -0
  599. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_likeness_and_face_search.py +0 -0
  600. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_likeness_worker.py +0 -0
  601. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_managed_model_store.py +0 -0
  602. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_many_to_many_face_data.py +0 -0
  603. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_migrations.py +0 -0
  604. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_model_shelf_fixtures.py +0 -0
  605. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_model_shelf_library_fixture.py +0 -0
  606. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_model_shelf_scan_invariants.py +0 -0
  607. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_model_unload_race.py +0 -0
  608. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_near_neighbor.py +0 -0
  609. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_openapi_response_schemas.py +0 -0
  610. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_operation_log.py +0 -0
  611. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_pending_score_invalidation.py +0 -0
  612. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_person_tags.py +0 -0
  613. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_picture_is_video.py +0 -0
  614. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_picture_mutation_scope.py +0 -0
  615. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_picture_set_locking.py +0 -0
  616. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_picture_sets.py +0 -0
  617. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_picture_sets_query_cost.py +0 -0
  618. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_picture_stack_utils.py +0 -0
  619. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_pictures_stream.py +0 -0
  620. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_project_membership_service.py +0 -0
  621. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_projects_api.py +0 -0
  622. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_quality_task_shutdown.py +0 -0
  623. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_rate_limiter.py +0 -0
  624. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_reference_folder_listing_count_parity.py +0 -0
  625. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_reference_folder_sidecars.py +0 -0
  626. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_repair_copied_face_rows.py +0 -0
  627. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_reviews_api.py +0 -0
  628. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_rocm_device_check.py +0 -0
  629. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_scope_table.py +0 -0
  630. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_score_agreement_stats.py +0 -0
  631. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_security_supported_versions.py +0 -0
  632. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_server.py +0 -0
  633. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_server_external_listener.py +0 -0
  634. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_share_link_library_pin.py +0 -0
  635. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_sidebar_counts_query_cost.py +0 -0
  636. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_smart_score_consistency.py +0 -0
  637. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_snapshot_compression.py +0 -0
  638. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_snapshots_auth.py +0 -0
  639. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_ssl_generation.py +0 -0
  640. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_stack_leader_scope.py +0 -0
  641. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_stack_position_invariant.py +0 -0
  642. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_stack_state_filter.py +0 -0
  643. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_stacks_api.py +0 -0
  644. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_stacks_membership.py +0 -0
  645. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_startup_banner_encoding.py +0 -0
  646. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_tag_health_api.py +0 -0
  647. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_tag_prediction_backfill.py +0 -0
  648. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_tag_prediction_scope.py +0 -0
  649. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_tag_predictions_api.py +0 -0
  650. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_tag_suggestions_api.py +0 -0
  651. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_tag_task.py +0 -0
  652. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_tag_worker.py +0 -0
  653. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_tagger_runs_api.py +0 -0
  654. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_telemetry_install_id.py +0 -0
  655. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_telemetry_install_id_authz.py +0 -0
  656. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_telemetry_sender.py +0 -0
  657. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_token_identity.py +0 -0
  658. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_user_settings_tagger_settings.py +0 -0
  659. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_vram_batch_budget.py +0 -0
  660. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_watch_folder_worker.py +0 -0
  661. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_websocket_auth.py +0 -0
  662. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_work_planner.py +0 -0
  663. {pixlstash-1.10.0.dev2 → pixlstash-1.10.0.dev4}/tests/test_ws_broadcaster.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pixlstash
3
- Version: 1.10.0.dev2
3
+ Version: 1.10.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
@@ -31,6 +31,7 @@ Requires-Dist: pillow>=12.3.0
31
31
  Requires-Dist: opencv-python>=4.13.0.92
32
32
  Requires-Dist: scipy>=1.17.1
33
33
  Requires-Dist: platformdirs>=4.9.4
34
+ Requires-Dist: send2trash>=2.1.0
34
35
  Requires-Dist: tomli>=2.4.0
35
36
  Requires-Dist: colorlog>=6.10.1
36
37
  Requires-Dist: python-multipart>=0.0.22
@@ -146,6 +147,8 @@ the app's own user-data directory.
146
147
  > | **Windows** | `%LOCALAPPDATA%\pixlstash\downloaded_models\` |
147
148
  >
148
149
  > An internet connection is required the first time the server starts. Subsequent starts use the cached models.
150
+ >
151
+ > **Moving them somewhere else:** open **Model folders** on the model shelf and use **Move** on PixlStash's own folder. Every file in it is copied, verified and removed from the old location, and the new location is remembered — so nothing is downloaded again. Set `PIXLSTASH_BUILTIN_MODEL_DIR` instead if you want the folder somewhere else without moving what is already in it (a mounted model volume, typically).
149
152
 
150
153
  If you need to use a custom config path:
151
154
 
@@ -182,6 +185,8 @@ pixlstash-cli libraries rename "Existing library" "Better name"
182
185
  pixlstash-cli libraries relocate "Existing library" /new/path
183
186
  pixlstash-cli libraries detach "Existing library"
184
187
  pixlstash-cli libraries backup "Existing library" /path/to/backups/
188
+ pixlstash-cli libraries backup "Existing library" /path/to/backups/monday.tar.zst
189
+ pixlstash-cli libraries restore /path/to/backups/monday.tar.zst /path/to/new-library
185
190
  ```
186
191
 
187
192
  | Command | What it does |
@@ -193,18 +198,33 @@ pixlstash-cli libraries backup "Existing library" /path/to/backups/
193
198
  | `relocate` | Points an existing registration at a new path, keeping its identity and share links. |
194
199
  | `detach` | Forgets a library. **No files are removed and nothing inside the folder changes.** |
195
200
  | `backup` | Writes the library and the hub to a single archive. |
201
+ | `restore` | Unpacks an archive into a **new** folder and makes it the library that opens. |
196
202
 
197
203
  Notes worth knowing before you need them:
198
204
 
199
205
  - `detach` refuses the **active** library. Switch to another one first.
200
206
  - Reattaching the same folder revives its original registration, including its
201
207
  share links, because a library carries a fingerprint of its own identity.
208
+ - A backup is a **zstd-compressed tar**, named `.tar.zst` — not `.tar.gz`.
209
+ `--no-compress` writes a plain `.tar` instead. Given a folder, `backup`
210
+ invents a dated name with the right ending; given a filename, it adds the
211
+ right ending if you left it off. `restore` recognises an archive by its
212
+ contents, so a renamed file still works.
202
213
  - A backup contains `hub.db`, and therefore your login and token secrets.
203
214
  PixlStash writes it owner-readable and refuses to overwrite an existing file.
204
215
  - A backup covers the library folder. Pictures kept in **reference folders** live
205
216
  outside it and are *not* included, so back those up separately.
206
217
  - Backing up finishes any outstanding one-time snapshot cleanup first, so the
207
218
  archive never carries credentials from before your upgrade.
219
+ - `restore` needs PixlStash stopped, and names a folder that is empty or does
220
+ not exist yet — it never writes over a library. Because the archive holds the hub,
221
+ restoring also brings back the password and API tokens that library was
222
+ using, so your current ones are replaced.
223
+ - **`restore` does not delete your current setup.** It *moves*
224
+ `server-config.json` and `hub.db` into a dated `pre-restore-*` folder beside
225
+ themselves and prints the launch command for each, so
226
+ `pixlstash-server --server-config <pre-restore-*>/server-config.json` reopens
227
+ what you had. Your old library folder is never touched.
208
228
 
209
229
  #### Which form to type
210
230
 
@@ -215,6 +235,13 @@ the environment PixlStash is installed into is active.
215
235
  `python -m pixlstash.cli libraries list`
216
236
  - **Docker Compose**, for a running service (paths are inside the container):
217
237
  `docker compose exec pixlstash pixlstash-cli libraries list`
238
+ - **Desktop app** (AppImage, deb, .dmg, installer): the app is its own CLI, so
239
+ `/path/to/PixlStash.AppImage cli libraries list` works whether or not the app
240
+ is running. Turn on Settings › Backend › Desktop › **Shell command** to get a
241
+ `pixlstash` command in `~/.local/bin` and type `pixlstash libraries list`
242
+ instead. Either form targets the desktop app's own hub; there is no need to
243
+ pass `--hub`. Settings › Libraries always shows the exact command for your
244
+ install.
218
245
  - **A different hub** than the default: put global options *before* `libraries`,
219
246
  e.g. `pixlstash-cli --hub /path/to/hub.db libraries list`. Without `--hub` the
220
247
  CLI uses the standard config location, which is what you want almost always.
@@ -296,7 +323,7 @@ Edit the file and restart the server to apply changes.
296
323
  | `require_local_for_write` | `true` | When `true`, full login (username/password and ALL-scope tokens) is only permitted from local network addresses (RFC 1918 / loopback). READ-only share tokens are always accepted from any IP. Set to `false` to allow full login from any IP. |
297
324
  | `trusted_proxies` | `[]` | List of proxy IP addresses whose `X-Forwarded-For` header should be trusted for real-client-IP detection. See [Sharing and remote access](#sharing-and-remote-access) below. |
298
325
 
299
- At startup the server detects its own LAN IP and automatically allows it on any port. This means the Vite dev server works over LAN (`http://192.168.1.5:5173` → `http://192.168.1.5:9537`) without any extra configuration, as long as network access is enabled via `host`.
326
+ At startup the server detects its own LAN IP and automatically allows it on any port. This means the Vite dev server works over LAN (`http://<lan-ip>:5173` → `http://<lan-ip>:9537`) without any extra configuration, as long as network access is enabled via `host`.
300
327
 
301
328
  Use `cors_origins` only if you need to allow origins on a different machine entirely.
302
329
 
@@ -511,15 +538,80 @@ Detailed installation instructions on <a href="http://pixlstash.dev/upgrade.html
511
538
 
512
539
  PixlStash supports built-in plugins and user-created plugins.
513
540
 
541
+ ### With the CLI (recommended)
542
+
543
+ ```bash
544
+ pixlstash-cli plugins available # what is published
545
+ pixlstash-cli plugins available caption # ...matching a word
546
+ pixlstash-cli plugins install hello_world_stamp # from the plugins repository
547
+ pixlstash-cli plugins install ./my_captioner.zip # a zip of a plugin folder
548
+ pixlstash-cli plugins install ./my_captioner/ # an extracted folder
549
+ pixlstash-cli plugins install ./my_filter.py # a single module
550
+ pixlstash-cli plugins test ./my_captioner.py # does it load and render?
551
+ pixlstash-cli plugins list
552
+ pixlstash-cli plugins remove my_captioner
553
+ ```
554
+
555
+ `plugins available` lists what
556
+ [PixlStash-plugins](https://github.com/Pikselkroken/PixlStash-plugins) publishes,
557
+ with each plugin's name, title, one-line summary and (where declared) author and
558
+ licence; `*` marks one you already have. Add a word to search, and it matches
559
+ any of those fields, so anything you can see in the listing you can search for.
560
+ It downloads the same archive `install` does and reads it without importing
561
+ anything, so it needs no token and runs no published code.
562
+
563
+ The destination differs by kind (captioning plugin or image filter) and by
564
+ shape, so `install` works it out from the source instead of asking you to type
565
+ it: it reads the source without importing it, decides which base class it
566
+ derives from, and names the installed file after the plugin's own `name`. It
567
+ refuses a source that is not a plugin, one whose name collides with a built-in,
568
+ and a zip whose entries would be unpacked outside the folder it is unpacked
569
+ into.
570
+
571
+ `--dry-run` prints the plan and stops, `--yes` skips the confirmation, `--force`
572
+ replaces an existing plugin of the same name, and `--strict` turns the warnings
573
+ into refusals. `--ref` picks a branch, tag or commit in the plugins repository
574
+ and is ignored for local sources; it cannot point the download at a different
575
+ repository. A plugin's `requirements.txt` is never installed unless you pass
576
+ `--with-deps`. **Plugin code runs unsandboxed, in the server process, with your
577
+ permissions** — install what you would run yourself.
578
+
579
+ Captioning plugins load at server start, so restart PixlStash after installing
580
+ one; image filters are re-scanned every time the Filters menu is listed.
581
+
582
+ `plugins test` is for the person *writing* a captioning plugin, and it is the
583
+ one verb that imports the plugin instead of reading it: it loads the file the
584
+ way the server does, registers what it defines, and checks that the parameter
585
+ schema is one the settings screen can render — so a typo costs a command rather
586
+ than a restart. `--image PATH` runs it over one picture as well, and stops
587
+ instead of running when the plugin reports its model is not present — though a
588
+ plugin that downloads inside `init()` still will, since by then it is the
589
+ plugin's code deciding.
590
+
591
+ **It is a development aid, not a security scanner.** It does not tell you
592
+ whether a plugin is safe to install — it *runs* the plugin, unsandboxed, with
593
+ your permissions, which is exactly what the server would do. Only test a plugin
594
+ you would have installed anyway.
595
+
514
596
  ### User plugin directory
515
597
 
516
- Place your `.py` plugin files in the platform-specific user data directory. PixlStash logs the exact path on startup.
598
+ If you prefer to copy files by hand, they go in the platform-specific user data
599
+ directory. PixlStash logs the exact path on startup, and
600
+ `pixlstash-cli plugins list` prints it.
601
+
602
+ | OS | Image filters | Captioning plugins |
603
+ |----|---------------|--------------------|
604
+ | **Linux** | `~/.local/share/pixlstash/image-plugins/user/` | `~/.local/share/pixlstash/tagger-plugins/user/` |
605
+ | **macOS** | `~/Library/Application Support/pixlstash/image-plugins/user/` | `~/Library/Application Support/pixlstash/tagger-plugins/user/` |
606
+ | **Windows** | `%LOCALAPPDATA%\pixlstash\pixlstash\image-plugins\user\` | `%LOCALAPPDATA%\pixlstash\pixlstash\tagger-plugins\user\` |
607
+
608
+ The doubled `pixlstash\pixlstash` on Windows is not a typo: `platformdirs` puts
609
+ the app under a vendor folder, and PixlStash passes no separate vendor name.
610
+ This table used to show it singly, which is why copying a plugin there by hand
611
+ appeared to do nothing.
517
612
 
518
- | OS | Path |
519
- |----|------|
520
- | **Linux** | `~/.local/share/pixlstash/image-plugins/user/` |
521
- | **macOS** | `~/Library/Application Support/pixlstash/image-plugins/user/` |
522
- | **Windows** | `%LOCALAPPDATA%\pixlstash\image-plugins\user\` |
613
+ An image filter is always a single `.py` file. A captioning plugin may be a
614
+ single `.py` file or a folder containing `__init__.py`.
523
615
 
524
616
  ### Writing a plugin
525
617
 
@@ -78,6 +78,8 @@ the app's own user-data directory.
78
78
  > | **Windows** | `%LOCALAPPDATA%\pixlstash\downloaded_models\` |
79
79
  >
80
80
  > An internet connection is required the first time the server starts. Subsequent starts use the cached models.
81
+ >
82
+ > **Moving them somewhere else:** open **Model folders** on the model shelf and use **Move** on PixlStash's own folder. Every file in it is copied, verified and removed from the old location, and the new location is remembered — so nothing is downloaded again. Set `PIXLSTASH_BUILTIN_MODEL_DIR` instead if you want the folder somewhere else without moving what is already in it (a mounted model volume, typically).
81
83
 
82
84
  If you need to use a custom config path:
83
85
 
@@ -114,6 +116,8 @@ pixlstash-cli libraries rename "Existing library" "Better name"
114
116
  pixlstash-cli libraries relocate "Existing library" /new/path
115
117
  pixlstash-cli libraries detach "Existing library"
116
118
  pixlstash-cli libraries backup "Existing library" /path/to/backups/
119
+ pixlstash-cli libraries backup "Existing library" /path/to/backups/monday.tar.zst
120
+ pixlstash-cli libraries restore /path/to/backups/monday.tar.zst /path/to/new-library
117
121
  ```
118
122
 
119
123
  | Command | What it does |
@@ -125,18 +129,33 @@ pixlstash-cli libraries backup "Existing library" /path/to/backups/
125
129
  | `relocate` | Points an existing registration at a new path, keeping its identity and share links. |
126
130
  | `detach` | Forgets a library. **No files are removed and nothing inside the folder changes.** |
127
131
  | `backup` | Writes the library and the hub to a single archive. |
132
+ | `restore` | Unpacks an archive into a **new** folder and makes it the library that opens. |
128
133
 
129
134
  Notes worth knowing before you need them:
130
135
 
131
136
  - `detach` refuses the **active** library. Switch to another one first.
132
137
  - Reattaching the same folder revives its original registration, including its
133
138
  share links, because a library carries a fingerprint of its own identity.
139
+ - A backup is a **zstd-compressed tar**, named `.tar.zst` — not `.tar.gz`.
140
+ `--no-compress` writes a plain `.tar` instead. Given a folder, `backup`
141
+ invents a dated name with the right ending; given a filename, it adds the
142
+ right ending if you left it off. `restore` recognises an archive by its
143
+ contents, so a renamed file still works.
134
144
  - A backup contains `hub.db`, and therefore your login and token secrets.
135
145
  PixlStash writes it owner-readable and refuses to overwrite an existing file.
136
146
  - A backup covers the library folder. Pictures kept in **reference folders** live
137
147
  outside it and are *not* included, so back those up separately.
138
148
  - Backing up finishes any outstanding one-time snapshot cleanup first, so the
139
149
  archive never carries credentials from before your upgrade.
150
+ - `restore` needs PixlStash stopped, and names a folder that is empty or does
151
+ not exist yet — it never writes over a library. Because the archive holds the hub,
152
+ restoring also brings back the password and API tokens that library was
153
+ using, so your current ones are replaced.
154
+ - **`restore` does not delete your current setup.** It *moves*
155
+ `server-config.json` and `hub.db` into a dated `pre-restore-*` folder beside
156
+ themselves and prints the launch command for each, so
157
+ `pixlstash-server --server-config <pre-restore-*>/server-config.json` reopens
158
+ what you had. Your old library folder is never touched.
140
159
 
141
160
  #### Which form to type
142
161
 
@@ -147,6 +166,13 @@ the environment PixlStash is installed into is active.
147
166
  `python -m pixlstash.cli libraries list`
148
167
  - **Docker Compose**, for a running service (paths are inside the container):
149
168
  `docker compose exec pixlstash pixlstash-cli libraries list`
169
+ - **Desktop app** (AppImage, deb, .dmg, installer): the app is its own CLI, so
170
+ `/path/to/PixlStash.AppImage cli libraries list` works whether or not the app
171
+ is running. Turn on Settings › Backend › Desktop › **Shell command** to get a
172
+ `pixlstash` command in `~/.local/bin` and type `pixlstash libraries list`
173
+ instead. Either form targets the desktop app's own hub; there is no need to
174
+ pass `--hub`. Settings › Libraries always shows the exact command for your
175
+ install.
150
176
  - **A different hub** than the default: put global options *before* `libraries`,
151
177
  e.g. `pixlstash-cli --hub /path/to/hub.db libraries list`. Without `--hub` the
152
178
  CLI uses the standard config location, which is what you want almost always.
@@ -228,7 +254,7 @@ Edit the file and restart the server to apply changes.
228
254
  | `require_local_for_write` | `true` | When `true`, full login (username/password and ALL-scope tokens) is only permitted from local network addresses (RFC 1918 / loopback). READ-only share tokens are always accepted from any IP. Set to `false` to allow full login from any IP. |
229
255
  | `trusted_proxies` | `[]` | List of proxy IP addresses whose `X-Forwarded-For` header should be trusted for real-client-IP detection. See [Sharing and remote access](#sharing-and-remote-access) below. |
230
256
 
231
- At startup the server detects its own LAN IP and automatically allows it on any port. This means the Vite dev server works over LAN (`http://192.168.1.5:5173` → `http://192.168.1.5:9537`) without any extra configuration, as long as network access is enabled via `host`.
257
+ At startup the server detects its own LAN IP and automatically allows it on any port. This means the Vite dev server works over LAN (`http://<lan-ip>:5173` → `http://<lan-ip>:9537`) without any extra configuration, as long as network access is enabled via `host`.
232
258
 
233
259
  Use `cors_origins` only if you need to allow origins on a different machine entirely.
234
260
 
@@ -443,15 +469,80 @@ Detailed installation instructions on <a href="http://pixlstash.dev/upgrade.html
443
469
 
444
470
  PixlStash supports built-in plugins and user-created plugins.
445
471
 
472
+ ### With the CLI (recommended)
473
+
474
+ ```bash
475
+ pixlstash-cli plugins available # what is published
476
+ pixlstash-cli plugins available caption # ...matching a word
477
+ pixlstash-cli plugins install hello_world_stamp # from the plugins repository
478
+ pixlstash-cli plugins install ./my_captioner.zip # a zip of a plugin folder
479
+ pixlstash-cli plugins install ./my_captioner/ # an extracted folder
480
+ pixlstash-cli plugins install ./my_filter.py # a single module
481
+ pixlstash-cli plugins test ./my_captioner.py # does it load and render?
482
+ pixlstash-cli plugins list
483
+ pixlstash-cli plugins remove my_captioner
484
+ ```
485
+
486
+ `plugins available` lists what
487
+ [PixlStash-plugins](https://github.com/Pikselkroken/PixlStash-plugins) publishes,
488
+ with each plugin's name, title, one-line summary and (where declared) author and
489
+ licence; `*` marks one you already have. Add a word to search, and it matches
490
+ any of those fields, so anything you can see in the listing you can search for.
491
+ It downloads the same archive `install` does and reads it without importing
492
+ anything, so it needs no token and runs no published code.
493
+
494
+ The destination differs by kind (captioning plugin or image filter) and by
495
+ shape, so `install` works it out from the source instead of asking you to type
496
+ it: it reads the source without importing it, decides which base class it
497
+ derives from, and names the installed file after the plugin's own `name`. It
498
+ refuses a source that is not a plugin, one whose name collides with a built-in,
499
+ and a zip whose entries would be unpacked outside the folder it is unpacked
500
+ into.
501
+
502
+ `--dry-run` prints the plan and stops, `--yes` skips the confirmation, `--force`
503
+ replaces an existing plugin of the same name, and `--strict` turns the warnings
504
+ into refusals. `--ref` picks a branch, tag or commit in the plugins repository
505
+ and is ignored for local sources; it cannot point the download at a different
506
+ repository. A plugin's `requirements.txt` is never installed unless you pass
507
+ `--with-deps`. **Plugin code runs unsandboxed, in the server process, with your
508
+ permissions** — install what you would run yourself.
509
+
510
+ Captioning plugins load at server start, so restart PixlStash after installing
511
+ one; image filters are re-scanned every time the Filters menu is listed.
512
+
513
+ `plugins test` is for the person *writing* a captioning plugin, and it is the
514
+ one verb that imports the plugin instead of reading it: it loads the file the
515
+ way the server does, registers what it defines, and checks that the parameter
516
+ schema is one the settings screen can render — so a typo costs a command rather
517
+ than a restart. `--image PATH` runs it over one picture as well, and stops
518
+ instead of running when the plugin reports its model is not present — though a
519
+ plugin that downloads inside `init()` still will, since by then it is the
520
+ plugin's code deciding.
521
+
522
+ **It is a development aid, not a security scanner.** It does not tell you
523
+ whether a plugin is safe to install — it *runs* the plugin, unsandboxed, with
524
+ your permissions, which is exactly what the server would do. Only test a plugin
525
+ you would have installed anyway.
526
+
446
527
  ### User plugin directory
447
528
 
448
- Place your `.py` plugin files in the platform-specific user data directory. PixlStash logs the exact path on startup.
529
+ If you prefer to copy files by hand, they go in the platform-specific user data
530
+ directory. PixlStash logs the exact path on startup, and
531
+ `pixlstash-cli plugins list` prints it.
532
+
533
+ | OS | Image filters | Captioning plugins |
534
+ |----|---------------|--------------------|
535
+ | **Linux** | `~/.local/share/pixlstash/image-plugins/user/` | `~/.local/share/pixlstash/tagger-plugins/user/` |
536
+ | **macOS** | `~/Library/Application Support/pixlstash/image-plugins/user/` | `~/Library/Application Support/pixlstash/tagger-plugins/user/` |
537
+ | **Windows** | `%LOCALAPPDATA%\pixlstash\pixlstash\image-plugins\user\` | `%LOCALAPPDATA%\pixlstash\pixlstash\tagger-plugins\user\` |
538
+
539
+ The doubled `pixlstash\pixlstash` on Windows is not a typo: `platformdirs` puts
540
+ the app under a vendor folder, and PixlStash passes no separate vendor name.
541
+ This table used to show it singly, which is why copying a plugin there by hand
542
+ appeared to do nothing.
449
543
 
450
- | OS | Path |
451
- |----|------|
452
- | **Linux** | `~/.local/share/pixlstash/image-plugins/user/` |
453
- | **macOS** | `~/Library/Application Support/pixlstash/image-plugins/user/` |
454
- | **Windows** | `%LOCALAPPDATA%\pixlstash\image-plugins\user\` |
544
+ An image filter is always a single `.py` file. A captioning plugin may be a
545
+ single `.py` file or a folder containing `__init__.py`.
455
546
 
456
547
  ### Writing a plugin
457
548
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pixlstash-frontend",
3
- "version": "1.10.0-dev.2",
3
+ "version": "1.10.0-dev.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pixlstash-frontend",
9
- "version": "1.10.0-dev.2",
9
+ "version": "1.10.0-dev.4",
10
10
  "dependencies": {
11
11
  "@mdi/font": "^7.4.47",
12
12
  "axios": "^1.18.0",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pixlstash-frontend",
3
3
  "private": true,
4
- "version": "1.10.0-dev.2",
4
+ "version": "1.10.0-dev.4",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -211,34 +211,60 @@ def _force_utf8_streams():
211
211
  )
212
212
 
213
213
 
214
- def main():
215
- _force_utf8_streams()
216
- parser = argparse.ArgumentParser(description=f"Run the {APP_NAME} server.")
214
+ def build_parser() -> argparse.ArgumentParser:
215
+ """Return the argument parser for the server entry point."""
216
+ parser = argparse.ArgumentParser(
217
+ prog=f"{APP_NAME}-server",
218
+ description=(
219
+ f"Run the {APP_NAME} server. In a source checkout, where the "
220
+ "entry point is not on PATH, the same options are accepted by "
221
+ f"`python -m {APP_NAME}.app`."
222
+ ),
223
+ epilog=(
224
+ "Every option acts during startup and the server then runs "
225
+ "normally, except --clear-embeddings, which does its work and "
226
+ "exits. Libraries and plugins are managed with a separate "
227
+ f"command, `{APP_NAME}-cli`."
228
+ ),
229
+ )
217
230
  parser.add_argument(
218
231
  "--server-config",
219
232
  type=str,
220
233
  default=SERVER_CONFIG_PATH,
221
- help="Path to server config file.",
234
+ metavar="PATH",
235
+ help=(
236
+ "Path to the server config file, which is created on first run "
237
+ f"if it is missing (default: {SERVER_CONFIG_PATH})."
238
+ ),
222
239
  )
223
240
  parser.add_argument(
224
241
  "--remove-password",
225
242
  action="store_true",
226
- help="Cause the server to recreate the password on next login.",
227
- )
228
- parser.add_argument(
229
- "--retag-and-embed",
230
- action="store_true",
231
- help="Re-tag all images and refresh text embeddings in the database.",
243
+ help=(
244
+ "Clear the stored username and password hash and log out every "
245
+ "signed-in session, so the next sign-in sets them again. The "
246
+ "server starts as usual afterwards."
247
+ ),
232
248
  )
233
249
  parser.add_argument(
234
250
  "--clear-embeddings",
235
251
  action="store_true",
236
- help="Clear all text embeddings for all images (does not touch tags).",
252
+ help=(
253
+ "Clear every picture's text and image embeddings, then exit "
254
+ "without starting the server. Tags are not touched, and the "
255
+ "embeddings are recomputed in the background the next time the "
256
+ "server runs."
257
+ ),
237
258
  )
238
259
  parser.add_argument(
239
260
  "--bootstrap",
240
261
  action="store_true",
241
- help=("Run interactive first-run setup for storage path, port, and HTTPS."),
262
+ help=(
263
+ "Run the interactive first-run setup — storage path, port, HTTPS, "
264
+ "then the username and password — even if a config file already "
265
+ "exists, and start the server afterwards. It needs a terminal: "
266
+ "with stdin redirected the setup is skipped."
267
+ ),
242
268
  )
243
269
  parser.add_argument(
244
270
  "--cleanup-missing-pictures",
@@ -259,7 +285,12 @@ def main():
259
285
  "Example: --path-map /mnt/photos:/data/photos"
260
286
  ),
261
287
  )
262
- args = parser.parse_args()
288
+ return parser
289
+
290
+
291
+ def main():
292
+ _force_utf8_streams()
293
+ args = build_parser().parse_args()
263
294
 
264
295
  ran_bootstrap = _bootstrap_server_config(args.server_config, force=args.bootstrap)
265
296
  Server.DEFAULT_CLEANUP_MISSING_PICTURES = bool(args.cleanup_missing_pictures)
@@ -116,6 +116,28 @@ READ_BLOCKED_GET_PATHS: frozenset[str] = frozenset(
116
116
  # sidecar naming. A folder/filesystem endpoint, so READ tokens (handed
117
117
  # out to view a shared gallery) must not reach it.
118
118
  "/api/v1/reference-folders/detect-sidecars",
119
+ # Names the tagger-plugin folder on the server's disk, and returns
120
+ # plugin import errors whose text can carry any path the failing plugin
121
+ # reached for. The authz gate declares it LOCAL_OWNER_ONLY; it is here
122
+ # as well because that is the pattern filesystem/browse already sets,
123
+ # and because AUTHZ_GATE_ENFORCING is a documented one-line rollback —
124
+ # without this entry, taking it would hand the folder straight back to
125
+ # every share token.
126
+ "/api/v1/taggers/plugin-diagnostics",
127
+ # The plugin list carries the caller's own tagger_settings, which is
128
+ # user settings exactly like /users/me/config above — a plugin may
129
+ # declare a free-text parameter and the owner may have typed a path
130
+ # into it. Gate policy is OWNER_ONLY; same belt-and-braces reasoning.
131
+ "/api/v1/taggers",
132
+ # Found by the derivation in tests/test_authz_host_capability_16_3.py
133
+ # ::test_every_untemplated_locality_get_is_on_the_read_blocked_belt,
134
+ # not by anyone reading this list: it is LOCAL_OWNER_ONLY at the gate
135
+ # and serves the move queue's source and destination folders, so with
136
+ # the gate rolled back a READ token read host paths straight out of it.
137
+ # Its two templated siblings on the same tier cannot be expressed here
138
+ # at all — this frozenset matches literal paths — and stay the recorded
139
+ # follow-up.
140
+ "/api/v1/model-moves",
119
141
  }
120
142
  )
121
143