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