pixlstash 1.12.0.dev3__tar.gz → 1.12.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 (1052) hide show
  1. pixlstash-1.12.0.dev4/PKG-INFO +1070 -0
  2. pixlstash-1.12.0.dev4/README.md +1001 -0
  3. pixlstash-1.12.0.dev4/frontend/package-lock.json +3704 -0
  4. pixlstash-1.12.0.dev4/frontend/package.json +45 -0
  5. pixlstash-1.12.0.dev4/pixlstash/auth.py +2768 -0
  6. pixlstash-1.12.0.dev4/pixlstash/authz/gate.py +897 -0
  7. pixlstash-1.12.0.dev4/pixlstash/authz/membership.py +570 -0
  8. pixlstash-1.12.0.dev4/pixlstash/authz/policy.py +253 -0
  9. pixlstash-1.12.0.dev4/pixlstash/authz/registry.py +2012 -0
  10. pixlstash-1.12.0.dev4/pixlstash/cli.py +1880 -0
  11. pixlstash-1.12.0.dev4/pixlstash/db_models/dedup.py +267 -0
  12. pixlstash-1.12.0.dev4/pixlstash/db_models/deleted_file_log.py +68 -0
  13. pixlstash-1.12.0.dev4/pixlstash/db_models/external_move_review.py +48 -0
  14. pixlstash-1.12.0.dev4/pixlstash/db_models/guest_score.py +63 -0
  15. pixlstash-1.12.0.dev4/pixlstash/db_models/guest_session.py +65 -0
  16. pixlstash-1.12.0.dev4/pixlstash/db_models/mixed_stack.py +185 -0
  17. pixlstash-1.12.0.dev4/pixlstash/db_models/operation.py +112 -0
  18. pixlstash-1.12.0.dev4/pixlstash/db_models/pending_score_invalidation.py +61 -0
  19. pixlstash-1.12.0.dev4/pixlstash/db_models/picture.py +1792 -0
  20. pixlstash-1.12.0.dev4/pixlstash/db_models/picture_likeness.py +292 -0
  21. pixlstash-1.12.0.dev4/pixlstash/db_models/picture_move.py +84 -0
  22. pixlstash-1.12.0.dev4/pixlstash/db_models/picture_stack.py +26 -0
  23. pixlstash-1.12.0.dev4/pixlstash/db_models/project.py +83 -0
  24. pixlstash-1.12.0.dev4/pixlstash/db_models/review.py +70 -0
  25. pixlstash-1.12.0.dev4/pixlstash/db_models/saved_recipe.py +131 -0
  26. pixlstash-1.12.0.dev4/pixlstash/db_models/snapshot.py +49 -0
  27. pixlstash-1.12.0.dev4/pixlstash/db_models/tag_health.py +84 -0
  28. pixlstash-1.12.0.dev4/pixlstash/db_models/tag_prediction.py +156 -0
  29. pixlstash-1.12.0.dev4/pixlstash/db_models/tag_suggestion.py +114 -0
  30. pixlstash-1.12.0.dev4/pixlstash/db_models/tagger_run.py +37 -0
  31. pixlstash-1.12.0.dev4/pixlstash/db_models/user_token.py +92 -0
  32. pixlstash-1.12.0.dev4/pixlstash/event_types.py +38 -0
  33. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/AppBarButton-BLXhewdp.js +1 -0
  34. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/AppButton-BY94xBEn.css +1 -0
  35. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/AppButton-DhGWIIrt.js +10 -0
  36. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ChipRow-BEu53zcn.js +2 -0
  37. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ChipRow-CAwvND-M.css +1 -0
  38. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/DuplicateQueue-S-_wAEz3.js +1 -0
  39. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/EditLorasDialog-BetKIz8Q.js +1 -0
  40. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/EditLorasDialog-DNW4QA84.css +1 -0
  41. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/LibraryInsights-DHQytD-M.js +1 -0
  42. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/MakeMoreDialog-6H8J_ewg.js +1 -0
  43. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/MakeMoreDialog-B4eXIlNU.css +1 -0
  44. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ModelShelf-B7jauQwa.js +5 -0
  45. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ModelShelf-ibyawyjn.css +1 -0
  46. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/MovesReview-EVwDdCWs.js +1 -0
  47. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/PicturePicker-BZTmSC4y.js +1 -0
  48. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ReviewSessionsOverlay-B2ma0Qci.css +1 -0
  49. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/ReviewSessionsOverlay-BCl3zuMF.js +1 -0
  50. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/RunDialog-DdDE_9Ex.css +1 -0
  51. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/RunDialog-T3UEBV3J.js +1 -0
  52. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/RunReasonNotice-6IH3i2C4.css +1 -0
  53. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/RunReasonNotice-BCe4Gq5Y.js +1 -0
  54. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/Segmented-Dp64c2Fn.js +1 -0
  55. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/Segmented-KYtQ1Si0.css +1 -0
  56. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/WorkflowTab-CJBbJFRT.css +1 -0
  57. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/WorkflowTab-C_YpSkoG.js +1 -0
  58. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/WorkflowsView-9a9Jq6Hn.css +1 -0
  59. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/WorkflowsView-BSTBmeef.js +2 -0
  60. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/characters-DwgEUdJA.js +1 -0
  61. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/dedup-C53oDEav.js +1 -0
  62. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/index-DtLFT5zL.js +12 -0
  63. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/index-INn618u_.css +1 -0
  64. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/pictureSets-BE1GpRnr.js +1 -0
  65. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/pinia-DQmHL7SR.js +1 -0
  66. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/setAppearance-qVi6o8tK.js +1 -0
  67. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/shortcutHints-BuTsgQZw.js +1 -0
  68. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/assets/useProjectStore-DAu-eZAn.js +1 -0
  69. pixlstash-1.12.0.dev4/pixlstash/frontend/dist/index.html +40 -0
  70. pixlstash-1.12.0.dev4/pixlstash/hub/schema.py +1952 -0
  71. pixlstash-1.12.0.dev4/pixlstash/hub/workflow_card_reads.py +894 -0
  72. pixlstash-1.12.0.dev4/pixlstash/hub/workflow_card_writes.py +447 -0
  73. pixlstash-1.12.0.dev4/pixlstash/hub/workflow_cards.py +585 -0
  74. pixlstash-1.12.0.dev4/pixlstash/hub/workflow_group_convert.py +738 -0
  75. pixlstash-1.12.0.dev4/pixlstash/hub/workflow_group_writes.py +321 -0
  76. pixlstash-1.12.0.dev4/pixlstash/hub/workflow_origin.py +195 -0
  77. pixlstash-1.12.0.dev4/pixlstash/hub/workflows.py +1020 -0
  78. pixlstash-1.12.0.dev4/pixlstash/image_plugins/service.py +752 -0
  79. pixlstash-1.12.0.dev4/pixlstash/inference/workflows/description.py +327 -0
  80. pixlstash-1.12.0.dev4/pixlstash/inference/workflows/tagging.py +757 -0
  81. pixlstash-1.12.0.dev4/pixlstash/mcp_server.py +1119 -0
  82. pixlstash-1.12.0.dev4/pixlstash/migrations/versions/0122_rescan_pictures_for_controlnet_model_names.py +56 -0
  83. pixlstash-1.12.0.dev4/pixlstash/migrations/versions/0123_resample_animated_gifs.py +49 -0
  84. pixlstash-1.12.0.dev4/pixlstash/migrations/versions/0124_saved_recipe_models_and_workflow_id.py +55 -0
  85. pixlstash-1.12.0.dev4/pixlstash/plugin_check.py +813 -0
  86. pixlstash-1.12.0.dev4/pixlstash/routes/characters.py +2181 -0
  87. pixlstash-1.12.0.dev4/pixlstash/routes/comfyui.py +2913 -0
  88. pixlstash-1.12.0.dev4/pixlstash/routes/dedup.py +2745 -0
  89. pixlstash-1.12.0.dev4/pixlstash/routes/filesystem.py +260 -0
  90. pixlstash-1.12.0.dev4/pixlstash/routes/folder_structure.py +1165 -0
  91. pixlstash-1.12.0.dev4/pixlstash/routes/guest_scores.py +340 -0
  92. pixlstash-1.12.0.dev4/pixlstash/routes/libraries.py +865 -0
  93. pixlstash-1.12.0.dev4/pixlstash/routes/model_files.py +1386 -0
  94. pixlstash-1.12.0.dev4/pixlstash/routes/model_shelf.py +2120 -0
  95. pixlstash-1.12.0.dev4/pixlstash/routes/picture_sets.py +2157 -0
  96. pixlstash-1.12.0.dev4/pixlstash/routes/pictures/_crud.py +1879 -0
  97. pixlstash-1.12.0.dev4/pixlstash/routes/pictures/_import.py +1675 -0
  98. pixlstash-1.12.0.dev4/pixlstash/routes/pictures/_likeness_search.py +523 -0
  99. pixlstash-1.12.0.dev4/pixlstash/routes/pictures/_listing.py +1783 -0
  100. pixlstash-1.12.0.dev4/pixlstash/routes/pictures/_misc.py +1009 -0
  101. pixlstash-1.12.0.dev4/pixlstash/routes/pictures/_search.py +485 -0
  102. pixlstash-1.12.0.dev4/pixlstash/routes/pictures/_thumbnails.py +623 -0
  103. pixlstash-1.12.0.dev4/pixlstash/routes/projects.py +1212 -0
  104. pixlstash-1.12.0.dev4/pixlstash/routes/recipes.py +535 -0
  105. pixlstash-1.12.0.dev4/pixlstash/routes/stacks.py +1634 -0
  106. pixlstash-1.12.0.dev4/pixlstash/routes/taggers.py +300 -0
  107. pixlstash-1.12.0.dev4/pixlstash/routes/workflows.py +7125 -0
  108. pixlstash-1.12.0.dev4/pixlstash/scoring/character_likeness.py +720 -0
  109. pixlstash-1.12.0.dev4/pixlstash/server.py +2093 -0
  110. pixlstash-1.12.0.dev4/pixlstash/services/a1111_recipe.py +569 -0
  111. pixlstash-1.12.0.dev4/pixlstash/services/builtin_models.py +918 -0
  112. pixlstash-1.12.0.dev4/pixlstash/services/comfyui_recipe_service.py +3386 -0
  113. pixlstash-1.12.0.dev4/pixlstash/services/comfyui_service.py +1370 -0
  114. pixlstash-1.12.0.dev4/pixlstash/services/comfyui_ui_graph.py +514 -0
  115. pixlstash-1.12.0.dev4/pixlstash/services/comfyui_userdata.py +326 -0
  116. pixlstash-1.12.0.dev4/pixlstash/services/dedup_sweep_service.py +889 -0
  117. pixlstash-1.12.0.dev4/pixlstash/services/dedup_tier_service.py +3187 -0
  118. pixlstash-1.12.0.dev4/pixlstash/services/dedup_verdict_service.py +1989 -0
  119. pixlstash-1.12.0.dev4/pixlstash/services/folder_structure_commit_service.py +1479 -0
  120. pixlstash-1.12.0.dev4/pixlstash/services/folder_structure_service.py +1477 -0
  121. pixlstash-1.12.0.dev4/pixlstash/services/layout_move_service.py +1735 -0
  122. pixlstash-1.12.0.dev4/pixlstash/services/mixed_stack_service.py +1820 -0
  123. pixlstash-1.12.0.dev4/pixlstash/services/model_folder_scanner.py +1140 -0
  124. pixlstash-1.12.0.dev4/pixlstash/services/model_shelf_service.py +1925 -0
  125. pixlstash-1.12.0.dev4/pixlstash/services/model_workflow_sets.py +579 -0
  126. pixlstash-1.12.0.dev4/pixlstash/services/move_reconciliation_service.py +608 -0
  127. pixlstash-1.12.0.dev4/pixlstash/services/operation_log_service.py +2384 -0
  128. pixlstash-1.12.0.dev4/pixlstash/services/picture_recipe_service.py +320 -0
  129. pixlstash-1.12.0.dev4/pixlstash/services/review_service.py +867 -0
  130. pixlstash-1.12.0.dev4/pixlstash/services/saved_recipe_service.py +696 -0
  131. pixlstash-1.12.0.dev4/pixlstash/services/scrapheap_service.py +1773 -0
  132. pixlstash-1.12.0.dev4/pixlstash/services/search_query_service.py +469 -0
  133. pixlstash-1.12.0.dev4/pixlstash/services/stack_detector.py +794 -0
  134. pixlstash-1.12.0.dev4/pixlstash/services/tag_health_service.py +812 -0
  135. pixlstash-1.12.0.dev4/pixlstash/services/tag_prediction_service.py +470 -0
  136. pixlstash-1.12.0.dev4/pixlstash/services/tag_scan_service.py +689 -0
  137. pixlstash-1.12.0.dev4/pixlstash/services/tag_suggestion_service.py +1027 -0
  138. pixlstash-1.12.0.dev4/pixlstash/services/workflow_bindings.py +475 -0
  139. pixlstash-1.12.0.dev4/pixlstash/services/workflow_card_service.py +1612 -0
  140. pixlstash-1.12.0.dev4/pixlstash/services/workflow_events.py +71 -0
  141. pixlstash-1.12.0.dev4/pixlstash/services/workflow_export.py +386 -0
  142. pixlstash-1.12.0.dev4/pixlstash/services/workflow_hash.py +1117 -0
  143. pixlstash-1.12.0.dev4/pixlstash/services/workflow_identity.py +977 -0
  144. pixlstash-1.12.0.dev4/pixlstash/services/workflow_inputs.py +397 -0
  145. pixlstash-1.12.0.dev4/pixlstash/services/workflow_io.py +267 -0
  146. pixlstash-1.12.0.dev4/pixlstash/services/workflow_library_service.py +667 -0
  147. pixlstash-1.12.0.dev4/pixlstash/services/workflow_parameters.py +496 -0
  148. pixlstash-1.12.0.dev4/pixlstash/services/workflow_run_service.py +1500 -0
  149. pixlstash-1.12.0.dev4/pixlstash/stacking.py +144 -0
  150. pixlstash-1.12.0.dev4/pixlstash/tagger_plugins/florence2.py +1277 -0
  151. pixlstash-1.12.0.dev4/pixlstash/tagger_plugins/pixlstash_tagger.py +1262 -0
  152. pixlstash-1.12.0.dev4/pixlstash/tasks/base_task.py +192 -0
  153. pixlstash-1.12.0.dev4/pixlstash/tasks/checkpoint_hash_task.py +276 -0
  154. pixlstash-1.12.0.dev4/pixlstash/tasks/comfyui_workflow_pull_task.py +535 -0
  155. pixlstash-1.12.0.dev4/pixlstash/tasks/dedup_scan_task.py +789 -0
  156. pixlstash-1.12.0.dev4/pixlstash/tasks/face_extraction_task.py +1119 -0
  157. pixlstash-1.12.0.dev4/pixlstash/tasks/face_model_refresh_task.py +624 -0
  158. pixlstash-1.12.0.dev4/pixlstash/tasks/image_embedding_task.py +702 -0
  159. pixlstash-1.12.0.dev4/pixlstash/tasks/missing_checkpoint_hash_finder.py +172 -0
  160. pixlstash-1.12.0.dev4/pixlstash/tasks/missing_file_purge_task.py +353 -0
  161. pixlstash-1.12.0.dev4/pixlstash/tasks/missing_ocr_finder.py +83 -0
  162. pixlstash-1.12.0.dev4/pixlstash/tasks/missing_saved_recipe_workflow_finder.py +95 -0
  163. pixlstash-1.12.0.dev4/pixlstash/tasks/ocr_task.py +207 -0
  164. pixlstash-1.12.0.dev4/pixlstash/tasks/picture_import_task.py +538 -0
  165. pixlstash-1.12.0.dev4/pixlstash/tasks/saved_recipe_convert_task.py +176 -0
  166. pixlstash-1.12.0.dev4/pixlstash/tasks/tag_prediction_backfill_task.py +275 -0
  167. pixlstash-1.12.0.dev4/pixlstash/tasks/tag_task.py +1469 -0
  168. pixlstash-1.12.0.dev4/pixlstash/tasks/task_type.py +47 -0
  169. pixlstash-1.12.0.dev4/pixlstash/tasks/watch_folder_import_task.py +246 -0
  170. pixlstash-1.12.0.dev4/pixlstash/utils/adapter_header.py +745 -0
  171. pixlstash-1.12.0.dev4/pixlstash/utils/comfyui_utilities.py +1220 -0
  172. pixlstash-1.12.0.dev4/pixlstash/utils/http_cache.py +102 -0
  173. pixlstash-1.12.0.dev4/pixlstash/utils/image_processing/face_utils.py +262 -0
  174. pixlstash-1.12.0.dev4/pixlstash/utils/image_processing/image_utils.py +1217 -0
  175. pixlstash-1.12.0.dev4/pixlstash/utils/image_processing/video_utils.py +189 -0
  176. pixlstash-1.12.0.dev4/pixlstash/utils/known_base_models.py +698 -0
  177. pixlstash-1.12.0.dev4/pixlstash/utils/likeness/likeness_parameter_utils.py +501 -0
  178. pixlstash-1.12.0.dev4/pixlstash/utils/model_utils.py +463 -0
  179. pixlstash-1.12.0.dev4/pixlstash/utils/service/export_utils.py +1005 -0
  180. pixlstash-1.12.0.dev4/pixlstash/utils/service/label_ledger.py +245 -0
  181. pixlstash-1.12.0.dev4/pixlstash/vault.py +2250 -0
  182. pixlstash-1.12.0.dev4/pixlstash.egg-info/PKG-INFO +1070 -0
  183. pixlstash-1.12.0.dev4/pixlstash.egg-info/SOURCES.txt +816 -0
  184. pixlstash-1.12.0.dev4/pixlstash.egg-info/requires.txt +45 -0
  185. pixlstash-1.12.0.dev4/pyproject.toml +132 -0
  186. pixlstash-1.12.0.dev4/tests/test_adapter_header.py +412 -0
  187. pixlstash-1.12.0.dev4/tests/test_architecture_guardrails.py +3326 -0
  188. pixlstash-1.12.0.dev4/tests/test_authentication.py +1095 -0
  189. pixlstash-1.12.0.dev4/tests/test_authz_gate_step4.py +851 -0
  190. pixlstash-1.12.0.dev4/tests/test_authz_host_capability_16_3.py +1278 -0
  191. pixlstash-1.12.0.dev4/tests/test_authz_library_pin.py +428 -0
  192. pixlstash-1.12.0.dev4/tests/test_backend_order_stability.py +156 -0
  193. pixlstash-1.12.0.dev4/tests/test_builtin_models.py +1529 -0
  194. pixlstash-1.12.0.dev4/tests/test_checkpoint_hash_finder.py +663 -0
  195. pixlstash-1.12.0.dev4/tests/test_ci_shards.py +1840 -0
  196. pixlstash-1.12.0.dev4/tests/test_clip_text_embedding_similarity.py +679 -0
  197. pixlstash-1.12.0.dev4/tests/test_comfyui_pixlstash_saver.py +378 -0
  198. pixlstash-1.12.0.dev4/tests/test_comfyui_recipe_preflight.py +2889 -0
  199. pixlstash-1.12.0.dev4/tests/test_comfyui_recipe_route.py +1491 -0
  200. pixlstash-1.12.0.dev4/tests/test_comfyui_ui_graph_conversion.py +969 -0
  201. pixlstash-1.12.0.dev4/tests/test_comfyui_workflow_extraction.py +468 -0
  202. pixlstash-1.12.0.dev4/tests/test_comfyui_workflow_pull.py +955 -0
  203. pixlstash-1.12.0.dev4/tests/test_dedup_sweep_service.py +506 -0
  204. pixlstash-1.12.0.dev4/tests/test_dedup_tier_service.py +2239 -0
  205. pixlstash-1.12.0.dev4/tests/test_dedup_tiers_api.py +2253 -0
  206. pixlstash-1.12.0.dev4/tests/test_facial_features_worker.py +471 -0
  207. pixlstash-1.12.0.dev4/tests/test_folder_structure_commit.py +1730 -0
  208. pixlstash-1.12.0.dev4/tests/test_frame_count.py +36 -0
  209. pixlstash-1.12.0.dev4/tests/test_hub_engine.py +1451 -0
  210. pixlstash-1.12.0.dev4/tests/test_hub_model_shelf_schema.py +981 -0
  211. pixlstash-1.12.0.dev4/tests/test_image_embedding_worker.py +273 -0
  212. pixlstash-1.12.0.dev4/tests/test_inline_rotate.py +1134 -0
  213. pixlstash-1.12.0.dev4/tests/test_install_type_buckets.py +458 -0
  214. pixlstash-1.12.0.dev4/tests/test_invalid_image_endless_retry.py +336 -0
  215. pixlstash-1.12.0.dev4/tests/test_known_base_model_identify.py +170 -0
  216. pixlstash-1.12.0.dev4/tests/test_known_base_models.py +124 -0
  217. pixlstash-1.12.0.dev4/tests/test_libraries_routes.py +1633 -0
  218. pixlstash-1.12.0.dev4/tests/test_library_layout.py +3029 -0
  219. pixlstash-1.12.0.dev4/tests/test_library_root_scan.py +604 -0
  220. pixlstash-1.12.0.dev4/tests/test_library_switch.py +1061 -0
  221. pixlstash-1.12.0.dev4/tests/test_likeness_and_face_search.py +1147 -0
  222. pixlstash-1.12.0.dev4/tests/test_mcp_server.py +1072 -0
  223. pixlstash-1.12.0.dev4/tests/test_metadata_hash_batching.py +537 -0
  224. pixlstash-1.12.0.dev4/tests/test_migrations.py +1693 -0
  225. pixlstash-1.12.0.dev4/tests/test_model_file_classification.py +461 -0
  226. pixlstash-1.12.0.dev4/tests/test_model_folder_scanner.py +1424 -0
  227. pixlstash-1.12.0.dev4/tests/test_model_shelf_api.py +8186 -0
  228. pixlstash-1.12.0.dev4/tests/test_ocr_text.py +570 -0
  229. pixlstash-1.12.0.dev4/tests/test_operation_log.py +2284 -0
  230. pixlstash-1.12.0.dev4/tests/test_picture_mutation_scope.py +801 -0
  231. pixlstash-1.12.0.dev4/tests/test_picture_plugins.py +695 -0
  232. pixlstash-1.12.0.dev4/tests/test_picture_recipe.py +354 -0
  233. pixlstash-1.12.0.dev4/tests/test_picture_sets.py +678 -0
  234. pixlstash-1.12.0.dev4/tests/test_picture_sets_query_cost.py +394 -0
  235. pixlstash-1.12.0.dev4/tests/test_pictures_stream.py +382 -0
  236. pixlstash-1.12.0.dev4/tests/test_pipeline_stage_contracts.py +973 -0
  237. pixlstash-1.12.0.dev4/tests/test_plugin_install.py +2538 -0
  238. pixlstash-1.12.0.dev4/tests/test_predicate_filter.py +724 -0
  239. pixlstash-1.12.0.dev4/tests/test_read_token_security.py +2812 -0
  240. pixlstash-1.12.0.dev4/tests/test_reference_folder_listing_count_parity.py +118 -0
  241. pixlstash-1.12.0.dev4/tests/test_reference_folder_watcher.py +166 -0
  242. pixlstash-1.12.0.dev4/tests/test_restore.py +4606 -0
  243. pixlstash-1.12.0.dev4/tests/test_reviews_api.py +1692 -0
  244. pixlstash-1.12.0.dev4/tests/test_saved_recipes.py +1613 -0
  245. pixlstash-1.12.0.dev4/tests/test_scrapheap_retention.py +3145 -0
  246. pixlstash-1.12.0.dev4/tests/test_server.py +2332 -0
  247. pixlstash-1.12.0.dev4/tests/test_smart_score_consistency.py +189 -0
  248. pixlstash-1.12.0.dev4/tests/test_smart_score_invalidation.py +1874 -0
  249. pixlstash-1.12.0.dev4/tests/test_snapshots_auth.py +373 -0
  250. pixlstash-1.12.0.dev4/tests/test_stack_detection.py +1256 -0
  251. pixlstash-1.12.0.dev4/tests/test_stack_leader_scope.py +422 -0
  252. pixlstash-1.12.0.dev4/tests/test_stack_state_filter.py +333 -0
  253. pixlstash-1.12.0.dev4/tests/test_tag_health_api.py +1873 -0
  254. pixlstash-1.12.0.dev4/tests/test_tag_prediction_scope.py +474 -0
  255. pixlstash-1.12.0.dev4/tests/test_tag_predictions_api.py +211 -0
  256. pixlstash-1.12.0.dev4/tests/test_tag_suggestions_api.py +1864 -0
  257. pixlstash-1.12.0.dev4/tests/test_tag_task.py +702 -0
  258. pixlstash-1.12.0.dev4/tests/test_thumbnail_cache_headers.py +278 -0
  259. pixlstash-1.12.0.dev4/tests/test_work_planner.py +1159 -0
  260. pixlstash-1.12.0.dev4/tests/test_workflow_cards.py +1687 -0
  261. pixlstash-1.12.0.dev4/tests/test_workflow_group_convert.py +640 -0
  262. pixlstash-1.12.0.dev4/tests/test_workflow_identity.py +787 -0
  263. pixlstash-1.12.0.dev4/tests/test_workflow_io.py +1381 -0
  264. pixlstash-1.12.0.dev4/tests/test_workflow_library.py +4681 -0
  265. pixlstash-1.12.0.dev4/tests/test_workflow_parameters.py +453 -0
  266. pixlstash-1.12.0.dev4/tests/test_workflow_stage_bypass.py +386 -0
  267. pixlstash-1.12.0.dev4/tests/test_workflows_api.py +12204 -0
  268. pixlstash-1.12.0.dev3/PKG-INFO +0 -1011
  269. pixlstash-1.12.0.dev3/README.md +0 -942
  270. pixlstash-1.12.0.dev3/frontend/package-lock.json +0 -3704
  271. pixlstash-1.12.0.dev3/frontend/package.json +0 -45
  272. pixlstash-1.12.0.dev3/pixlstash/auth.py +0 -2750
  273. pixlstash-1.12.0.dev3/pixlstash/authz/gate.py +0 -896
  274. pixlstash-1.12.0.dev3/pixlstash/authz/membership.py +0 -570
  275. pixlstash-1.12.0.dev3/pixlstash/authz/policy.py +0 -252
  276. pixlstash-1.12.0.dev3/pixlstash/authz/registry.py +0 -1918
  277. pixlstash-1.12.0.dev3/pixlstash/cli.py +0 -1845
  278. pixlstash-1.12.0.dev3/pixlstash/db_models/dedup.py +0 -267
  279. pixlstash-1.12.0.dev3/pixlstash/db_models/deleted_file_log.py +0 -68
  280. pixlstash-1.12.0.dev3/pixlstash/db_models/external_move_review.py +0 -48
  281. pixlstash-1.12.0.dev3/pixlstash/db_models/guest_score.py +0 -63
  282. pixlstash-1.12.0.dev3/pixlstash/db_models/guest_session.py +0 -65
  283. pixlstash-1.12.0.dev3/pixlstash/db_models/mixed_stack.py +0 -186
  284. pixlstash-1.12.0.dev3/pixlstash/db_models/operation.py +0 -110
  285. pixlstash-1.12.0.dev3/pixlstash/db_models/pending_score_invalidation.py +0 -61
  286. pixlstash-1.12.0.dev3/pixlstash/db_models/picture.py +0 -1778
  287. pixlstash-1.12.0.dev3/pixlstash/db_models/picture_likeness.py +0 -289
  288. pixlstash-1.12.0.dev3/pixlstash/db_models/picture_move.py +0 -84
  289. pixlstash-1.12.0.dev3/pixlstash/db_models/picture_stack.py +0 -22
  290. pixlstash-1.12.0.dev3/pixlstash/db_models/project.py +0 -79
  291. pixlstash-1.12.0.dev3/pixlstash/db_models/review.py +0 -68
  292. pixlstash-1.12.0.dev3/pixlstash/db_models/saved_recipe.py +0 -116
  293. pixlstash-1.12.0.dev3/pixlstash/db_models/snapshot.py +0 -49
  294. pixlstash-1.12.0.dev3/pixlstash/db_models/tag_health.py +0 -82
  295. pixlstash-1.12.0.dev3/pixlstash/db_models/tag_prediction.py +0 -154
  296. pixlstash-1.12.0.dev3/pixlstash/db_models/tag_suggestion.py +0 -112
  297. pixlstash-1.12.0.dev3/pixlstash/db_models/tagger_run.py +0 -35
  298. pixlstash-1.12.0.dev3/pixlstash/db_models/user_token.py +0 -92
  299. pixlstash-1.12.0.dev3/pixlstash/event_types.py +0 -38
  300. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/AppButton-C5UiVJwm.css +0 -1
  301. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/AppButton-C_ry1U4M.js +0 -10
  302. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/DuplicateQueue-CmT5SNv8.js +0 -1
  303. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/LibraryInsights-DfGDjjHw.js +0 -1
  304. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/ModelShelf-CBHdZWJH.js +0 -5
  305. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/ModelShelf-D-6BLsrV.css +0 -1
  306. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/MovesReview-BMKVhz4m.js +0 -1
  307. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/PicturePicker-PeeEYUZ2.js +0 -1
  308. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/ReviewSessionsOverlay-C6isy7lr.css +0 -1
  309. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/ReviewSessionsOverlay-XnGvk7Dg.js +0 -1
  310. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/WorkflowInspector-BwuQ0cza.js +0 -1
  311. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/WorkflowInspector-vSr1eTM0.css +0 -1
  312. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/WorkflowRunPanel-BPT_hYR9.css +0 -1
  313. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/WorkflowRunPanel-DnTO6kuD.js +0 -1
  314. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/WorkflowShelf-DD1rYbo8.css +0 -1
  315. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/WorkflowShelf-DFJaycAY.js +0 -1
  316. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/WorkflowsView-C6SHpOra.css +0 -1
  317. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/WorkflowsView-CB1a9thK.js +0 -1
  318. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/dedup-D_jKJwia.js +0 -1
  319. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/index-BhN7fRqz.js +0 -13
  320. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/index-DnhwcB1Q.css +0 -1
  321. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/assets/useNoticeStore-QUuFxe1w.js +0 -1
  322. pixlstash-1.12.0.dev3/pixlstash/frontend/dist/index.html +0 -30
  323. pixlstash-1.12.0.dev3/pixlstash/hub/schema.py +0 -1499
  324. pixlstash-1.12.0.dev3/pixlstash/hub/workflow_card_reads.py +0 -409
  325. pixlstash-1.12.0.dev3/pixlstash/hub/workflow_card_writes.py +0 -614
  326. pixlstash-1.12.0.dev3/pixlstash/hub/workflow_cards.py +0 -573
  327. pixlstash-1.12.0.dev3/pixlstash/hub/workflows.py +0 -1019
  328. pixlstash-1.12.0.dev3/pixlstash/image_plugins/service.py +0 -752
  329. pixlstash-1.12.0.dev3/pixlstash/inference/workflows/description.py +0 -326
  330. pixlstash-1.12.0.dev3/pixlstash/inference/workflows/tagging.py +0 -741
  331. pixlstash-1.12.0.dev3/pixlstash/mcp_server.py +0 -680
  332. pixlstash-1.12.0.dev3/pixlstash/plugin_check.py +0 -444
  333. pixlstash-1.12.0.dev3/pixlstash/routes/characters.py +0 -2137
  334. pixlstash-1.12.0.dev3/pixlstash/routes/comfyui.py +0 -3493
  335. pixlstash-1.12.0.dev3/pixlstash/routes/dedup.py +0 -2745
  336. pixlstash-1.12.0.dev3/pixlstash/routes/filesystem.py +0 -260
  337. pixlstash-1.12.0.dev3/pixlstash/routes/folder_structure.py +0 -1165
  338. pixlstash-1.12.0.dev3/pixlstash/routes/guest_scores.py +0 -340
  339. pixlstash-1.12.0.dev3/pixlstash/routes/libraries.py +0 -864
  340. pixlstash-1.12.0.dev3/pixlstash/routes/model_files.py +0 -833
  341. pixlstash-1.12.0.dev3/pixlstash/routes/model_shelf.py +0 -1414
  342. pixlstash-1.12.0.dev3/pixlstash/routes/picture_sets.py +0 -2144
  343. pixlstash-1.12.0.dev3/pixlstash/routes/pictures/_crud.py +0 -1869
  344. pixlstash-1.12.0.dev3/pixlstash/routes/pictures/_import.py +0 -1675
  345. pixlstash-1.12.0.dev3/pixlstash/routes/pictures/_likeness_search.py +0 -368
  346. pixlstash-1.12.0.dev3/pixlstash/routes/pictures/_listing.py +0 -1755
  347. pixlstash-1.12.0.dev3/pixlstash/routes/pictures/_misc.py +0 -955
  348. pixlstash-1.12.0.dev3/pixlstash/routes/pictures/_search.py +0 -482
  349. pixlstash-1.12.0.dev3/pixlstash/routes/pictures/_thumbnails.py +0 -611
  350. pixlstash-1.12.0.dev3/pixlstash/routes/projects.py +0 -1212
  351. pixlstash-1.12.0.dev3/pixlstash/routes/recipes.py +0 -321
  352. pixlstash-1.12.0.dev3/pixlstash/routes/stacks.py +0 -1634
  353. pixlstash-1.12.0.dev3/pixlstash/routes/taggers.py +0 -255
  354. pixlstash-1.12.0.dev3/pixlstash/routes/workflows.py +0 -2296
  355. pixlstash-1.12.0.dev3/pixlstash/scoring/character_likeness.py +0 -720
  356. pixlstash-1.12.0.dev3/pixlstash/server.py +0 -2050
  357. pixlstash-1.12.0.dev3/pixlstash/services/a1111_recipe.py +0 -452
  358. pixlstash-1.12.0.dev3/pixlstash/services/builtin_models.py +0 -903
  359. pixlstash-1.12.0.dev3/pixlstash/services/comfyui_recipe_service.py +0 -1182
  360. pixlstash-1.12.0.dev3/pixlstash/services/comfyui_service.py +0 -1185
  361. pixlstash-1.12.0.dev3/pixlstash/services/dedup_sweep_service.py +0 -889
  362. pixlstash-1.12.0.dev3/pixlstash/services/dedup_tier_service.py +0 -3184
  363. pixlstash-1.12.0.dev3/pixlstash/services/dedup_verdict_service.py +0 -1989
  364. pixlstash-1.12.0.dev3/pixlstash/services/folder_structure_commit_service.py +0 -1479
  365. pixlstash-1.12.0.dev3/pixlstash/services/folder_structure_service.py +0 -1477
  366. pixlstash-1.12.0.dev3/pixlstash/services/layout_move_service.py +0 -1735
  367. pixlstash-1.12.0.dev3/pixlstash/services/mixed_stack_service.py +0 -1820
  368. pixlstash-1.12.0.dev3/pixlstash/services/model_folder_scanner.py +0 -935
  369. pixlstash-1.12.0.dev3/pixlstash/services/model_shelf_service.py +0 -1084
  370. pixlstash-1.12.0.dev3/pixlstash/services/move_reconciliation_service.py +0 -608
  371. pixlstash-1.12.0.dev3/pixlstash/services/operation_log_service.py +0 -2382
  372. pixlstash-1.12.0.dev3/pixlstash/services/picture_recipe_service.py +0 -266
  373. pixlstash-1.12.0.dev3/pixlstash/services/review_service.py +0 -867
  374. pixlstash-1.12.0.dev3/pixlstash/services/saved_recipe_service.py +0 -515
  375. pixlstash-1.12.0.dev3/pixlstash/services/scrapheap_service.py +0 -1783
  376. pixlstash-1.12.0.dev3/pixlstash/services/search_query_service.py +0 -367
  377. pixlstash-1.12.0.dev3/pixlstash/services/stack_detector.py +0 -786
  378. pixlstash-1.12.0.dev3/pixlstash/services/tag_health_service.py +0 -812
  379. pixlstash-1.12.0.dev3/pixlstash/services/tag_prediction_service.py +0 -370
  380. pixlstash-1.12.0.dev3/pixlstash/services/tag_scan_service.py +0 -689
  381. pixlstash-1.12.0.dev3/pixlstash/services/tag_suggestion_service.py +0 -1027
  382. pixlstash-1.12.0.dev3/pixlstash/services/workflow_bindings.py +0 -470
  383. pixlstash-1.12.0.dev3/pixlstash/services/workflow_card_service.py +0 -712
  384. pixlstash-1.12.0.dev3/pixlstash/services/workflow_events.py +0 -69
  385. pixlstash-1.12.0.dev3/pixlstash/services/workflow_hash.py +0 -1002
  386. pixlstash-1.12.0.dev3/pixlstash/services/workflow_identity.py +0 -595
  387. pixlstash-1.12.0.dev3/pixlstash/services/workflow_inputs.py +0 -168
  388. pixlstash-1.12.0.dev3/pixlstash/services/workflow_io.py +0 -257
  389. pixlstash-1.12.0.dev3/pixlstash/services/workflow_library_service.py +0 -555
  390. pixlstash-1.12.0.dev3/pixlstash/services/workflow_parameters.py +0 -449
  391. pixlstash-1.12.0.dev3/pixlstash/services/workflow_run_service.py +0 -392
  392. pixlstash-1.12.0.dev3/pixlstash/stacking.py +0 -139
  393. pixlstash-1.12.0.dev3/pixlstash/tagger_plugins/florence2.py +0 -1277
  394. pixlstash-1.12.0.dev3/pixlstash/tagger_plugins/pixlstash_tagger.py +0 -1241
  395. pixlstash-1.12.0.dev3/pixlstash/tasks/base_task.py +0 -192
  396. pixlstash-1.12.0.dev3/pixlstash/tasks/checkpoint_hash_task.py +0 -253
  397. pixlstash-1.12.0.dev3/pixlstash/tasks/dedup_scan_task.py +0 -789
  398. pixlstash-1.12.0.dev3/pixlstash/tasks/face_extraction_task.py +0 -1109
  399. pixlstash-1.12.0.dev3/pixlstash/tasks/face_model_refresh_task.py +0 -621
  400. pixlstash-1.12.0.dev3/pixlstash/tasks/image_embedding_task.py +0 -702
  401. pixlstash-1.12.0.dev3/pixlstash/tasks/missing_checkpoint_hash_finder.py +0 -167
  402. pixlstash-1.12.0.dev3/pixlstash/tasks/missing_file_purge_task.py +0 -355
  403. pixlstash-1.12.0.dev3/pixlstash/tasks/missing_ocr_finder.py +0 -76
  404. pixlstash-1.12.0.dev3/pixlstash/tasks/ocr_task.py +0 -200
  405. pixlstash-1.12.0.dev3/pixlstash/tasks/picture_import_task.py +0 -538
  406. pixlstash-1.12.0.dev3/pixlstash/tasks/tag_prediction_backfill_task.py +0 -275
  407. pixlstash-1.12.0.dev3/pixlstash/tasks/tag_task.py +0 -1432
  408. pixlstash-1.12.0.dev3/pixlstash/tasks/task_type.py +0 -45
  409. pixlstash-1.12.0.dev3/pixlstash/tasks/watch_folder_import_task.py +0 -246
  410. pixlstash-1.12.0.dev3/pixlstash/utils/adapter_header.py +0 -704
  411. pixlstash-1.12.0.dev3/pixlstash/utils/comfyui_utilities.py +0 -1035
  412. pixlstash-1.12.0.dev3/pixlstash/utils/http_cache.py +0 -102
  413. pixlstash-1.12.0.dev3/pixlstash/utils/image_processing/face_utils.py +0 -260
  414. pixlstash-1.12.0.dev3/pixlstash/utils/image_processing/image_utils.py +0 -1181
  415. pixlstash-1.12.0.dev3/pixlstash/utils/image_processing/video_utils.py +0 -160
  416. pixlstash-1.12.0.dev3/pixlstash/utils/known_base_models.py +0 -462
  417. pixlstash-1.12.0.dev3/pixlstash/utils/likeness/likeness_parameter_utils.py +0 -499
  418. pixlstash-1.12.0.dev3/pixlstash/utils/model_utils.py +0 -265
  419. pixlstash-1.12.0.dev3/pixlstash/utils/service/export_utils.py +0 -1000
  420. pixlstash-1.12.0.dev3/pixlstash/utils/service/label_ledger.py +0 -245
  421. pixlstash-1.12.0.dev3/pixlstash/vault.py +0 -2216
  422. pixlstash-1.12.0.dev3/pixlstash.egg-info/PKG-INFO +0 -1011
  423. pixlstash-1.12.0.dev3/pixlstash.egg-info/SOURCES.txt +0 -783
  424. pixlstash-1.12.0.dev3/pixlstash.egg-info/requires.txt +0 -45
  425. pixlstash-1.12.0.dev3/pyproject.toml +0 -132
  426. pixlstash-1.12.0.dev3/tests/test_adapter_header.py +0 -374
  427. pixlstash-1.12.0.dev3/tests/test_architecture_guardrails.py +0 -3155
  428. pixlstash-1.12.0.dev3/tests/test_authentication.py +0 -1095
  429. pixlstash-1.12.0.dev3/tests/test_authz_gate_step4.py +0 -845
  430. pixlstash-1.12.0.dev3/tests/test_authz_host_capability_16_3.py +0 -1265
  431. pixlstash-1.12.0.dev3/tests/test_authz_library_pin.py +0 -418
  432. pixlstash-1.12.0.dev3/tests/test_backend_order_stability.py +0 -156
  433. pixlstash-1.12.0.dev3/tests/test_builtin_models.py +0 -1494
  434. pixlstash-1.12.0.dev3/tests/test_checkpoint_hash_finder.py +0 -576
  435. pixlstash-1.12.0.dev3/tests/test_ci_shards.py +0 -1762
  436. pixlstash-1.12.0.dev3/tests/test_clip_text_embedding_similarity.py +0 -676
  437. pixlstash-1.12.0.dev3/tests/test_comfyui_pixlstash_saver.py +0 -262
  438. pixlstash-1.12.0.dev3/tests/test_comfyui_recipe_preflight.py +0 -1170
  439. pixlstash-1.12.0.dev3/tests/test_comfyui_recipe_route.py +0 -1303
  440. pixlstash-1.12.0.dev3/tests/test_comfyui_workflow_extraction.py +0 -329
  441. pixlstash-1.12.0.dev3/tests/test_dedup_sweep_service.py +0 -506
  442. pixlstash-1.12.0.dev3/tests/test_dedup_tier_service.py +0 -2215
  443. pixlstash-1.12.0.dev3/tests/test_dedup_tiers_api.py +0 -2251
  444. pixlstash-1.12.0.dev3/tests/test_facial_features_worker.py +0 -471
  445. pixlstash-1.12.0.dev3/tests/test_folder_structure_commit.py +0 -1730
  446. pixlstash-1.12.0.dev3/tests/test_hub_engine.py +0 -1445
  447. pixlstash-1.12.0.dev3/tests/test_hub_model_shelf_schema.py +0 -833
  448. pixlstash-1.12.0.dev3/tests/test_image_embedding_worker.py +0 -253
  449. pixlstash-1.12.0.dev3/tests/test_inline_rotate.py +0 -1134
  450. pixlstash-1.12.0.dev3/tests/test_install_type_buckets.py +0 -390
  451. pixlstash-1.12.0.dev3/tests/test_invalid_image_endless_retry.py +0 -336
  452. pixlstash-1.12.0.dev3/tests/test_known_base_models.py +0 -109
  453. pixlstash-1.12.0.dev3/tests/test_libraries_routes.py +0 -1627
  454. pixlstash-1.12.0.dev3/tests/test_library_layout.py +0 -3029
  455. pixlstash-1.12.0.dev3/tests/test_library_root_scan.py +0 -604
  456. pixlstash-1.12.0.dev3/tests/test_library_switch.py +0 -1051
  457. pixlstash-1.12.0.dev3/tests/test_likeness_and_face_search.py +0 -812
  458. pixlstash-1.12.0.dev3/tests/test_mcp_server.py +0 -670
  459. pixlstash-1.12.0.dev3/tests/test_metadata_hash_batching.py +0 -537
  460. pixlstash-1.12.0.dev3/tests/test_migrations.py +0 -1539
  461. pixlstash-1.12.0.dev3/tests/test_model_file_classification.py +0 -329
  462. pixlstash-1.12.0.dev3/tests/test_model_folder_scanner.py +0 -870
  463. pixlstash-1.12.0.dev3/tests/test_model_shelf_api.py +0 -6074
  464. pixlstash-1.12.0.dev3/tests/test_ocr_text.py +0 -526
  465. pixlstash-1.12.0.dev3/tests/test_operation_log.py +0 -2284
  466. pixlstash-1.12.0.dev3/tests/test_picture_mutation_scope.py +0 -874
  467. pixlstash-1.12.0.dev3/tests/test_picture_plugins.py +0 -695
  468. pixlstash-1.12.0.dev3/tests/test_picture_recipe.py +0 -270
  469. pixlstash-1.12.0.dev3/tests/test_picture_sets.py +0 -636
  470. pixlstash-1.12.0.dev3/tests/test_picture_sets_query_cost.py +0 -394
  471. pixlstash-1.12.0.dev3/tests/test_pictures_stream.py +0 -382
  472. pixlstash-1.12.0.dev3/tests/test_pipeline_stage_contracts.py +0 -878
  473. pixlstash-1.12.0.dev3/tests/test_plugin_install.py +0 -2264
  474. pixlstash-1.12.0.dev3/tests/test_predicate_filter.py +0 -722
  475. pixlstash-1.12.0.dev3/tests/test_read_token_security.py +0 -2760
  476. pixlstash-1.12.0.dev3/tests/test_reference_folder_listing_count_parity.py +0 -118
  477. pixlstash-1.12.0.dev3/tests/test_reference_folder_watcher.py +0 -156
  478. pixlstash-1.12.0.dev3/tests/test_restore.py +0 -4580
  479. pixlstash-1.12.0.dev3/tests/test_reviews_api.py +0 -1692
  480. pixlstash-1.12.0.dev3/tests/test_saved_recipes.py +0 -1026
  481. pixlstash-1.12.0.dev3/tests/test_scrapheap_retention.py +0 -3140
  482. pixlstash-1.12.0.dev3/tests/test_server.py +0 -2260
  483. pixlstash-1.12.0.dev3/tests/test_smart_score_consistency.py +0 -189
  484. pixlstash-1.12.0.dev3/tests/test_smart_score_invalidation.py +0 -1874
  485. pixlstash-1.12.0.dev3/tests/test_snapshots_auth.py +0 -373
  486. pixlstash-1.12.0.dev3/tests/test_stack_detection.py +0 -1203
  487. pixlstash-1.12.0.dev3/tests/test_stack_leader_scope.py +0 -422
  488. pixlstash-1.12.0.dev3/tests/test_stack_state_filter.py +0 -328
  489. pixlstash-1.12.0.dev3/tests/test_tag_health_api.py +0 -1873
  490. pixlstash-1.12.0.dev3/tests/test_tag_prediction_scope.py +0 -333
  491. pixlstash-1.12.0.dev3/tests/test_tag_predictions_api.py +0 -211
  492. pixlstash-1.12.0.dev3/tests/test_tag_suggestions_api.py +0 -1864
  493. pixlstash-1.12.0.dev3/tests/test_tag_task.py +0 -569
  494. pixlstash-1.12.0.dev3/tests/test_thumbnail_cache_headers.py +0 -273
  495. pixlstash-1.12.0.dev3/tests/test_work_planner.py +0 -1156
  496. pixlstash-1.12.0.dev3/tests/test_workflow_cards.py +0 -479
  497. pixlstash-1.12.0.dev3/tests/test_workflow_identity.py +0 -584
  498. pixlstash-1.12.0.dev3/tests/test_workflow_io.py +0 -1240
  499. pixlstash-1.12.0.dev3/tests/test_workflow_library.py +0 -3421
  500. pixlstash-1.12.0.dev3/tests/test_workflow_parameters.py +0 -431
  501. pixlstash-1.12.0.dev3/tests/test_workflows_api.py +0 -6190
  502. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/LICENSE +0 -0
  503. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/MANIFEST.in +0 -0
  504. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/frontend/LICENSE +0 -0
  505. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/LICENSE +0 -0
  506. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/__init__.py +0 -0
  507. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/alembic.ini +0 -0
  508. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/app.py +0 -0
  509. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/authz/__init__.py +0 -0
  510. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/anchors/builtin_bad.npy +0 -0
  511. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/anchors/builtin_good.npy +0 -0
  512. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/anchors/clipiqa_bad.npy +0 -0
  513. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/anchors/clipiqa_good.npy +0 -0
  514. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/comfyui-workflows/built-in/Flux2-Klein-Image-Edit.json +0 -0
  515. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/comfyui-workflows/built-in/Flux2-Klein-t2i.json +0 -0
  516. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/comfyui-workflows/built-in/Upscale-2x-RealESRGAN.json +0 -0
  517. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/scalar-assets/ScreenshotToken.jpg +0 -0
  518. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/scalar-assets/ScreenshotTokens.jpg +0 -0
  519. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/scalar-assets/ScreenshotsUserSettings.jpg +0 -0
  520. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/scalar-assets/WhereIsUserSettings.jpg +0 -0
  521. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/data/scalar-assets/logo.png +0 -0
  522. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/database.py +0 -0
  523. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/__init__.py +0 -0
  524. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/adapter_attachment.py +0 -0
  525. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/character.py +0 -0
  526. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/detection.py +0 -0
  527. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/entity_project.py +0 -0
  528. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/face.py +0 -0
  529. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/folder_mapping_commit.py +0 -0
  530. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/generation.py +0 -0
  531. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/import_folder.py +0 -0
  532. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/library_settings.py +0 -0
  533. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/metadata.py +0 -0
  534. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/picture_project.py +0 -0
  535. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/picture_set.py +0 -0
  536. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/quality.py +0 -0
  537. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/reference_folder.py +0 -0
  538. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/tag.py +0 -0
  539. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/db_models/user.py +0 -0
  540. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/Empty.png +0 -0
  541. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/EmptyTrash.png +0 -0
  542. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/Logo.png +0 -0
  543. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/Watermark.png +0 -0
  544. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/assets/DuplicateQueue-BhgZD-D8.css +0 -0
  545. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/assets/LibraryInsights-dMJWAwPs.css +0 -0
  546. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/assets/MovesReview-NJRjEk81.css +0 -0
  547. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/assets/PicturePicker-CFBKhqDn.css +0 -0
  548. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/assets/Tiny5-Regular-WaYIHWdr.ttf +0 -0
  549. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
  550. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
  551. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
  552. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
  553. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/favicon.ico +0 -0
  554. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/frontend/dist/vite.svg +0 -0
  555. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/hub/__init__.py +0 -0
  556. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/hub/bootstrap.py +0 -0
  557. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/hub/cli_hint.py +0 -0
  558. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/hub/db.py +0 -0
  559. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/hub/engine.py +0 -0
  560. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/hub/registry.py +0 -0
  561. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_loading_dataset_prepper.py +0 -0
  562. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_plugins/__init__.py +0 -0
  563. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_plugins/base.py +0 -0
  564. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_plugins/built-in/blur_sharpen.py +0 -0
  565. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_plugins/built-in/brightness_contrast.py +0 -0
  566. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_plugins/built-in/colour_filter.py +0 -0
  567. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_plugins/built-in/pixelate.py +0 -0
  568. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_plugins/built-in/plugin_template.py +0 -0
  569. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_plugins/built-in/rotate.py +0 -0
  570. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_plugins/built-in/scaling.py +0 -0
  571. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/image_plugins/registry.py +0 -0
  572. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/inference/__init__.py +0 -0
  573. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/inference/engine.py +0 -0
  574. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/inference/model_lifecycle.py +0 -0
  575. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/inference/vram_budget.py +0 -0
  576. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/inference/workflows/__init__.py +0 -0
  577. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/inference/workflows/clip_embedding.py +0 -0
  578. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/inference/workflows/face_embedding.py +0 -0
  579. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/inference/workflows/text_embedding.py +0 -0
  580. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/listeners.py +0 -0
  581. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/maintenance.py +0 -0
  582. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/middleware/library_admission.py +0 -0
  583. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/env.py +0 -0
  584. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/script.py.mako +0 -0
  585. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0001_baseline.py +0 -0
  586. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0002_add_text_score.py +0 -0
  587. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0003_add_original_file_name.py +0 -0
  588. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0004_add_comfyui_fields.py +0 -0
  589. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0005_add_projects.py +0 -0
  590. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0006_add_attachment_url.py +0 -0
  591. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0007_add_picture_project_id.py +0 -0
  592. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0008_add_compact_mode.py +0 -0
  593. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0009_add_picture_project_membership.py +0 -0
  594. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0010_project_name_uniqueness.py +0 -0
  595. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0011_pictureset_name_uniqueness.py +0 -0
  596. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0012_character_name_uniqueness.py +0 -0
  597. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0013_tag_prediction.py +0 -0
  598. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0014_tag_prediction_composite_index.py +0 -0
  599. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0015_tag_prediction_model_version_rename.py +0 -0
  600. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0016_tag_prediction_confirm_applied.py +0 -0
  601. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0017_anomaly_tag_uncertainty.py +0 -0
  602. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0018_anomaly_tag_uncertainty_disagreement.py +0 -0
  603. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0019_pending_character_id.py +0 -0
  604. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0020_source_picture_id.py +0 -0
  605. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0021_tagger_enabled_flags.py +0 -0
  606. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0022_add_check_for_updates.py +0 -0
  607. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0023_add_show_keyboard_hint.py +0 -0
  608. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0024_add_deleted_file_log.py +0 -0
  609. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0025_add_reference_folders.py +0 -0
  610. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0026_add_caption_file_and_sync_captions.py +0 -0
  611. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0027_add_caption_file_mtime.py +0 -0
  612. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0028_add_smart_score.py +0 -0
  613. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0029_add_import_excluded_to_picture.py +0 -0
  614. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0030_add_import_folders.py +0 -0
  615. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0031_migrate_watch_folders_to_import_folder.py +0 -0
  616. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0032_add_reference_folder_host_path.py +0 -0
  617. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0033_add_import_folder_host_path.py +0 -0
  618. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0034_add_token_scope_fields.py +0 -0
  619. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0035_drop_face_quality.py +0 -0
  620. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0036_add_token_include_attachments.py +0 -0
  621. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0037_add_user_public_url.py +0 -0
  622. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0038_add_watermark_fields.py +0 -0
  623. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0039_drop_color_histogram.py +0 -0
  624. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0040_move_text_score_to_picture.py +0 -0
  625. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0041_guest_scores.py +0 -0
  626. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0042_guest_session_cookie_token.py +0 -0
  627. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0043_pictureset_icon_color.py +0 -0
  628. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0044_add_grid_sort_indexes.py +0 -0
  629. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0045_tagger_settings.py +0 -0
  630. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0046_tag_sentinel_rename.py +0 -0
  631. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0047_add_stack_leader_grid_indexes.py +0 -0
  632. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0048_normalize_stack_positions.py +0 -0
  633. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0049_snapshots.py +0 -0
  634. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0050_reset_metadata_hash_membership.py +0 -0
  635. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0051_deleted_file_log_path_sha.py +0 -0
  636. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0052_drop_import_excluded_sentinel.py +0 -0
  637. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0053_add_face_model_pack.py +0 -0
  638. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0054_add_sidebar_docked.py +0 -0
  639. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0055_add_sidebar_width.py +0 -0
  640. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0056_add_hide_purge_snapshot_warning.py +0 -0
  641. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0057_split_caption_sidecars.py +0 -0
  642. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0058_add_tag_suggestion.py +0 -0
  643. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0059_add_tagger_run.py +0 -0
  644. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0060_tag_prediction_label_ledger.py +0 -0
  645. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0061_add_detection.py +0 -0
  646. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0062_recompute_smart_score_calibrated_anomaly.py +0 -0
  647. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0063_rename_pixelated_tag_to_blocky.py +0 -0
  648. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0064_add_sidebar_pinned.py +0 -0
  649. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0065_add_review_sessions.py +0 -0
  650. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0066_add_tag_health.py +0 -0
  651. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0067_add_tag_health_precision_adj.py +0 -0
  652. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0068_add_picture_split.py +0 -0
  653. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0069_add_tag_eval_slice.py +0 -0
  654. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0070_add_tag_health_eval_candidate_n_pos.py +0 -0
  655. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0071_remove_tag_review_scoring_subsystem.py +0 -0
  656. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0072_add_review_receipt_snapshot_and_suggestion_prior_decision.py +0 -0
  657. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0073_add_pictureset_locked.py +0 -0
  658. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0074_recompute_tag_health_exclude_human_decisions.py +0 -0
  659. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0075_add_tag_health_ground_truth.py +0 -0
  660. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0076_recompute_smart_score_after_stale_tag_edits.py +0 -0
  661. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0077_add_deleted_file_log_file_removed.py +0 -0
  662. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0078_add_reference_folder_pending_reimport.py +0 -0
  663. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0079_add_picture_deleted_at.py +0 -0
  664. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0080_add_thumbnail_dimensions.py +0 -0
  665. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0082_add_thumbnail_size_level.py +0 -0
  666. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0083_recompute_smart_score_unapplied_anomaly_predictions.py +0 -0
  667. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0084_recompute_smart_score_rebalanced_weights.py +0 -0
  668. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0085_recompute_smart_score_restored_builtin_anchors.py +0 -0
  669. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0086_add_operation_log.py +0 -0
  670. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0086_reissue_api_tokens.py +0 -0
  671. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0087_add_entity_project_membership.py +0 -0
  672. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0088_add_dedup_tier_tables.py +0 -0
  673. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0089_add_dedupverdict_reopen_batch_id.py +0 -0
  674. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0090_add_usertoken_public_id.py +0 -0
  675. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0091_add_mixed_stack_cohesion_and_dismissal.py +0 -0
  676. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0092_add_stackcohesion_nearest_edges.py +0 -0
  677. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0093_invalidate_stackcohesion_inputs.py +0 -0
  678. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0094_add_telemetry_consent.py +0 -0
  679. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0095_add_finder_partial_indexes.py +0 -0
  680. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0096_add_picture_is_video.py +0 -0
  681. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0097_add_usertoken_library_uuid.py +0 -0
  682. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0098_add_library_settings.py +0 -0
  683. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0099_guest_tables_reference_token_public_id.py +0 -0
  684. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0100_add_pending_score_invalidation.py +0 -0
  685. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0101_add_settings_fingerprint.py +0 -0
  686. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0102_add_snapshot_identity_scrubbed_at.py +0 -0
  687. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0103_add_adapter_attachment.py +0 -0
  688. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0104_add_picture_orientation.py +0 -0
  689. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0105_add_character_thumbnail_picture.py +0 -0
  690. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0106_add_picture_workflow_hashes.py +0 -0
  691. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0107_add_library_views_settings.py +0 -0
  692. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0108_add_library_layout_and_move_journal.py +0 -0
  693. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0109_add_external_move_review.py +0 -0
  694. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0110_add_folder_mapping_commit.py +0 -0
  695. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0111_add_text_embedding_missing_index.py +0 -0
  696. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0112_add_image_embedding_probe_indexes.py +0 -0
  697. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0113_reset_size_bin_without_likeness_parameters.py +0 -0
  698. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0114_remove_views_and_project_cover.py +0 -0
  699. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0115_add_folder_mapping_commit_captions.py +0 -0
  700. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0116_add_library_settings_caption_sync.py +0 -0
  701. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0117_add_pending_ghost_cascade.py +0 -0
  702. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0118_add_generation_tables.py +0 -0
  703. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0119_rescan_pictures_for_a1111_recipes.py +0 -0
  704. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0120_add_picture_ocr_text.py +0 -0
  705. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/migrations/versions/0121_add_saved_recipe.py +0 -0
  706. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/openapi_custom.py +0 -0
  707. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/pixl_logging.py +0 -0
  708. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/plugin_create.py +0 -0
  709. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/plugin_install.py +0 -0
  710. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/route_inventory.py +0 -0
  711. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/__init__.py +0 -0
  712. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/_helpers.py +0 -0
  713. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/characters_faces.py +0 -0
  714. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/config.py +0 -0
  715. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/import_folders.py +0 -0
  716. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/insights.py +0 -0
  717. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/library_captions.py +0 -0
  718. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/library_layout.py +0 -0
  719. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/model_folders.py +0 -0
  720. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/model_icons.py +0 -0
  721. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/model_imports.py +0 -0
  722. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/model_moves.py +0 -0
  723. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/model_stacks.py +0 -0
  724. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/moves.py +0 -0
  725. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/operations.py +0 -0
  726. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/pictures/__init__.py +0 -0
  727. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/pictures/_anomaly.py +0 -0
  728. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/pictures/_character_likeness.py +0 -0
  729. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/pictures/_export.py +0 -0
  730. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/pictures/_face_search.py +0 -0
  731. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/pictures/_faces.py +0 -0
  732. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/pictures/_helpers.py +0 -0
  733. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/pictures/_serving.py +0 -0
  734. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/pictures/_text.py +0 -0
  735. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/reference_folders.py +0 -0
  736. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/reviews.py +0 -0
  737. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/share.py +0 -0
  738. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/snapshots.py +0 -0
  739. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/tag_health.py +0 -0
  740. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/tag_predictions.py +0 -0
  741. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/tag_suggestions.py +0 -0
  742. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/tagger_runs.py +0 -0
  743. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/tags.py +0 -0
  744. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/telemetry.py +0 -0
  745. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/routes/test_hooks.py +0 -0
  746. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/scoring/__init__.py +0 -0
  747. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/scoring/smart_score.py +0 -0
  748. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/server_config_io.py +0 -0
  749. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/__init__.py +0 -0
  750. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/builtin_caches.py +0 -0
  751. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/config_service.py +0 -0
  752. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/import_dedup_service.py +0 -0
  753. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/impossible_tag_clear_service.py +0 -0
  754. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/keep_cover_only_service.py +0 -0
  755. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/layout_migration_service.py +0 -0
  756. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/library_backup_service.py +0 -0
  757. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/library_generation_coordinator.py +0 -0
  758. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/library_insights_service.py +0 -0
  759. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/library_restore_service.py +0 -0
  760. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/library_settings_service.py +0 -0
  761. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/library_switch_service.py +0 -0
  762. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/managed_model_store.py +0 -0
  763. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/model_features.py +0 -0
  764. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/model_icons.py +0 -0
  765. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/model_mover.py +0 -0
  766. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/picture_service.py +0 -0
  767. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/plugin_service.py +0 -0
  768. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/portable_identity.py +0 -0
  769. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/project_membership_service.py +0 -0
  770. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/restore/__init__.py +0 -0
  771. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/restore/_models.py +0 -0
  772. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/restore/full_restore.py +0 -0
  773. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/restore/preview.py +0 -0
  774. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/restore/resource_restore.py +0 -0
  775. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/restore/schema_upgrade.py +0 -0
  776. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/run_importer.py +0 -0
  777. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/set_lock_service.py +0 -0
  778. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/share_service.py +0 -0
  779. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/snapshot_service.py +0 -0
  780. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/stack_membership.py +0 -0
  781. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/tagger_run_service.py +0 -0
  782. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/workflow_ghost_service.py +0 -0
  783. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/services/workflow_inbox.py +0 -0
  784. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/ssl_setup.py +0 -0
  785. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/startup_checks.py +0 -0
  786. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/startup_permissions.py +0 -0
  787. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tagger_plugins/__init__.py +0 -0
  788. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tagger_plugins/base.py +0 -0
  789. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tagger_plugins/clip_service.py +0 -0
  790. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tagger_plugins/joycaption.py +0 -0
  791. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tagger_plugins/plugin_template.py +0 -0
  792. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tagger_plugins/registry.py +0 -0
  793. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tagger_plugins/sbert.py +0 -0
  794. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tagger_plugins/wd14.py +0 -0
  795. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/task_runner.py +0 -0
  796. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/__init__.py +0 -0
  797. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/base_task_finder.py +0 -0
  798. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/comfyui_extraction_task.py +0 -0
  799. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/dedup_scan_finder.py +0 -0
  800. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/description_task.py +0 -0
  801. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/detection_task.py +0 -0
  802. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/ensure_gfs_snapshot_finder.py +0 -0
  803. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/ensure_gfs_snapshot_task.py +0 -0
  804. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/face_detection_task.py +0 -0
  805. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/ghost_cascade_finder.py +0 -0
  806. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/ghost_cascade_task.py +0 -0
  807. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/layout_move_finder.py +0 -0
  808. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/layout_move_task.py +0 -0
  809. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/likeness_parameters_task.py +0 -0
  810. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/likeness_task.py +0 -0
  811. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_comfyui_extraction_finder.py +0 -0
  812. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_description_finder.py +0 -0
  813. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_face_extraction_finder.py +0 -0
  814. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_face_model_refresh_finder.py +0 -0
  815. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_file_purge_finder.py +0 -0
  816. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_image_embedding_finder.py +0 -0
  817. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_likeness_finder.py +0 -0
  818. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_likeness_parameters_finder.py +0 -0
  819. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_orientation_finder.py +0 -0
  820. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_pixel_sha_finder.py +0 -0
  821. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_quality_finder.py +0 -0
  822. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_smart_score_finder.py +0 -0
  823. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_snapshot_identity_scrub_finder.py +0 -0
  824. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_source_face_likeness_finder.py +0 -0
  825. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_stack_cohesion_finder.py +0 -0
  826. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_tag_finder.py +0 -0
  827. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_tag_prediction_finder.py +0 -0
  828. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_text_embedding_finder.py +0 -0
  829. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_text_score_finder.py +0 -0
  830. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_thumbnail_finder.py +0 -0
  831. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/missing_watch_folder_import_finder.py +0 -0
  832. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/model_folder_scan_task.py +0 -0
  833. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/orientation_task.py +0 -0
  834. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/pending_score_invalidation_finder.py +0 -0
  835. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/pending_score_invalidation_task.py +0 -0
  836. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/pixel_sha_task.py +0 -0
  837. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/quality_task.py +0 -0
  838. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/reference_folder_scan_finder.py +0 -0
  839. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/reference_folder_scan_task.py +0 -0
  840. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/scrapheap_retention_purge_finder.py +0 -0
  841. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/scrapheap_retention_purge_task.py +0 -0
  842. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/smart_score_task.py +0 -0
  843. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/snapshot_identity_scrub_task.py +0 -0
  844. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/source_face_likeness_task.py +0 -0
  845. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/stack_cohesion_task.py +0 -0
  846. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/tag_health_auto_rebuild_finder.py +0 -0
  847. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/tag_health_auto_rebuild_task.py +0 -0
  848. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/tag_health_rebuild_task.py +0 -0
  849. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/text_embedding_task.py +0 -0
  850. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/text_score_task.py +0 -0
  851. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/thumbnail_generation_task.py +0 -0
  852. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/workflow_card_backfill_finder.py +0 -0
  853. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/tasks/workflow_card_backfill_task.py +0 -0
  854. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/telemetry/__init__.py +0 -0
  855. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/telemetry/install_id.py +0 -0
  856. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/telemetry/sender.py +0 -0
  857. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/trusted_sqlite.py +0 -0
  858. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/__init__.py +0 -0
  859. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/accelerator.py +0 -0
  860. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/aitoolkit_run.py +0 -0
  861. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/atomic_write.py +0 -0
  862. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/caption_file_utils.py +0 -0
  863. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/face_tags.py +0 -0
  864. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/field_allowlist.py +0 -0
  865. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/host_open.py +0 -0
  866. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/host_path_utils.py +0 -0
  867. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/image_processing/__init__.py +0 -0
  868. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/image_processing/orientation.py +0 -0
  869. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/insightface_batched.py +0 -0
  870. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/insightface_model_utils.py +0 -0
  871. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/library_layout.py +0 -0
  872. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/library_roots.py +0 -0
  873. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/likeness/__init__.py +0 -0
  874. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/likeness/likeness_utils.py +0 -0
  875. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/media_files.py +0 -0
  876. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/near_neighbor.py +0 -0
  877. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/path_mapper.py +0 -0
  878. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/path_utils.py +0 -0
  879. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/quality/__init__.py +0 -0
  880. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/quality/anomaly_penalty.py +0 -0
  881. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/quality/quality_utils.py +0 -0
  882. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/quality/smart_score_utils.py +0 -0
  883. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/query/__init__.py +0 -0
  884. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/query/predicate_filter.py +0 -0
  885. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/rate_limiter.py +0 -0
  886. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/reference_folder_validator.py +0 -0
  887. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/reference_folder_watcher.py +0 -0
  888. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/request_origin.py +0 -0
  889. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/serialization_utils.py +0 -0
  890. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/service/__init__.py +0 -0
  891. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/service/anomaly_thresholds.py +0 -0
  892. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/service/caption_utils.py +0 -0
  893. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/service/filter_helpers.py +0 -0
  894. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/service/person_tags.py +0 -0
  895. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/service/picture_stats.py +0 -0
  896. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/service/scope_table.py +0 -0
  897. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/service/smart_score_invalidation.py +0 -0
  898. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/service/tag_prediction_utils.py +0 -0
  899. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/service/user_settings_utils.py +0 -0
  900. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/snapshot_compression.py +0 -0
  901. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/sql_chunking.py +0 -0
  902. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/stack/__init__.py +0 -0
  903. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/stack/stack_utils.py +0 -0
  904. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/system_utils.py +0 -0
  905. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/tag_reset_registry.py +0 -0
  906. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/unprocessable_image_registry.py +0 -0
  907. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/vram_utils.py +0 -0
  908. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/utils/watermark.py +0 -0
  909. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/work_planner.py +0 -0
  910. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/worker_config.py +0 -0
  911. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/ws/__init__.py +0 -0
  912. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash/ws/broadcaster.py +0 -0
  913. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash.egg-info/dependency_links.txt +0 -0
  914. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash.egg-info/entry_points.txt +0 -0
  915. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/pixlstash.egg-info/top_level.txt +0 -0
  916. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/setup.cfg +0 -0
  917. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/setup.py +0 -0
  918. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_adapter_attachment.py +0 -0
  919. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_aitoolkit_run.py +0 -0
  920. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_anomaly_penalty.py +0 -0
  921. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_anomaly_region_scope.py +0 -0
  922. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_anomaly_thresholds_cache.py +0 -0
  923. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_api_coverage.py +0 -0
  924. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_app_permission_repair.py +0 -0
  925. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_async_import_staging.py +0 -0
  926. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_auth_read_path.py +0 -0
  927. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_authz_gate_step3.py +0 -0
  928. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_batch_apply_scores.py +0 -0
  929. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_batch_character_likeness_scope.py +0 -0
  930. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_build_desktop_runtime.py +0 -0
  931. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_character_face_assignment.py +0 -0
  932. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_characters_api.py +0 -0
  933. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_cli_documentation.py +0 -0
  934. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_comfyui_api_prompt_extraction.py +0 -0
  935. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_comfyui_stack_filter.py +0 -0
  936. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_comfyui_submit_prompt.py +0 -0
  937. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_database_engine_config.py +0 -0
  938. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_dedup_mixed_stacks.py +0 -0
  939. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_dedup_sweep_api.py +0 -0
  940. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_dedup_verdict_service.py +0 -0
  941. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_default_device_override.py +0 -0
  942. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_description_cancel_blanking.py +0 -0
  943. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_detection_florence.py +0 -0
  944. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_detection_model.py +0 -0
  945. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_detections_scope.py +0 -0
  946. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_docker_demo_hub_rewrite.py +0 -0
  947. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_docker_windows_host_paths.py +0 -0
  948. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_except_hygiene_guardrail.py +0 -0
  949. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_export_api.py +0 -0
  950. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_face_detection_extreme_aspect_ratio.py +0 -0
  951. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_face_extraction_speed.py +0 -0
  952. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_face_score_aggregation.py +0 -0
  953. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_find_orphaned_files.py +0 -0
  954. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_finder_query_cost.py +0 -0
  955. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_florence.py +0 -0
  956. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_florence_model_variant.py +0 -0
  957. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_folder_structure_read.py +0 -0
  958. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_full_pipeline.py +0 -0
  959. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_gfs_snapshot_schedule.py +0 -0
  960. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_guest_scoring.py +0 -0
  961. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_hub_bootstrap.py +0 -0
  962. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_hub_registry.py +0 -0
  963. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_identity_storage_guardrail.py +0 -0
  964. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_image_plugins_api.py +0 -0
  965. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_import_scrapheap_match.py +0 -0
  966. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_impossible_clear.py +0 -0
  967. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_impossible_clear_authz.py +0 -0
  968. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_impossible_filter.py +0 -0
  969. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_index_install_type.py +0 -0
  970. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_insightface_model_pack.py +0 -0
  971. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_insightface_relocation.py +0 -0
  972. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_ip_locality_fail_closed.py +0 -0
  973. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_justified_thumbnails.py +0 -0
  974. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_keep_cover_only.py +0 -0
  975. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_label_ledger.py +0 -0
  976. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_library_backup.py +0 -0
  977. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_library_caption_sync.py +0 -0
  978. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_library_destination_blocklist.py +0 -0
  979. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_library_generation_coordinator.py +0 -0
  980. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_library_insights.py +0 -0
  981. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_library_restore_cli.py +0 -0
  982. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_library_settings.py +0 -0
  983. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_likeness_worker.py +0 -0
  984. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_managed_model_store.py +0 -0
  985. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_many_to_many_face_data.py +0 -0
  986. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_metadata_hash.py +0 -0
  987. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_model_icons.py +0 -0
  988. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_model_move.py +0 -0
  989. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_model_run_import.py +0 -0
  990. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_model_shelf_fixtures.py +0 -0
  991. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_model_shelf_library_fixture.py +0 -0
  992. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_model_shelf_scan_invariants.py +0 -0
  993. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_model_unload_race.py +0 -0
  994. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_mps_device_check.py +0 -0
  995. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_mps_memory_and_providers.py +0 -0
  996. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_near_neighbor.py +0 -0
  997. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_openapi_response_schemas.py +0 -0
  998. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_orientation.py +0 -0
  999. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_path_containment.py +0 -0
  1000. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_pending_score_invalidation.py +0 -0
  1001. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_person_tags.py +0 -0
  1002. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_picture_is_video.py +0 -0
  1003. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_picture_set_locking.py +0 -0
  1004. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_picture_stack_utils.py +0 -0
  1005. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_pipeline_throughput_verification.py +0 -0
  1006. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_plugin_create.py +0 -0
  1007. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_plugin_lifecycle_gaps.py +0 -0
  1008. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_process_teardown.py +0 -0
  1009. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_project_membership_service.py +0 -0
  1010. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_projects_api.py +0 -0
  1011. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_quality_task_shutdown.py +0 -0
  1012. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_rate_limiter.py +0 -0
  1013. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_reference_folder_moves.py +0 -0
  1014. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_reference_folder_sidecars.py +0 -0
  1015. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_repair_copied_face_rows.py +0 -0
  1016. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_rocm_device_check.py +0 -0
  1017. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_root_scan_first_import.py +0 -0
  1018. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_scope_table.py +0 -0
  1019. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_score_agreement_stats.py +0 -0
  1020. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_security_supported_versions.py +0 -0
  1021. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_server_external_listener.py +0 -0
  1022. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_server_simple.py +0 -0
  1023. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_share_link_library_pin.py +0 -0
  1024. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_sidebar_counts_query_cost.py +0 -0
  1025. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_snapshot_compression.py +0 -0
  1026. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_snapshots.py +0 -0
  1027. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_ssl_generation.py +0 -0
  1028. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_stack_position_invariant.py +0 -0
  1029. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_stacks_api.py +0 -0
  1030. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_stacks_membership.py +0 -0
  1031. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_startup_banner_encoding.py +0 -0
  1032. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_startup_permissions.py +0 -0
  1033. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_stats_api.py +0 -0
  1034. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_system_utils.py +0 -0
  1035. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_tag_prediction_backfill.py +0 -0
  1036. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_tag_worker.py +0 -0
  1037. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_tagger_plugin_registry.py +0 -0
  1038. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_tagger_runs_api.py +0 -0
  1039. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_tagger_user_plugins.py +0 -0
  1040. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_telemetry_install_id.py +0 -0
  1041. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_telemetry_install_id_authz.py +0 -0
  1042. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_telemetry_sender.py +0 -0
  1043. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_temp_vault_first_import.py +0 -0
  1044. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_thumbnail_location.py +0 -0
  1045. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_token_identity.py +0 -0
  1046. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_user_settings_tagger_settings.py +0 -0
  1047. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_vram_batch_budget.py +0 -0
  1048. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_vram_oom_retry.py +0 -0
  1049. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_watch_folder_worker.py +0 -0
  1050. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_websocket_auth.py +0 -0
  1051. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_workers_api.py +0 -0
  1052. {pixlstash-1.12.0.dev3 → pixlstash-1.12.0.dev4}/tests/test_ws_broadcaster.py +0 -0
@@ -0,0 +1,1070 @@
1
+ Metadata-Version: 2.4
2
+ Name: pixlstash
3
+ Version: 1.12.0.dev4
4
+ Summary: Self-hosted picture library with AI tagging, semantic search, and a clean web UI
5
+ Author-email: Gaute Lindkvist <lindkvis@gmail.com>
6
+ License-Expression: GPL-3.0-only AND MIT
7
+ Project-URL: Homepage, https://pikselkroken.github.io/pixlstash
8
+ Project-URL: Repository, https://github.com/pikselkroken/pixlstash
9
+ Project-URL: Bug Tracker, https://github.com/pikselkroken/pixlstash/issues
10
+ Project-URL: Changelog, https://github.com/pikselkroken/pixlstash/releases
11
+ Keywords: image library,AI tagging,semantic search,photo management,self-hosted,comfyui
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: End Users/Desktop
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Environment :: GPU :: NVIDIA CUDA
19
+ Classifier: Topic :: Multimedia :: Graphics
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Requires-Python: >=3.11
22
+ Description-Content-Type: text/markdown
23
+ License-File: pixlstash/LICENSE
24
+ License-File: frontend/LICENSE
25
+ Requires-Dist: open_clip_torch>=3.3.0
26
+ Requires-Dist: fastapi>=0.138.0
27
+ Requires-Dist: uvicorn>=0.41.0
28
+ Requires-Dist: uvicorn[standard]>=0.41.0
29
+ Requires-Dist: numpy>=2.4.3
30
+ Requires-Dist: pillow>=12.3.0
31
+ Requires-Dist: opencv-python>=4.13.0.92
32
+ Requires-Dist: scipy>=1.17.1
33
+ Requires-Dist: platformdirs>=4.9.4
34
+ Requires-Dist: send2trash>=2.1.0
35
+ Requires-Dist: tomli>=2.4.0
36
+ Requires-Dist: colorlog>=6.10.1
37
+ Requires-Dist: python-multipart>=0.0.22
38
+ Requires-Dist: onnxruntime>=1.24.3
39
+ Requires-Dist: requests>=2.32.5
40
+ Requires-Dist: accelerate~=1.13
41
+ Requires-Dist: transformers~=5.12
42
+ Requires-Dist: bitsandbytes>=0.44.0
43
+ Requires-Dist: torch~=2.12
44
+ Requires-Dist: torchvision~=0.27
45
+ Requires-Dist: insightface>=0.7.3
46
+ Requires-Dist: rapidfuzz>=3.14.3
47
+ Requires-Dist: tqdm>=4.67.3
48
+ Requires-Dist: sentence_transformers~=5.2
49
+ Requires-Dist: pillow-heif>=1.3.0
50
+ Requires-Dist: sqlmodel>=0.0.45
51
+ Requires-Dist: alembic>=1.18.4
52
+ Requires-Dist: python-jose[cryptography]>=3.5.0
53
+ Requires-Dist: passlib>=1.7.4
54
+ Requires-Dist: bcrypt<4.0.0,>=3.2.2
55
+ Requires-Dist: nvidia-ml-py>=13.590.48
56
+ Requires-Dist: piexif>=1.1.3
57
+ Requires-Dist: watchdog>=4.0.0
58
+ Requires-Dist: click~=8.1.8
59
+ Requires-Dist: zstandard>=0.23.0
60
+ Provides-Extra: test
61
+ Requires-Dist: pytest; extra == "test"
62
+ Requires-Dist: pytest-cov; extra == "test"
63
+ Requires-Dist: pytest-xdist; extra == "test"
64
+ Requires-Dist: psutil; extra == "test"
65
+ Requires-Dist: httpx>=0.28.1; extra == "test"
66
+ Provides-Extra: dev
67
+ Requires-Dist: ruff<0.16; extra == "dev"
68
+ Dynamic: license-file
69
+
70
+ # PixlStash
71
+ <p align="center">
72
+ <img src="website/assets/ScreenshotGrid.jpg" alt="PixlStash Screenshot" width="800"/>
73
+ </p>
74
+
75
+ PixlStash is a local picture library server for organizing, filtering, and reviewing large image collections.
76
+
77
+ It provides:
78
+
79
+ - A desktop application or a headless server with a browser-based interface
80
+ - Semantic search across the whole library with CLIP text queries, tagged or not (OpenCLIP ViT-B-32)
81
+ - Face detection, face recognition and automatic grouping into named characters (InsightFace SCRFD-10G, buffalo_l or AuraFace), plus reverse face search
82
+ - Automatic tagging and image descriptions with selectable AI engines (our own PixlStash Tagger, WD14, Florence-2, JoyCaption), chosen per request
83
+ - Object segmentation, and reverse likeness search on CLIP embeddings
84
+ - A tag review queue and a per-tag health board, so auto-tags become tags you can trust
85
+ - Smart score sorting, character-likeness scoring, and calibrated anomaly detection for malformed anatomy
86
+ - Every model runs on your own hardware (CPU, NVIDIA CUDA, or experimental AMD ROCm). No cloud API
87
+ - Re-tag or regenerate descriptions for any selection directly from the context menu
88
+ - Instant grid loading — thumbnails appear immediately, metadata fills in asynchronously
89
+ - Fast metadata and tag filtering
90
+ - Character and set organization
91
+ - Local storage of your library data
92
+ - API for integrating with other tools
93
+ - Simple keyboard shortcuts for scoring, selection, tagging, deletion and navigation.
94
+ - Integration with ComfyUI for running workflows on selected images within PixlStash.
95
+ - Plugin system for defining new filter operations that can be performed on a set of images.
96
+ - Sharing of pictures, picture sets, characters and projects.
97
+ - Persistent view URLs — bookmark or refresh any view and land exactly where you left off.
98
+ - Undo and Redo with keyboard shortcuts and history
99
+ - Deduplication helper
100
+ - Tag review helper
101
+ - A model overview for keeping track of your generative AI models
102
+ - Swappable image library
103
+ - Scriptable backup
104
+
105
+ PixlStash runs on your machine and serves the UI at a local (or Internet-facing) web address.
106
+
107
+ ## How is this different from Immich?
108
+
109
+ Immich is a very good home photo server. If that's what you need, use it! PixlStash does a different job.
110
+
111
+ **PixlStash does both of the AI features Immich is known for.** CLIP semantic
112
+ search and InsightFace face recognition are in here too, along with duplicate
113
+ detection. Immich documents two machine-learning tasks, smart search and facial
114
+ recognition, and does them well for the job it is built for: finding a photo you
115
+ already took. Immich also has OCR and mobile apps with background sync, which
116
+ PixlStash does not.
117
+
118
+ What PixlStash adds is everything that happens *after* you have found the
119
+ pictures. It is a tool for working with images rather than just storing them,
120
+ though it works as a home server too:
121
+
122
+ - Automatic tagging and captioning, with the engine selectable per request
123
+ - A tag review queue and a tag health board, so auto-tags are verified rather than trusted
124
+ - Quality, anomaly and character-likeness scoring, so a large set sorts by what is worth looking at
125
+ - Segmentation, reverse face search and reverse likeness search
126
+ - Dataset export, and ai-toolkit run import with sample images and version history
127
+ - Two-way ComfyUI integration: control ComfyUI from PixlStash, or call its nodes from your own workflows. Generated images return tagged, with People, Picture Set, and Project associations attached
128
+ - A tagger plugin API, so a model we have never heard of shows up in the engine picker
129
+
130
+ Full breakdown, including a capability-by-capability comparison table:
131
+ [pixlstash.dev/ai.html](https://pixlstash.dev/ai.html).
132
+
133
+ ## Install or try PixlStash
134
+
135
+ <p align="center">
136
+ <a href="https://pixlstash.dev/install.html">
137
+ <img src="website/assets/install-banner.svg" alt="Install PixlStash" width="320"/>
138
+ </a>
139
+ &nbsp;
140
+ <a href="https://demo.pixlstash.dev?token=o75qQ-w0fy_FraPb2sdxcGOVTBoKFmmZwStycljomSs">
141
+ <img src="website/assets/demo-banner.svg" alt="Try the Demo" width="320"/>
142
+ </a>
143
+ </p>
144
+
145
+ PixlStash is available as a **native desktop app for Windows, macOS (Apple
146
+ Silicon), and Linux** (no Python or browser tab required), as a Docker image, or
147
+ as a pip package that runs anywhere Python does (including Intel Macs). The
148
+ desktop app ships a ready-to-run CPU runtime,
149
+ so it works offline out of the box, and auto-detects your hardware to offer
150
+ optional GPU acceleration (NVIDIA CUDA, or experimental AMD ROCm), which it
151
+ installs on demand straight from PyPI / PyTorch.
152
+
153
+ Detailed installation instructions on <a href="http://pixlstash.dev/install.html">pixlstash.dev</a>.
154
+
155
+
156
+ ## First run and data location
157
+
158
+ On first run, PixlStash creates a user config directory and stores:
159
+
160
+ - Server config
161
+ - Database
162
+ - Imported media files
163
+
164
+ The **desktop app** uses this same platform user data directory, so a desktop
165
+ install shares its library with a pip or Docker install on the same machine. If
166
+ you add GPU acceleration, the desktop app stores the downloaded GPU wheels under
167
+ the app's own user-data directory.
168
+
169
+ > **Model downloads:** On first startup, PixlStash automatically downloads the AI models required for tagging, captioning, and quality scoring. This includes several hundred MB of model weights. Downloads are stored in the platform user data directory:
170
+ >
171
+ > | OS | Path |
172
+ > |----|------|
173
+ > | **Linux** | `~/.local/share/pixlstash/downloaded_models/` |
174
+ > | **macOS** | `~/Library/Application Support/pixlstash/downloaded_models/` |
175
+ > | **Windows** | `%LOCALAPPDATA%\pixlstash\downloaded_models\` |
176
+ >
177
+ > An internet connection is required the first time the server starts. Subsequent starts use the cached models.
178
+ >
179
+ > **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).
180
+
181
+ If you need to use a custom config path:
182
+
183
+ ```bash
184
+ python -m pixlstash.app --server-config "C:\path\to\server-config.json"
185
+ ```
186
+
187
+ ## Multiple libraries
188
+
189
+ PixlStash can register several independent image libraries and keep one open at
190
+ a time. Pictures, tags, scores, snapshots, guest sessions, and guest scores stay
191
+ with their library; your owner account and preferences stay with the
192
+ installation. API tokens and share links are pinned to the library where they
193
+ were created: they become inactive while a different library is open and work
194
+ again when you switch back.
195
+
196
+ **Settings → Libraries** does all of it: add a library, rename one, switch
197
+ between them, and stop using one. **Add a library…** takes a single folder and
198
+ works out what it is — a library you already made is added as it is, with its
199
+ tags, scores and people; a folder of pictures is brought in as it stands; an
200
+ empty folder starts a fresh library. Nothing in that folder is moved, renamed
201
+ or copied.
202
+
203
+ **Stop using this** removes no file. PixlStash forgets the library, everything
204
+ inside the folder stays where it is, and adding the folder again brings back its
205
+ tags and its share links. The library you have open cannot be forgotten — switch
206
+ away from it first.
207
+
208
+ Managing libraries is available on the machine running PixlStash, or over your
209
+ local network or Tailscale, because it points the server at folders on that
210
+ machine. A session from further away can **see** the list — the names, and which
211
+ one is open — and nothing more: switching is on that same footing as adding and
212
+ removing, because it reloads every connected client and takes the outgoing
213
+ library's share links offline. It also sees no folder paths. Set
214
+ `allow_remote_host_ops` in server settings to lift all of it at once.
215
+
216
+ ### The library command line
217
+
218
+ The same things can be done from a terminal, which is what a script or a cron
219
+ job wants. **Settings → Libraries** shows the exact command for your
220
+ installation, with a copy button.
221
+
222
+ Run these on the machine hosting PixlStash, as the OS user that owns `hub.db`,
223
+ **with the same environment active that the server runs in** (activate the venv,
224
+ or use the same interpreter). That is the one assumption the short form makes;
225
+ if the commands are not found, see [Which form to type](#which-form-to-type)
226
+ below.
227
+
228
+ ```bash
229
+ pixlstash-cli libraries list
230
+ pixlstash-cli libraries create /path/to/new-library --name "New library"
231
+ pixlstash-cli libraries attach /path/to/existing-library --name "Existing library"
232
+ pixlstash-cli libraries rename "Existing library" "Better name"
233
+ pixlstash-cli libraries relocate "Existing library" /new/path
234
+ pixlstash-cli libraries detach "Existing library"
235
+ pixlstash-cli libraries backup "Existing library" /path/to/backups/
236
+ pixlstash-cli libraries backup "Existing library" /path/to/backups/monday.tar.zst
237
+ pixlstash-cli libraries restore /path/to/backups/monday.tar.zst /path/to/new-library
238
+ ```
239
+
240
+ | Command | What it does |
241
+ | --- | --- |
242
+ | `list` | Shows every registered library and marks the active one. |
243
+ | `create` | Creates the folder, starts an empty library in it, and registers it. |
244
+ | `attach` | Registers a library folder that already exists on disk. |
245
+ | `rename` | Changes the display name. Nothing on disk moves. |
246
+ | `relocate` | Points an existing registration at a new path, keeping its identity and share links. |
247
+ | `detach` | Forgets a library. **No files are removed and nothing inside the folder changes.** |
248
+ | `backup` | Writes the library and the hub to a single archive. |
249
+ | `restore` | Unpacks an archive into a **new** folder and makes it the library that opens. |
250
+
251
+ Notes worth knowing before you need them:
252
+
253
+ - `detach` refuses the **active** library. Switch to another one first.
254
+ - Reattaching the same folder revives its original registration, including its
255
+ share links, because a library carries a fingerprint of its own identity.
256
+ - A backup is a **zstd-compressed tar**, named `.tar.zst` — not `.tar.gz`.
257
+ `--no-compress` writes a plain `.tar` instead. Given a folder, `backup`
258
+ invents a dated name with the right ending; given a filename, it adds the
259
+ right ending if you left it off. `restore` recognises an archive by its
260
+ contents, so a renamed file still works.
261
+ - A backup contains `hub.db`, and therefore your login and token secrets.
262
+ PixlStash writes it owner-readable and refuses to overwrite an existing file.
263
+ - A backup covers the library folder. Pictures kept in **reference folders** live
264
+ outside it and are *not* included, so back those up separately.
265
+ - Backing up finishes any outstanding one-time snapshot cleanup first, so the
266
+ archive never carries credentials from before your upgrade.
267
+ - `restore` needs PixlStash stopped, and names a folder that is empty or does
268
+ not exist yet — it never writes over a library. Because the archive holds the hub,
269
+ restoring also brings back the password and API tokens that library was
270
+ using, so your current ones are replaced.
271
+ - **`restore` does not delete your current setup.** It *moves*
272
+ `server-config.json` and `hub.db` into a dated `pre-restore-*` folder beside
273
+ themselves and prints the launch command for each, so
274
+ `pixlstash-server --server-config <pre-restore-*>/server-config.json` reopens
275
+ what you had. Your old library folder is never touched.
276
+
277
+ #### Which form to type
278
+
279
+ The commands above assume `pixlstash-cli` is on your `PATH`, which is true once
280
+ the environment PixlStash is installed into is active.
281
+
282
+ - **Source checkout**, or an environment you have not activated:
283
+ `python -m pixlstash.cli libraries list`
284
+ - **Docker Compose**, for a running service (paths are inside the container):
285
+ `docker compose exec pixlstash pixlstash-cli libraries list`
286
+ - **Desktop app** (AppImage, deb, .dmg, installer): the app is its own CLI, so
287
+ `/path/to/PixlStash.AppImage cli libraries list` works whether or not the app
288
+ is running. On Windows that route is the bundled interpreter instead, because
289
+ the app's own launcher is a GUI binary no shell waits for. Turn on Settings ›
290
+ Backend › Desktop › **Shell command** to get a `pixlstash` command
291
+ (`~/.local/bin` on Linux and macOS, `%LOCALAPPDATA%\PixlStash\bin` — added to
292
+ your user `PATH` — on Windows) and type `pixlstash libraries list` instead;
293
+ open a new terminal afterwards. Either form targets the desktop app's own hub;
294
+ there is no need to pass `--hub`. Settings › Libraries always shows the exact
295
+ command for your install.
296
+ - **A different hub** than the default: put global options *before* `libraries`,
297
+ e.g. `pixlstash-cli --hub /path/to/hub.db libraries list`. Without `--hub` the
298
+ CLI uses the standard config location, which is what you want almost always.
299
+
300
+ ### Required one-shot preparation when upgrading
301
+
302
+ If an older installation already has its owner and tokens inside `vault.db`,
303
+ normal startup deliberately will not guess from the config file or from
304
+ finding an existing vault; it needs that exact legacy vault authorized once.
305
+
306
+ - **Desktop app:** setup performs this step only after you explicitly approve
307
+ importing the detected legacy owner and tokens.
308
+ - **`pixlstash-server` / `python -m pixlstash.app`, in an interactive
309
+ terminal:** startup detects the unprepared legacy vault itself and asks,
310
+ with a plain explanation and a `[y/N]` prompt — defaulting to **no**, since
311
+ this is irreversible — before doing anything. Saying yes does the same thing
312
+ the CLI command below does, in the same startup, so no separate step or
313
+ restart is needed. After this runs, the vault is no longer readable as an
314
+ owner/token store by versions of PixlStash older than the hub — the prompt
315
+ says so before you answer.
316
+ - **Non-interactive launches** (a service, a container, redirected stdin) log
317
+ that the legacy vault needs preparing instead of asking, and the CLI command
318
+ below remains the
319
+ way to authorize the migration ahead of time.
320
+
321
+ Pip installation:
322
+
323
+ ```bash
324
+ pixlstash-cli --hub /path/to/config-dir/hub.db libraries prepare-legacy-identity /path/to/library
325
+ ```
326
+
327
+ Source checkout:
328
+
329
+ ```bash
330
+ python -m pixlstash.cli --hub /path/to/config-dir/hub.db libraries prepare-legacy-identity /path/to/library
331
+ ```
332
+
333
+ Docker Compose, before bringing the upgraded service up (adjust the two
334
+ container paths if you configured custom mounts):
335
+
336
+ ```bash
337
+ docker compose run --rm --entrypoint pixlstash-cli pixlstash \
338
+ --hub /home/pixlstash/.config/pixlstash/hub.db \
339
+ libraries prepare-legacy-identity \
340
+ /home/pixlstash/.config/pixlstash/images
341
+ ```
342
+
343
+ After the command succeeds, start PixlStash normally. Startup verifies the
344
+ approved path and identity digest, copies the owner/tokens into the hub, stamps
345
+ the library, and only then removes portable owner, token, and guest-session data
346
+ from the live vault and its historical snapshots. New snapshots and every
347
+ restore scratch database receive the same sanitation, so identity remains
348
+ hub-only. If verification fails, the hub does not mark the migration complete;
349
+ correct the reported problem and retry.
350
+
351
+ ## Server configuration
352
+
353
+ On first run, PixlStash generates a `server-config.json` file in the user config directory:
354
+
355
+ - **Linux / macOS:** `~/.config/pixlstash/server-config.json`
356
+ - **Windows:** `%LOCALAPPDATA%\pixlstash\server-config.json`
357
+
358
+ You can also supply a custom path with `--server-config <path>`.
359
+
360
+ On first run in an interactive terminal, PixlStash now launches a short setup wizard for:
361
+
362
+ - `image_root` (storage path)
363
+ - `port`
364
+ - `require_ssl` (HTTP/HTTPS)
365
+
366
+ Before the server starts, bootstrap also offers to set (or replace) the
367
+ initial username/password.
368
+
369
+ You can rerun the wizard at any time with:
370
+
371
+ ```bash
372
+ python -m pixlstash.app --bootstrap
373
+ ```
374
+
375
+ When rerunning the wizard, pressing Enter keeps existing values as defaults.
376
+
377
+ Edit the file and restart the server to apply changes.
378
+
379
+ ### Network and port
380
+
381
+ | Key | Default | Description |
382
+ | -------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
383
+ | `host` | `"localhost"` | Address the server binds to. Change to `"0.0.0.0"` to expose the server on the local network or internet. |
384
+ | `port` | `9537` | TCP port the server listens on. |
385
+ | `cors_origins` | `[]` | Extra origins allowed to make credentialed cross-origin requests. `localhost`, `127.0.0.1`, and the server's own LAN IP are always permitted on any port. |
386
+ | `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. |
387
+ | `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. |
388
+
389
+ 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`.
390
+
391
+ Use `cors_origins` only if you need to allow origins on a different machine entirely.
392
+
393
+ ### Sharing and remote access
394
+
395
+ PixlStash supports read-only share tokens that let you give guests access to
396
+ a specific picture, picture set, character, or project without exposing your full
397
+ account. To safely share over the internet while keeping your login protected:
398
+
399
+ 1. **Expose the server** — set `"host": "0.0.0.0"` and open/forward the port.
400
+ 2. **Enable HTTPS** — set `"require_ssl": true` (strongly recommended whenever
401
+ the server is internet-facing; see [SSL / HTTPS](#ssl--https) below).
402
+ 3. **Keep `require_local_for_write: true`** (the default) — this ensures that
403
+ full login is only possible from your local network or VPN. Share tokens
404
+ (READ-only) continue to work from any IP.
405
+ 4. **Create a share token** — in the PixlStash settings UI, create a READ-only
406
+ token scoped to the resource you want to share. Copy the generated URL and
407
+ send it to your guests.
408
+
409
+ #### If you run a reverse proxy (nginx, Caddy, Cloudflare Tunnel…)
410
+
411
+ When a proxy sits in front of PixlStash, `require_local_for_write` sees the
412
+ proxy's IP instead of the real client IP. You must tell PixlStash which proxy
413
+ addresses to trust so it reads the real IP from the `X-Forwarded-For` header:
414
+
415
+ | Scenario | `trusted_proxies` value |
416
+ |---|---|
417
+ | nginx/Caddy on the same machine | `["127.0.0.1"]` |
418
+ | Cloudflare Tunnel (cloudflared on same machine) | `["127.0.0.1"]` |
419
+ | Proxy on a different LAN machine | `["192.168.1.x"]` (the proxy's LAN IP) |
420
+
421
+ Example:
422
+ ```json
423
+ {
424
+ "host": "0.0.0.0",
425
+ "require_ssl": true,
426
+ "require_local_for_write": true,
427
+ "trusted_proxies": ["127.0.0.1"]
428
+ }
429
+ ```
430
+
431
+ > **Warning:** Only add addresses you control to `trusted_proxies`. Trusting an
432
+ > untrusted address allows that host to spoof any client IP, bypassing the local
433
+ > network restriction entirely.
434
+
435
+ ### SSL / HTTPS
436
+
437
+ | Key | Default | Description |
438
+ | ----------------- | --------------------------- | ----------------------------------------------------------------------------- |
439
+ | `require_ssl` | `false` | Enable HTTPS. When `true`, the server will use the key and certificate below. |
440
+ | `ssl_keyfile` | `<config_dir>/ssl/key.pem` | Path to the SSL private key file. |
441
+ | `ssl_certfile` | `<config_dir>/ssl/cert.pem` | Path to the SSL certificate file. |
442
+ | `cookie_samesite` | `"Lax"` | `SameSite` attribute for session cookies (`"Lax"`, `"Strict"`, or `"None"`). |
443
+ | `cookie_secure` | `false` | Set the `Secure` flag on session cookies. Enable when serving over HTTPS. |
444
+
445
+ When `require_ssl` is enabled and no certificate files exist at the configured
446
+ paths, PixlStash generates a **self-signed certificate** automatically. Browsers
447
+ will show a security warning for self-signed certs. To get a trusted certificate
448
+ without warnings, choose one of the options below.
449
+
450
+ #### Option A — Replace the auto-generated certificate with a real one
451
+
452
+ If you already have a certificate (e.g. from certbot or your DNS provider), drop
453
+ the files into the config directory and restart:
454
+
455
+ | OS | Default cert directory |
456
+ |----|------------------------|
457
+ | Linux / macOS | `~/.config/pixlstash/ssl/` |
458
+ | Windows | `%LOCALAPPDATA%\pixlstash\ssl\` |
459
+
460
+ Place your private key as `key.pem` and the full certificate chain as `cert.pem`,
461
+ or point `ssl_keyfile` / `ssl_certfile` at any paths you prefer.
462
+
463
+ To obtain a cert with **certbot** (requires port 80 reachable and a real domain):
464
+
465
+ ```bash
466
+ certbot certonly --standalone -d pixlstash.example.com --email you@example.com
467
+ ```
468
+
469
+ Then in `server-config.json`:
470
+
471
+ ```json
472
+ {
473
+ "require_ssl": true,
474
+ "cookie_secure": true,
475
+ "ssl_keyfile": "/etc/letsencrypt/live/pixlstash.example.com/privkey.pem",
476
+ "ssl_certfile": "/etc/letsencrypt/live/pixlstash.example.com/fullchain.pem"
477
+ }
478
+ ```
479
+
480
+ Certbot installs a systemd timer / cron job that renews automatically. The
481
+ `--standalone` renewal briefly needs port 80; use a
482
+ [pre/post hook](https://eff-certbot.readthedocs.io/en/latest/using.html#pre-and-post-validation-hooks)
483
+ to stop and restart PixlStash around the renewal if it is bound to port 80.
484
+
485
+ #### Option B — Caddy as a reverse proxy (automatic Let's Encrypt)
486
+
487
+ [Caddy](https://caddyserver.com/) provisions and renews a trusted TLS certificate
488
+ automatically whenever it proxies a request for a real domain. No manual cert
489
+ management required.
490
+
491
+ 1. Install Caddy: `sudo apt install caddy` (or see [caddyserver.com](https://caddyserver.com/docs/install))
492
+ 2. Create `/etc/caddy/Caddyfile`:
493
+ ```
494
+ pixlstash.example.com {
495
+ reverse_proxy localhost:9537
496
+ }
497
+ ```
498
+ 3. `sudo systemctl reload caddy`
499
+
500
+ PixlStash itself can stay on plain HTTP (`require_ssl: false`); Caddy terminates
501
+ TLS externally. Set `"trusted_proxies": ["127.0.0.1"]` in `server-config.json`
502
+ so that `require_local_for_write` correctly identifies the real client IP (see
503
+ [Sharing and remote access](#sharing-and-remote-access)).
504
+
505
+ #### Option C — Cloudflare Tunnel (no open port, no domain purchase required)
506
+
507
+ [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)
508
+ routes traffic to PixlStash through Cloudflare's edge without opening any inbound
509
+ firewall ports. Cloudflare provides a free `*.trycloudflare.com` subdomain with a
510
+ valid TLS certificate, or you can use your own domain.
511
+
512
+ ```bash
513
+ # Install cloudflared, then:
514
+ cloudflared tunnel --url http://localhost:9537
515
+ ```
516
+
517
+ Cloudflare terminates TLS; PixlStash runs plain HTTP internally. As with Caddy,
518
+ set `"trusted_proxies": ["127.0.0.1"]` so local-write restrictions work correctly.
519
+
520
+ ### Storage
521
+
522
+ | Key | Default | Description |
523
+ | --------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
524
+ | `image_root` | `<config_dir>/images` | Directory where imported media files are stored. |
525
+
526
+ Automatic import folders are stored in the database and managed via the
527
+ Import Folders UI/API, not in `server-config.json`.
528
+
529
+ ### Processing
530
+
531
+ | Key | Default | Description |
532
+ | -------------------------------- | -------------- | ---------------------------------------------------------------------------------------------------------- |
533
+ | `default_device` | `"cpu"` | Device used for AI processing (`"cpu"` or `"cuda"`). |
534
+ | `insightface_model_pack` | `"buffalo_l"` | InsightFace model pack used by the face detection / recognition pipeline. One of `"buffalo_l"` or `"auraface"`. |
535
+ | `generate_thumbnails_on_startup` | `true` | Generate missing thumbnails when the server starts. |
536
+
537
+ #### Face model pack and licensing
538
+
539
+ `insightface_model_pack` selects which InsightFace model pack powers face
540
+ detection and face recognition. The licensing decision is yours;
541
+ PixlStash simply makes the choice available.
542
+
543
+ - **`buffalo_l`** (default): the standard InsightFace pack. Its recognition
544
+ weights are trained on the WebFace600K dataset, which is licensed for
545
+ **non-commercial research use only**. This is the right choice for personal
546
+ and research use, and it downloads automatically on first use.
547
+ - **`auraface`**: the [`fal/AuraFace-v1`](https://huggingface.co/fal/AuraFace-v1)
548
+ pack, whose weights are **Apache-2.0 licensed** and therefore suitable if you
549
+ need to use face features in a **commercial** setting. It uses the same
550
+ SCRFD-10G face detector as `buffalo_l`, so switching only changes the
551
+ recognition embedding. When selected, PixlStash downloads the pack from a
552
+ pinned HuggingFace revision into `~/.insightface/models/auraface/` on first
553
+ use. If the automatic download fails (for example, no network access), you can
554
+ place the pack's `.onnx` files in that directory manually and restart.
555
+
556
+ Changing this setting on an existing library does **not** delete your faces or
557
+ your manual character assignments. PixlStash detects faces whose embeddings came
558
+ from a different pack and refreshes those embeddings in place, in the background,
559
+ keeping each face's identity intact. New imports are always processed first, so a
560
+ refresh sweep never starves brand-new pictures.
561
+
562
+ To remove stale database records for missing source files at startup, run:
563
+
564
+ ```bash
565
+ python -m pixlstash.app --cleanup-missing-pictures
566
+ ```
567
+
568
+ ### Logging
569
+
570
+ | Key | Default | Description |
571
+ | ----------- | ------------------------- | ------------------------------------------------------------ |
572
+ | `log_level` | `"info"` | Log verbosity (`"debug"`, `"info"`, `"warning"`, `"error"`). |
573
+ | `log_file` | `<config_dir>/server.log` | Path to the log file. |
574
+
575
+ ### Example config
576
+
577
+ ```json
578
+ {
579
+ "host": "localhost",
580
+ "port": 9537,
581
+ "log_level": "info",
582
+ "require_ssl": false,
583
+ "image_root": "/home/user/.config/pixlstash/images",
584
+ "default_device": "cpu",
585
+ "insightface_model_pack": "buffalo_l",
586
+ "generate_thumbnails_on_startup": true
587
+ }
588
+ ```
589
+
590
+ ## Upgrade PixlStash
591
+
592
+ <p align="center">
593
+ <a href="https://pixlstash.dev/upgrade.html">
594
+ <img src="website/assets/upgrade-banner.svg" alt="Upgrade PixlStash" width="320"/>
595
+ </a>
596
+ </p>
597
+
598
+ Detailed installation instructions on <a href="http://pixlstash.dev/upgrade.html">pixlstash.dev</a>.
599
+
600
+ ## Installing plugins
601
+
602
+ PixlStash supports built-in plugins and user-created plugins.
603
+
604
+ ### With the CLI (recommended)
605
+
606
+ ```bash
607
+ pixlstash-cli plugins available # what is published
608
+ pixlstash-cli plugins available caption # ...matching a word
609
+ pixlstash-cli plugins install hello_world_stamp # from the plugins repository
610
+ pixlstash-cli plugins install ./my_captioner.zip # a zip of a plugin folder
611
+ pixlstash-cli plugins install ./my_captioner/ # an extracted folder
612
+ pixlstash-cli plugins install ./my_filter.py # a single module
613
+ pixlstash-cli plugins test ./my_captioner.py # does it load and render?
614
+ pixlstash-cli plugins list
615
+ pixlstash-cli plugins remove my_captioner
616
+ pixlstash-cli plugins create # start writing one
617
+ pixlstash-cli plugins submit # ...and open its PR
618
+ ```
619
+
620
+ `plugins available` lists what
621
+ [PixlStash-plugins](https://github.com/Pikselkroken/PixlStash-plugins) publishes,
622
+ with each plugin's name, title, one-line summary and (where declared) author and
623
+ licence; `*` marks one you already have. Add a word to search, and it matches
624
+ any of those fields, so anything you can see in the listing you can search for.
625
+ It downloads the same archive `install` does and reads it without importing
626
+ anything, so it needs no token and runs no published code.
627
+
628
+ The destination differs by kind (captioning plugin or image filter) and by
629
+ shape, so `install` works it out from the source instead of asking you to type
630
+ it: it reads the source without importing it, decides which base class it
631
+ derives from, and names the installed file after the plugin's own `name`. It
632
+ refuses a source that is not a plugin, one whose name collides with a built-in,
633
+ and a zip whose entries would be unpacked outside the folder it is unpacked
634
+ into.
635
+
636
+ `--dry-run` prints the plan and stops, `--yes` skips the confirmation, `--force`
637
+ replaces an existing plugin of the same name, and `--strict` turns the warnings
638
+ into refusals. `--ref` picks a branch, tag or commit in the plugins repository
639
+ and is ignored for local sources; it cannot point the download at a different
640
+ repository. A plugin's `requirements.txt` is never installed unless you pass
641
+ `--with-deps`. **Plugin code runs unsandboxed, in the server process, with your
642
+ permissions** — install what you would run yourself.
643
+
644
+ Captioning plugins load at server start, so restart PixlStash after installing
645
+ one; image filters are re-scanned every time the Filters menu is listed.
646
+
647
+ `plugins test` is for the person *writing* a captioning plugin, and it is the
648
+ one verb that imports the plugin instead of reading it: it loads the file the
649
+ way the server does, registers what it defines, and checks that the parameter
650
+ schema is one the settings screen can render — so a typo costs a command rather
651
+ than a restart, and it ends by listing the connections, programs and file
652
+ writes it saw the plugin make while it ran. `--image PATH` runs it over one
653
+ picture as well, and stops
654
+ instead of running when the plugin reports its model is not present — though a
655
+ plugin that downloads inside `init()` still will, since by then it is the
656
+ plugin's code deciding.
657
+
658
+ **It is a development aid, not a security scanner.** It does not tell you
659
+ whether a plugin is safe to install — it *runs* the plugin, unsandboxed, with
660
+ your permissions, which is exactly what the server would do. Only test a plugin
661
+ you would have installed anyway.
662
+
663
+ ### User plugin directory
664
+
665
+ If you prefer to copy files by hand, they go in the platform-specific user data
666
+ directory. PixlStash logs the exact path on startup, and
667
+ `pixlstash-cli plugins list` prints it.
668
+
669
+ | OS | Image filters | Captioning plugins |
670
+ |----|---------------|--------------------|
671
+ | **Linux** | `~/.local/share/pixlstash/image-plugins/user/` | `~/.local/share/pixlstash/tagger-plugins/user/` |
672
+ | **macOS** | `~/Library/Application Support/pixlstash/image-plugins/user/` | `~/Library/Application Support/pixlstash/tagger-plugins/user/` |
673
+ | **Windows** | `%LOCALAPPDATA%\pixlstash\pixlstash\image-plugins\user\` | `%LOCALAPPDATA%\pixlstash\pixlstash\tagger-plugins\user\` |
674
+
675
+ The doubled `pixlstash\pixlstash` on Windows is not a typo: `platformdirs` puts
676
+ the app under a vendor folder, and PixlStash passes no separate vendor name.
677
+ This table used to show it singly, which is why copying a plugin there by hand
678
+ appeared to do nothing.
679
+
680
+ An image filter is always a single `.py` file. A captioning plugin may be a
681
+ single `.py` file or a folder containing `__init__.py`.
682
+
683
+ ### Writing a plugin
684
+
685
+ ```bash
686
+ pixlstash-cli plugins create
687
+ ```
688
+
689
+ Run with no arguments it is a wizard. It works out first whether it can fork
690
+ [PixlStash-plugins](https://github.com/Pikselkroken/PixlStash-plugins) for you,
691
+ and names the repository it would create:
692
+
693
+ ```
694
+ This will create https://github.com/you/PixlStash-plugins, a public fork of
695
+ Pikselkroken/PixlStash-plugins on your account, and clone it.
696
+ ```
697
+
698
+ If you already have that fork it says so, and that it will be reused rather
699
+ than created. If it cannot fork at all it says why: `gh` missing, or `gh` not
700
+ signed in.
701
+
702
+ Then it asks what kind of plugin you are writing, and that question carries the
703
+ way out:
704
+
705
+ ```
706
+ What kind of plugin is it?
707
+ 1 image turns a picture into another picture (the Filters menu)
708
+ 2 captioning turns an image into tags or a description
709
+ 3 abort stop here, creating nothing
710
+ Choose [1]:
711
+ ```
712
+
713
+ Answer with the number or the name. `3` stops with nothing forked, cloned or
714
+ created, and the question is asked before any of those happen for exactly that
715
+ reason. After it, you are asked what the plugin should do and what to call it.
716
+
717
+ Everyone contributes from a fork, maintainers included. A plugin reaches the
718
+ repository as a pull request or not at all, and a shortcut for the few people
719
+ with write access would be a second path that only those people ever exercise.
720
+
721
+ From those answers it clones, branches, copies one of the repository's example
722
+ plugins into `plugins/<kind>/<name>/`, renames its folder, module and class,
723
+ puts your git identity and your licence in the header, writes what you said it
724
+ should do into the plugin's README and docstring, and prints the commands that
725
+ open the pull request. Nothing is committed or pushed: the plugin at that point
726
+ is still the example.
727
+
728
+ Last, it offers a command that hands the job to a coding agent:
729
+
730
+ ```bash
731
+ cd /home/you/PixlStash-plugins && claude 'Read plugins/image/edge_glow/BRIEF.md and do what it says.'
732
+ ```
733
+
734
+ One line, because the command is the part that gets pasted. The brief itself is
735
+ written to disk as `BRIEF.md` inside the new plugin's folder, where it can be
736
+ read, edited and re-run without retyping anything. It says what you asked the
737
+ plugin to do, that the folder holds a renamed copy of an example whose
738
+ behaviour must be replaced rather than described, what "done" looks like, and
739
+ that it should delete itself when finished. `BRIEF.md` is gitignored, so
740
+ forgetting cannot put it in the pull request.
741
+
742
+ The command carries its own `cd`, because the brief is named relative to the
743
+ checkout and the agent reads that checkout's instructions: pasted anywhere else
744
+ it would find neither.
745
+
746
+ For everything general, the brief points at the plugins repository's own
747
+ [`AGENTS.md`](https://github.com/Pikselkroken/PixlStash-plugins/blob/main/AGENTS.md)
748
+ (and a byte-identical `CLAUDE.md`) that both agents read on their own, covering
749
+ the contract to follow, the header rules, what a plugin README needs and the
750
+ commands to finish with. Restating any of that in the prompt would be a second
751
+ copy of instructions that repository maintains and its tests keep honest. All
752
+ the command adds is which README holds the brief.
753
+
754
+ It is printed rather than run: starting an agent on your checkout is your call,
755
+ and you should read what it writes before committing it.
756
+
757
+ ### Submitting it
758
+
759
+ ```bash
760
+ cd PixlStash-plugins
761
+ pixlstash-cli plugins submit
762
+ ```
763
+
764
+ `submit` is the other half of `create`, and there is nothing to type because
765
+ the branch already names the plugin. It runs the plugins repository's own
766
+ checks with that checkout's `.venv` if it has one (its ruff is pinned, and a
767
+ different version formats differently), stages the one plugin folder, commits
768
+ it, pushes the branch and opens the pull request.
769
+
770
+ A failing check stops it, which is the point: the same failure found in CI
771
+ costs a red pull request and a force-push. `--dry-run` runs the checks and
772
+ stops; `--skip-checks` runs none of them.
773
+
774
+ It asks one thing first: what you tested the plugin against, which model, which
775
+ PixlStash version, on what hardware. That goes in the pull request body,
776
+ verbatim and with nothing else read off your machine. CI checks the shape of a
777
+ model-backed plugin and never runs the model, so that sentence is what makes it
778
+ reviewable at all. Pushing and opening the PR are confirmed before they happen
779
+ (`--yes` skips the question).
780
+
781
+ Everything the wizard asks can be given as an option instead, and giving a name
782
+ and `--kind` skips the questions entirely:
783
+
784
+ ```bash
785
+ pixlstash-cli plugins create edge_glow --kind image \
786
+ --purpose "Adds a soft glow around every edge." --agent claude
787
+ ```
788
+
789
+ It copies the example the plugins repository's own CI keeps green, rather than a
790
+ template kept here, so a scaffold cannot be out of date with the contract tests
791
+ it has to pass. `--from` starts from a different published plugin,
792
+ `--display-name`, `--description`, `--author` and `--license` fill in the
793
+ header, `--dir` says where the checkout goes, and `--no-fork` skips the fork.
794
+
795
+ To write one by hand instead, start from
796
+ `pixlstash/image_plugins/built-in/plugin_template.py` in this repository:
797
+
798
+ 1. Create a new `.py` file in your user plugin directory.
799
+ 2. Subclass `ImagePlugin`, set a unique `name` and `plugin_id`, and implement `run()`.
800
+ 3. Restart PixlStash Server — plugins are loaded at startup.
801
+
802
+ `plugin_template.py` is ignored by plugin discovery and will not be loaded as a plugin.
803
+
804
+ ### Plugin licensing
805
+
806
+ PixlStash backend core is GPL-3.0, but the plugin authoring API files
807
+ `pixlstash/image_plugins/base.py` and
808
+ `pixlstash/image_plugins/built-in/plugin_template.py` are MIT-licensed.
809
+
810
+ This means user plugins that only rely on that plugin API/template may use any
811
+ license chosen by the plugin author.
812
+
813
+ If a plugin copies substantial GPL backend code or depends directly on other
814
+ GPL-only backend internals, different obligations may apply.
815
+
816
+
817
+ ## Connecting an AI agent (MCP)
818
+
819
+ `pixlstash-mcp` is an [MCP](https://modelcontextprotocol.io) server: an agent
820
+ can search the library and read pictures, tags and ComfyUI recipes. By default
821
+ it has no tools that change anything; `--allow-write` adds workflow editing
822
+ (see [Read and write workflows](#read-and-write-workflows)). It talks to a
823
+ running PixlStash server with an API token and sees exactly what that token
824
+ sees.
825
+
826
+ The quickest way in is **API Tokens → Connect AI agent** in your account
827
+ settings: it mints a read-only token (unless you choose **Read and write
828
+ workflows**) and hands back the finished configuration to paste, either a one-line `claude mcp add …` or the `mcpServers` block below.
829
+ That token covers the whole library. To narrow it to one set, character or
830
+ project, mint a **Read-only share** token with **New token** instead and put it
831
+ in the configuration yourself.
832
+
833
+ For read-only use, do not give it a full-access token: any agent that can read
834
+ its own config file then has full owner control of PixlStash - not just read
835
+ access to your pictures - because that token authorises writes, deletes and the
836
+ local-only filesystem endpoints, and nothing here limits what else the agent
837
+ does with it. Write mode needs exactly that token, and that is its cost.
838
+
839
+ `get_recipe` also asks your ComfyUI whether a recipe's nodes and models are
840
+ installed.
841
+
842
+ ```json
843
+ {
844
+ "mcpServers": {
845
+ "pixlstash": {
846
+ "command": "pixlstash-mcp",
847
+ "env": { "PIXLSTASH_TOKEN": "<your read-only token>" }
848
+ }
849
+ }
850
+ }
851
+ ```
852
+
853
+ That goes in your MCP client's own configuration file. In Claude Desktop that
854
+ is **Settings → Developer → Edit Config**; other clients document their own
855
+ location. If the file already lists servers, add the `"pixlstash"` entry inside
856
+ the existing `"mcpServers"` block rather than replacing the file, or you will
857
+ drop the servers already there.
858
+
859
+ No address is needed: `pixlstash-mcp` reads the port, the scheme and the
860
+ certificate out of your `server-config.json`, the same file the server reads,
861
+ so it keeps working if you change any of them. If you have **Require SSL** on,
862
+ it connects over https and trusts PixlStash's own self-signed certificate.
863
+ The desktop app keeps a separate `server-config.json`, and its shim passes that
864
+ path with `--server-config`; point a hand-written config at it the same way. Pass `--url` (or set `PIXLSTASH_URL`) only to point it at
865
+ a different machine. **Do not copy the address out of the desktop app's
866
+ window** - that is an ephemeral port the desktop shell picks afresh on every
867
+ launch, so it stops resolving the next time PixlStash starts.
868
+
869
+ **Desktop app:** you do not need to install anything. Turn on **Shell command**
870
+ in Settings and the app puts both `pixlstash` and `pixlstash-mcp` on your PATH,
871
+ forwarding to the interpreter it already ships. Nothing is installed into any
872
+ Python environment of your own.
873
+
874
+ Running from a checkout instead, `pip install -e .` provides `pixlstash-mcp`
875
+ in that virtualenv. If your MCP client then reports
876
+ `Executable not found in $PATH: "pixlstash-mcp"`, it is not inheriting that
877
+ environment; give it the absolute path, which `which pixlstash-mcp` prints in a
878
+ shell where PixlStash runs.
879
+
880
+ Tools: `search_pictures`, `list_pictures`, `count_pictures`, `get_picture`,
881
+ `view_picture`, `list_tags`, `list_sets`, `list_characters`, `list_projects`,
882
+ `get_recipe`.
883
+ `list_pictures` and `search_pictures` also narrow by `set_id`, `character_id`,
884
+ `project_id` and `tags`; `list_pictures` and `count_pictures` also by the
885
+ `workflow_id` a recipe names. `get_recipe` says whether the model forks into
886
+ several sampler passes and which LoRAs feed each, and gives the path that opens
887
+ the picture's workflow in PixlStash.
888
+
889
+ The MCP server reads `PIXLSTASH_TOKEN` once, when it starts. After you replace
890
+ or revoke the token, restart or reconnect it in your MCP client.
891
+
892
+ ### Read and write workflows
893
+
894
+ Choose **Read and write workflows** in **Connect AI agent** and the agent can
895
+ also edit and store workflow graphs and start runs. The dialog mints a
896
+ full-access token and adds `--allow-write` to the configuration:
897
+
898
+ ```json
899
+ {
900
+ "mcpServers": {
901
+ "pixlstash": {
902
+ "command": "pixlstash-mcp",
903
+ "args": ["--allow-write"],
904
+ "env": { "PIXLSTASH_TOKEN": "<your full-access token>" }
905
+ }
906
+ }
907
+ }
908
+ ```
909
+
910
+ Every workflow route is owner-only, so a read-only or shared token cannot use
911
+ these tools, and `pixlstash-mcp` says so at start-up. The flag decides which
912
+ tools are offered; it does not limit the token, which can do anything you can.
913
+
914
+ Extra tools: `list_workflows`, `get_workflow`, `export_workflow_graph`,
915
+ `import_workflow_graph`, `preflight_workflow`, `run_workflow`.
916
+
917
+ A stored workflow is never changed in place: importing an edited graph makes a
918
+ new workflow card, and importing an unchanged one matches the stored copy and
919
+ adds nothing. A different prompt, seed or LoRA is not a graph edit; pass it to
920
+ the run instead.
921
+
922
+ #### With a ComfyUI MCP server
923
+
924
+ PixlStash does not edit graphs itself. Connect ComfyUI's own MCP server
925
+ ([comfy-mcp](https://docs.comfy.org/agent-tools/mcp)) to the same agent and
926
+ the two work on one file; they never talk to each other, the agent goes
927
+ between them:
928
+
929
+ 1. `export_workflow_graph` (PixlStash) writes a workflow's graph to a JSON file,
930
+ in PixlStash's cache folder unless you name a path, and returns the path.
931
+ 2. The agent edits that file. ComfyUI's server tells it what inputs a node
932
+ takes on your install and which models are on disk, and can set widget
933
+ values for it.
934
+ 3. ComfyUI's server validates the edited file. Do not store one that fails.
935
+ 4. `import_workflow_graph` (PixlStash) stores it as a new workflow card.
936
+ 5. `preflight_workflow` checks it would run; `run_workflow` runs it.
937
+
938
+ Run through PixlStash, not through ComfyUI's server: a run there goes straight
939
+ to ComfyUI, and its pictures never reach your library.
940
+
941
+ If the agent answers questions about your library from the shell instead of
942
+ from these tools, it is almost always one of two things:
943
+
944
+ - **The server is registered for one directory only.** `claude mcp add`
945
+ defaults to `--scope local`, which registers it just for the directory you
946
+ ran it in; everywhere else the agent has no PixlStash tools at all. Use
947
+ `-s user`, as the **Connect AI agent** command does. `claude mcp list` run
948
+ from an unrelated folder tells you which you have.
949
+ - **Nothing is listening.** `pixlstash-mcp` writes a line to stderr at
950
+ start-up in that case, which most clients show in their MCP server log.
951
+
952
+ ## Troubleshooting
953
+
954
+ - If the page does not load, confirm the server process is running.
955
+ - If port `9537` is in use, set a different port in your server config file.
956
+ - If frontend assets are missing, rebuild frontend with `npm run build` and restart the server.
957
+ - **Mobile browsers:** the UI is designed for desktop. Mobile may work for basic browsing but is not a supported layout in 1.0.0.
958
+
959
+ ## Docker Images
960
+
961
+ PixlStash maintains separate Dockerfiles:
962
+
963
+ - `Dockerfile`: CPU image
964
+ - `Dockerfile.gpu`: GPU image (NVIDIA CUDA)
965
+
966
+ Build locally:
967
+
968
+ ```bash
969
+ # CPU
970
+ docker build -f Dockerfile -t pixlstash:cpu .
971
+
972
+ # GPU
973
+ docker build -f Dockerfile.gpu -t pixlstash:gpu .
974
+ ```
975
+
976
+ Run locally:
977
+
978
+ ```bash
979
+ # CPU
980
+ docker run --rm -p 9537:9537 -v pixlstash_data:/home/pixlstash pixlstash:cpu
981
+
982
+ # GPU
983
+ docker run --rm --gpus all -p 9537:9537 -v pixlstash_data:/home/pixlstash pixlstash:gpu
984
+ ```
985
+
986
+ ### First-run setup in Docker
987
+
988
+ Claiming the owner account (choosing the first username/password) is normally
989
+ restricted to loopback connections, and a Docker container never sees your
990
+ traffic as loopback — so the in-browser first-run setup is blocked with a 403.
991
+ Provision the owner account via environment variables on the **first** run
992
+ instead:
993
+
994
+ ```bash
995
+ docker run --rm -p 9537:9537 \
996
+ -e PIXLSTASH_INITIAL_USERNAME=owner \
997
+ -e PIXLSTASH_INITIAL_PASSWORD=change-me-now \
998
+ -v pixlstash_data:/home/pixlstash pixlstash:cpu
999
+ ```
1000
+
1001
+ The account is claimed at startup and you can log in with those credentials
1002
+ right away. Afterwards, restart the container **without** the two variables:
1003
+ they are only used to claim a still-unclaimed account (a restart with stale
1004
+ values never changes an existing password — it just logs that they were
1005
+ ignored), but credentials should not linger in the container environment.
1006
+ `docker-compose.yml` ships the same two variables commented out.
1007
+
1008
+ Alternative: log in over loopback from inside the container, e.g.
1009
+ `docker exec -it <container> curl -X POST http://127.0.0.1:9537/api/v1/login -H 'Content-Type: application/json' -d '{"username":"owner","password":"change-me-now"}'`.
1010
+
1011
+ GitHub Actions uses the same split in `.github/workflows/docker-publish.yml`:
1012
+
1013
+ - CPU publish job builds from `Dockerfile`
1014
+ - GPU publish job builds from `Dockerfile.gpu`
1015
+
1016
+ ### GPU startup fails (`CUDAExecutionProvider` unavailable)
1017
+
1018
+ If startup reports that ONNX `CUDAExecutionProvider` is unavailable, you likely have CPU-only ONNX Runtime installed.
1019
+
1020
+ Fix your environment:
1021
+
1022
+ ```bash
1023
+ pip uninstall -y onnxruntime
1024
+ pip install onnxruntime-gpu
1025
+ ```
1026
+ It some cases you may have to uninstall onnxruntime-gpu and reinstall it.
1027
+
1028
+ Verify providers:
1029
+
1030
+ ```bash
1031
+ python -c "import onnxruntime as ort; print(ort.get_available_providers())"
1032
+ ```
1033
+
1034
+ Expected output should include `CUDAExecutionProvider`.
1035
+
1036
+ If you prefer CPU mode, set `"default_device": "cpu"` in `server-config.json`.
1037
+
1038
+ ### Import Folders and Reference Folders in Docker
1039
+
1040
+ Because Docker containers have an isolated filesystem, folders on your host machine must be explicitly bind-mounted into the container before PixlStash can read them.
1041
+
1042
+ **Key restrictions:**
1043
+
1044
+ - **No folder browser.** The path browser is unavailable in Docker. You must type the host path manually in the folder editor.
1045
+ - **Volume mount required before the folder becomes active.** When you add a new Import or Reference folder, PixlStash saves it with a `pending_mount` status. The folder will not scan or import until you restart the container with the corresponding `-v` mount in your `docker run` command.
1046
+ - **Container restart needed for each new folder.** Adding a folder in the UI does not automatically mount it. You must stop and recreate the container with the new `-v` flag, then open PixlStash again.
1047
+
1048
+ **Workflow:**
1049
+
1050
+ 1. Open the sidebar **Folders** tab and add a new Import or Reference folder.
1051
+ 2. Enter the **host path** (the path on your machine) and note the suggested **container path** (e.g. `/data/import/pictures-001` or `/data/ref/pictures-001`).
1052
+ 3. The editor shows a ready-to-copy `docker run` restart command that includes all current mounts. Copy and run it to recreate the container with the new mount.
1053
+ 4. After the container restarts, the folder status changes from `pending_mount` to active and scanning begins.
1054
+
1055
+ **Example** — adding a reference folder to an existing GPU container:
1056
+
1057
+ ```bash
1058
+ docker rm -f pixlstash-gpu 2>/dev/null || true
1059
+ docker run -d \
1060
+ --runtime nvidia \
1061
+ -e HOME=/home/pixlstash \
1062
+ -e PIXLSTASH_HOST=0.0.0.0 \
1063
+ -p 9537:9537 \
1064
+ -v ~/Pictures/pixlstash:/home/pixlstash \
1065
+ -v '/home/you/Photos:/data/ref/pictures-001' \
1066
+ --name pixlstash-gpu \
1067
+ ghcr.io/pikselkroken/pixlstash:latest-gpu
1068
+ ```
1069
+
1070
+ Replace `/home/you/Photos` with your actual host path and adjust the container path index if you have multiple folders.