pyarchinit-mini 2.4.7__tar.gz → 2.7.1__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.
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/CHANGELOG.md +151 -0
- {pyarchinit_mini-2.4.7/pyarchinit_mini.egg-info → pyarchinit_mini-2.7.1}/PKG-INFO +1 -1
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/__init__.py +1 -1
- pyarchinit_mini-2.7.1/pyarchinit_mini/ai_matrix/__init__.py +1 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/ai_matrix/apply.py +102 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/ai_matrix/plan.py +54 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/ai_matrix/vision_extractor.py +197 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/graphml_io/yed_importer.py +356 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/graphml_io/yed_keys.py +75 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/graphml_io/yed_writer.py +251 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/exceptions.py +8 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/harris_swimlane/harris_layout.py +128 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/swimlane_state.py +164 -40
- pyarchinit_mini-2.7.1/pyarchinit_mini/i18n/lang_routes.py +21 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/media_service.py +37 -2
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/pottery_service.py +11 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/app.py +21 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/data/paradata/domus-pompeiana/stratigraphy.graphml +265 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/data/paradata/metro-c-amba-aradam/stratigraphy.graphml +265 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/harris_creator_routes.py +72 -34
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/matrix_import_routes.py +243 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/pottery_routes.py +11 -4
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/harris_creator_editor.js +47 -27
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/base.html +4 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/components/language_switcher.html +27 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_creator/editor.html +33 -1
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/matrix_import/preview.html +103 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/matrix_import/rejected.html +22 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/matrix_import/upload.html +69 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/detail.html +29 -4
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/list.html +39 -9
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/yed_import/index.html +21 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/yed_import/preview.html +64 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/yed_import/result.html +26 -0
- pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/yed_import_routes.py +84 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1/pyarchinit_mini.egg-info}/PKG-INFO +1 -1
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/SOURCES.txt +38 -1
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyproject.toml +1 -1
- pyarchinit_mini-2.7.1/tests/fixtures/_generate_yed_test_files.py +82 -0
- pyarchinit_mini-2.7.1/tests/integration/test_lang_routes.py +57 -0
- pyarchinit_mini-2.7.1/tests/integration/test_matrix_import_apply_route.py +181 -0
- pyarchinit_mini-2.7.1/tests/integration/test_matrix_import_rejected_route.py +73 -0
- pyarchinit_mini-2.7.1/tests/integration/test_matrix_import_site_widget.py +70 -0
- pyarchinit_mini-2.7.1/tests/integration/test_matrix_import_upload_route.py +133 -0
- pyarchinit_mini-2.7.1/tests/integration/test_pottery_filters_id_number_anno.py +67 -0
- pyarchinit_mini-2.7.1/tests/integration/test_pottery_list_media_thumbs.py +31 -0
- pyarchinit_mini-2.7.1/tests/integration/test_roundtrip_extmatrix.py +81 -0
- pyarchinit_mini-2.7.1/tests/integration/test_swimlane_group_by.py +118 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_yed_export_route.py +1 -1
- pyarchinit_mini-2.7.1/tests/integration/test_yed_import_routes.py +105 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_yed_writer_parity.py +2 -1
- pyarchinit_mini-2.7.1/tests/unit/test_ai_matrix_apply.py +165 -0
- pyarchinit_mini-2.7.1/tests/unit/test_ai_matrix_extractor_parse.py +84 -0
- pyarchinit_mini-2.7.1/tests/unit/test_ai_matrix_extractor_providers.py +97 -0
- pyarchinit_mini-2.7.1/tests/unit/test_ai_matrix_plan_serialization.py +38 -0
- pyarchinit_mini-2.7.1/tests/unit/test_harris_layout.py +127 -0
- pyarchinit_mini-2.7.1/tests/unit/test_yed_importer_parse.py +46 -0
- pyarchinit_mini-2.7.1/tests/unit/test_yed_importer_plan.py +113 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_yed_writer.py +8 -0
- pyarchinit_mini-2.7.1/tests/unit/test_yed_writer_extended_matrix.py +179 -0
- pyarchinit_mini-2.4.7/pyarchinit_mini/graphml_io/yed_writer.py +0 -157
- pyarchinit_mini-2.4.7/pyarchinit_mini/web_interface/templates/components/language_switcher.html +0 -47
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/MANIFEST.in +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/README.md +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/babel.cfg +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/data/media_viewer_demo.db +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/data/pyarchinit_mini 2.db +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/data/pyarchinit_mini.db +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/data/pyarchinit_mini_sample.db +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial.db +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial_backup_20251030_093228.db +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial_clean.db +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial_video.db +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/data/pyarchinit_v18_demo.db +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/logo/logo_pyarchinit-mini.png +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/auth.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/dependencies.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/graphml.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/inventario.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/schemas.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/site.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/sync.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/us.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/export_import_cli.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/extended_matrix_import.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/graphml_cli.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/harris_import.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/harris_template.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/migrate.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/migrate_vocab.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/pyarchinit_import_export_cli.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/sync_cli.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli_interface/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli_interface/cli_app.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/connection_manager.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/em_node_config_manager.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/em_node_types.yaml +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/concurrency_manager.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/connection.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/database_creator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/manager.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/add_file_path.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/add_i18n_columns.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/add_tipo_documento.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text_simple.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_backfill.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_schema.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_period_table_schema.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_vocab_alignment.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/backup.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/postgres_installer.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/schemas.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/utils.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/analytics_dialog.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/assets/logo.png +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/dialogs.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/excel_import_dialog.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/export_import_dialog.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/graphml_export_dialog.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/gui_app.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/harris_matrix_editor.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/i18n.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/icons.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/inventario_dialog_extended.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/main_window.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/media_manager_advanced.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/postgres_installer_dialog.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/pottery_dialog_extended.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/pottery_panel.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/pyarchinit_import_export_dialog.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/thesaurus_dialog.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/us_dialog_extended.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/inventario_dto.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/site_dto.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/us_dto.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/exceptions.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/converter.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/dot_parser.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/em_palette.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/graphml_builder.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/graphml_exporter.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/pure_networkx_exporter.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/svg_resources.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/templates/EM_palette.graphml +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/x11_colors.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/yed_template.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_io/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_io/reader.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_io/writer.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/auto_regen.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/edge_registry.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/exceptions.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/filesystem.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/ingest_plan.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/ingestor.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/paradata_store.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/projector.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/matrix_generator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/matrix_visualizer.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/compound_layout.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/period_sync_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/row_provider.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/i18n/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/i18n/flask_babel_config.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/i18n/locale_manager.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/__main__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/blender_client.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/config.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/event_stream.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/graphml_parser.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/http_server.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/period_filter.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/base_prompt.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/period_visualization_prompt.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/stratigraphic_model_prompt.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/us_description_prompt.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/proxy_generator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/base_resource.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/graphml_resource.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/periods_resource.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/relationships_resource.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/sites_resource.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/us_resource.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/server.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/base_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/batch_insert_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/build_3d_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/chatgpt_fetch_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/chatgpt_search_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/configure_em_nodes_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/create_database_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/create_harris_matrix_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/data_import_parser_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/data_management_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/database_manager_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/delete_data_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/export_harris_matrix_graphml_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/export_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/filter_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/generate_report_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/get_schema_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/import_excel_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/insert_data_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/manage_services_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/material_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/media_management_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/position_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/pyarchinit_sync_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/resolve_conflicts_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/service_management_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/thesaurus_management_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/update_data_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/upload_file_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_relationship_format_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_relationship_integrity_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_stratigraphic_relationships_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_stratigraphy_tool.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/media_manager/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/media_manager/media_handler.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/ai_chat.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/app_setting.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/base.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/datazione.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/extended_matrix.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/harris_matrix.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/inventario_materiali.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/media.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/pottery.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/site.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/thesaurus.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/tma.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/us.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/user.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pdf_generator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pdf_generator_backup.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/usm_implementation.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/s3d_integration/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/s3d_integration/model_manager.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/s3d_integration/s3d_converter.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/auto_translate.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/configure_claude_desktop.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_admin_user.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_correct_stratigraphy_sample.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_italian_sample_database.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_sample_for_webapp.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_sample_with_50_us.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/generate_test_3d_model.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/load_italian_as_main.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/load_sample_as_main.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/migrate_relationships.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/populate_sample_data.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/populate_simple_data.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/setup_auth.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/setup_user_env.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/test_cascade_delete.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/test_relationship_fix.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/update_sample_relationships.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/update_urls_and_versions.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/verify_docs.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/ai_assistant_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/ai_chat_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/analytics_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/app_setting_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/backup_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/command_parser.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/datazione_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/export_import_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/extended_matrix_excel_parser.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/import_export_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/inventario_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/mcp_executor.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/periodizzazione_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/pottery_dto.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/pottery_pdf_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/relationship_sync_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/search_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/site_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/thesaurus_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/tma_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/us_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/user_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/bundle_creator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/bundle_manifest.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/bundle_validator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/connectivity_monitor.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/sync_orchestrator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/sync_queue.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/sync_state_machine.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/uuid_manager.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.mo +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.po +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.mo +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.po +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/messages.pot +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/auth.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/exceptions.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/relationship_validator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/stratigraphic_validator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/tma_label_generator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/validators.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/exceptions.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/i18n.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/loader.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/provider.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/translations/vocab_en.json +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/translations/vocab_it.json +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/types.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/auth_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/em_node_config_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/excel_import_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/graph_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/paradata_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/paradata_ui_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/pyarchinit_import_export_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/s3d_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/socketio_events.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/css/style.css +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/favicon.ico +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/logo.png +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/no-image.png +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/pyarchinit-mini-logo.png +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/OrbitControls.js +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/stratigraphic_layout.js +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/three-d-viewer.js +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/three.min.js +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/universal_search.js +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.bin +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.gltf +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.mtl +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.obj +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/3d_builder/index.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/3d_viewer/viewer.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/backups.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database_connect.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database_info.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database_upload.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/settings_ai.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/ai/assistant.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/analytics/dashboard.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/auth/login.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/auth/users.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/blender_viewer.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/dashboard.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/datazioni/list.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/docs/index.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/em_node_config/index.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/excel_import/index.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/export/export_import.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/graph_import_preview.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/graph_import_result.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_creator/index.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/graphml_export.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/large_graph_message.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/stratigraph_viewer.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/view.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/view_graphviz.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/viewer_3d_integrated.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/inventario/form.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/inventario/list.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/media/list.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/media/upload.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/messaging/contacts.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/operators/directory.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/paradata/edit.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/paradata/index.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/paradata/list.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pdf/pottery_sheet.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/periodizzazione/form.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/periodizzazione/list.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/periodizzazione/periods.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/form.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/import_form.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pyarchinit_import_export/index.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/search/results.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/detail.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/form.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/list.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/map.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/stats/targeted.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/thesaurus/list.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/tma/form.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/tma/list.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/us/form.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/us/list.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/validation/report.html +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/test_prova_extended_matrix.graphml +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/three_d_builder_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.graphml +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/vocab_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_heriverse.json +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.graphml +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.json +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/dependency_links.txt +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/entry_points.txt +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/not-zip-safe +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/requires.txt +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/top_level.txt +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/requirements.txt +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/setup.cfg +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/setup.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/conftest.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/e2e/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/e2e/test_web_vocab_full_flow.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/fixtures/_generate_baseline_graphml.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/fixtures/_generate_harris_swimlane_synthetic.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/fixtures/_generate_synthetic_db.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/fixtures/build_legacy_with_pottery.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_admin_ai_settings_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_admin_backup_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_auto_regen_on_save.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_full_sync_flow.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_graph_import_flow.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_graph_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_matrix_post_cutover.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_matrix_visual_parity.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_create_row.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_load.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_save.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_session_missing.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_migrate_vocab_cli.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_paradata_routes_authors.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_paradata_routes_other_types.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_paradata_ui.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_completion.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_excel_roundtrip.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_legacy_upgrade.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_spec2_coverage_gaps.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/integration/test_vocab_routes.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/__init__.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_app_setting_model.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_app_setting_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_auto_regen.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_backup_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_bundle.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_concurrency_columns.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_concurrency_manager.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_connectivity_monitor.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_database_utils.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_deprecated_writers_shim.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_em_palette_vocab_backed.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_graphml_io_reader.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_graphml_io_writer.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_edge_registry.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_exceptions.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_filesystem.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_ingestor_apply.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_ingestor_preview.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_projector.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_compound_layout.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_exceptions.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_period_sync.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_row_provider.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_state_load.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_state_save.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_ingest_plan.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_inventario_schema.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_migrations_backup.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_migrations_idempotent.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_optimistic_locking.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_paradata_store_authors.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_paradata_store_basic.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_paradata_store_other_types.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_pottery_dto.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_pottery_model.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_pottery_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_s3d_converter_vocab_backed.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_site_service.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_api.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_cli.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_orchestrator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_queue.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_state_machine.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_us_dto_unita_tipo_validator.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_us_schema.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_uuid_manager.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_bootstrap_failures.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_exceptions.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_i18n.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_loader.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_provider.py +0 -0
- {pyarchinit_mini-2.4.7 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_types.py +0 -0
|
@@ -1,3 +1,154 @@
|
|
|
1
|
+
## [2.7.1] - 2026-05-19
|
|
2
|
+
|
|
3
|
+
### Fixed (IT)
|
|
4
|
+
- **AI Matrix Import** post-merge hotfix: la 2.7.0 era inservibile in produzione per 4 bug scoperti al primo uso reale.
|
|
5
|
+
- `g.db_session` non viene mai popolato in produzione: ora si usa `_get_session()` context manager (stesso pattern di `yed_import_routes`).
|
|
6
|
+
- Le chiavi API AI vivono nella tabella `app_settings` (gestita dalla UI Admin), non solo in env: bootstrap automatico in `os.environ` prima di chiamare l'extractor.
|
|
7
|
+
- Schema `us_table` corretto: `descrizione` (Text) invece di `d_stratigrafica` (String); `fase_finale` invece del campo inventato `fase_recente`; cast int→str per le fasi (colonne TEXT).
|
|
8
|
+
- Schema `us_relationships_table` corretto: colonna `sito` singola (non `sito_from`/`sito_to`), `relationship_type` (non `tipo_relazione`), `id_relationship` (non `id_rel`).
|
|
9
|
+
- Endpoint redirect: `us_list` (bare route) invece di `us.list_us` (blueprint inesistente).
|
|
10
|
+
- Template (upload/preview/rejected) ora estendono `base.html` con styling Bootstrap, navbar e icone Font Awesome.
|
|
11
|
+
|
|
12
|
+
### Fixed (EN)
|
|
13
|
+
- **AI Matrix Import** post-merge hotfix: 2.7.0 was unusable in production due to 4 bugs caught on first real use.
|
|
14
|
+
- `g.db_session` was never populated in production: now uses `_get_session()` context manager (same pattern as `yed_import_routes`).
|
|
15
|
+
- AI API keys live in the `app_settings` table (managed via UI Admin), not only in env: automatic bootstrap into `os.environ` before extractor call.
|
|
16
|
+
- Corrected `us_table` schema: `descrizione` (Text) instead of `d_stratigrafica` (String); `fase_finale` instead of made-up `fase_recente`; int→str cast for phases (TEXT columns).
|
|
17
|
+
- Corrected `us_relationships_table` schema: single `sito` column (not `sito_from`/`sito_to`), `relationship_type` (not `tipo_relazione`), `id_relationship` (not `id_rel`).
|
|
18
|
+
- Redirect endpoint: `us_list` (bare route) instead of `us.list_us` (non-existent blueprint).
|
|
19
|
+
- Templates (upload/preview/rejected) now extend `base.html` with Bootstrap styling, navbar, and Font Awesome icons.
|
|
20
|
+
|
|
21
|
+
## [2.7.0] - 2026-05-18
|
|
22
|
+
|
|
23
|
+
### Added (IT)
|
|
24
|
+
- **AI Matrix Import** (`/matrix-import/`): nuova feature che usa Vision API
|
|
25
|
+
(Anthropic Claude Sonnet 4.7 o OpenAI GPT-5.5) per estrarre US e relazioni
|
|
26
|
+
stratigrafiche da un'immagine di un Harris matrix. Include validation gate
|
|
27
|
+
(l'AI rifiuta immagini che non sono matrici), preview editabile prima del
|
|
28
|
+
commit, e auto-creazione del sito se nuovo.
|
|
29
|
+
- L'immagine sorgente viene salvata come media legato al sito.
|
|
30
|
+
- Toggle Anthropic / OpenAI nel form di upload.
|
|
31
|
+
- Required env vars: `ANTHROPIC_API_KEY` e/o `OPENAI_API_KEY`, `AI_PROVIDER` opzionale.
|
|
32
|
+
|
|
33
|
+
### Added (EN)
|
|
34
|
+
- **AI Matrix Import** (`/matrix-import/`): new feature that uses Vision API
|
|
35
|
+
(Anthropic Claude Sonnet 4.7 or OpenAI GPT-5.5) to extract stratigraphic
|
|
36
|
+
units and relationships from an image of a Harris matrix. Includes a
|
|
37
|
+
validation gate (the AI rejects non-matrix images), editable preview
|
|
38
|
+
before commit, and auto-creation of the site if new.
|
|
39
|
+
- Source image saved as media linked to the site.
|
|
40
|
+
- Anthropic / OpenAI toggle in the upload form.
|
|
41
|
+
- Required env vars: `ANTHROPIC_API_KEY` and/or `OPENAI_API_KEY`, optional `AI_PROVIDER`.
|
|
42
|
+
|
|
43
|
+
## [2.6.0] - 2026-05-18
|
|
44
|
+
|
|
45
|
+
### Changed (IT)
|
|
46
|
+
- Editor Harris Matrix Creator: gli archi stratigrafici sono ora resi con
|
|
47
|
+
routing ortogonale (90°, `curve-style: 'taxi'`) invece che con curve
|
|
48
|
+
bezier diagonali. Allineato al `y:PolyLineEdge` di yEd usato da
|
|
49
|
+
pyarchinit QGIS plugin.
|
|
50
|
+
- `harris_swimlane/harris_layout.py`: defaults aumentati a `v_gap=40`
|
|
51
|
+
(era 20) e `h_gap=50` (era 30) per dare respiro agli archi ortogonali.
|
|
52
|
+
Chiamanti che passano i parametri esplicitamente non sono toccati.
|
|
53
|
+
|
|
54
|
+
### Changed (EN)
|
|
55
|
+
- Harris Matrix Creator editor: stratigraphic edges now render with
|
|
56
|
+
right-angle routing (`curve-style: 'taxi'`) instead of bezier curves,
|
|
57
|
+
matching the `y:PolyLineEdge` style used by pyarchinit QGIS.
|
|
58
|
+
- `harris_swimlane/harris_layout.py`: defaults bumped to `v_gap=40`
|
|
59
|
+
(was 20) and `h_gap=50` (was 30) to give orthogonal edges breathing
|
|
60
|
+
room. Explicit callers are unaffected.
|
|
61
|
+
|
|
62
|
+
## [2.5.1] - 2026-05-18
|
|
63
|
+
|
|
64
|
+
### Added (IT)
|
|
65
|
+
- Pottery list: anteprima media in linea con mini-carousel CSS scroll-snap
|
|
66
|
+
(thumb 48x48 + GLightbox). N+1 evitato con pre-load batch via
|
|
67
|
+
`MediaService.get_media_for_entity_ids`.
|
|
68
|
+
- Pottery filtri: nuovi input `id_number` e `anno` (esatti, integer cast
|
|
69
|
+
con guard `try/except`).
|
|
70
|
+
- Pottery detail: galleria thumbnail inline (120x120, GLightbox) sopra i
|
|
71
|
+
campi della scheda.
|
|
72
|
+
- Nuovo blueprint `pyarchinit_mini/i18n/lang_routes.py` con
|
|
73
|
+
`POST /set-language/<lang>` che salva session e fa redirect al referrer.
|
|
74
|
+
Lo switcher di lingua diventa `<form>` POST: preserva la query string
|
|
75
|
+
corrente (filtri/ricerca non si perdono più al cambio lingua).
|
|
76
|
+
|
|
77
|
+
### Changed (IT)
|
|
78
|
+
- `templates/components/language_switcher.html`: `<a>` sostituiti con form POST.
|
|
79
|
+
- `PotteryService._FILTERABLE_INT` aggiunto con `id_number`, `anno`.
|
|
80
|
+
- `pottery_routes.FILTER_KEYS` esteso con `id_number`, `anno`.
|
|
81
|
+
|
|
82
|
+
### Added (EN)
|
|
83
|
+
- Pottery list: inline media preview with CSS scroll-snap mini-carousel
|
|
84
|
+
(48x48 thumbs + GLightbox). Batch pre-load avoids N+1.
|
|
85
|
+
- Pottery filters: new `id_number` + `anno` exact-match inputs with
|
|
86
|
+
integer cast guard.
|
|
87
|
+
- Pottery detail: inline thumbnail gallery (120x120, GLightbox).
|
|
88
|
+
- New `pyarchinit_mini/i18n/lang_routes.py` blueprint: `POST /set-language/<lang>`
|
|
89
|
+
saves session + redirects to referrer, preserving the URL query string
|
|
90
|
+
(filters/search no longer lost on language switch).
|
|
91
|
+
|
|
92
|
+
### Changed (EN)
|
|
93
|
+
- Language switcher templates: anchors replaced with POST forms.
|
|
94
|
+
- `PotteryService._FILTERABLE_INT` introduces `id_number`, `anno`.
|
|
95
|
+
- `pottery_routes.FILTER_KEYS` extended.
|
|
96
|
+
|
|
97
|
+
## [2.5.0] - 2026-05-18
|
|
98
|
+
|
|
99
|
+
### Added (IT)
|
|
100
|
+
- Editor swimlane: dropdown "Group by" con 9 valori (period_phase | struttura
|
|
101
|
+
| attivita | settore | area | ambient | saggio | quad_par | none).
|
|
102
|
+
Cambiando valore le lane si ricostruiscono e i nodi US si ridistribuiscono
|
|
103
|
+
con un layout Harris-classico server-side.
|
|
104
|
+
- Nuovo modulo `harris_swimlane/harris_layout.py` — ordinamento topologico
|
|
105
|
+
per dipendenze stratigrafiche (`overlies` / `is_after`), recent in alto.
|
|
106
|
+
- Nuovo `graphml_io/yed_importer.py` — parse + build_import_plan +
|
|
107
|
+
apply_import_plan per round-trip da Extended Matrix → DB. Idempotente,
|
|
108
|
+
preview 2-fasi, upsert by `node_uuid`.
|
|
109
|
+
- Nuova pagina `/import-graphml/` (upload + preview + apply). Sidebar entry
|
|
110
|
+
sia in navbar che laterale (sezione Tools).
|
|
111
|
+
|
|
112
|
+
### Changed (IT)
|
|
113
|
+
- `graphml_io/yed_writer.py` riscritto: emette file Extended Matrix
|
|
114
|
+
byte-compat con pyarchinit QGIS (38 keys d0..d37, `y:TableNode
|
|
115
|
+
YED_TABLE_NODE`, `pyarchinit.epochs_meta`, `pyarchinit.*` per ogni nodo
|
|
116
|
+
US). Vecchio `write_yed_graphml` mantenuto come wrapper deprecato.
|
|
117
|
+
- API `/harris-creator/api/load/<site>` accetta `?group_by=...` query
|
|
118
|
+
param (default `period_phase`, retro-compat).
|
|
119
|
+
- API `/harris-creator/api/export/<site>/yed-graphml` accetta `?group_by=...`
|
|
120
|
+
e popola `epochs_meta` da `periodizzazione_table`.
|
|
121
|
+
- Path output cambia in `data/exports/harris_yed/<slug>-extmatrix.graphml`
|
|
122
|
+
(era `<slug>-harris-yed.graphml`).
|
|
123
|
+
|
|
124
|
+
### Added (EN)
|
|
125
|
+
- Editor "Group by" dropdown with 9 values; lanes rebuild + Harris-classic
|
|
126
|
+
re-layout on change.
|
|
127
|
+
- New `harris_swimlane/harris_layout.py` — server-side topological
|
|
128
|
+
positioning.
|
|
129
|
+
- New `graphml_io/yed_importer.py` — round-trip yEd → DB.
|
|
130
|
+
- New `/import-graphml/` page (upload + preview + apply).
|
|
131
|
+
|
|
132
|
+
### Changed (EN)
|
|
133
|
+
- `graphml_io/yed_writer.py` rewritten — emits 38-key Extended Matrix
|
|
134
|
+
byte-compat with pyarchinit.
|
|
135
|
+
- `/api/load` and `/api/export` accept `?group_by=...`.
|
|
136
|
+
- Export output path renamed `*-extmatrix.graphml`.
|
|
137
|
+
|
|
138
|
+
## [2.4.8] - 2026-05-18
|
|
139
|
+
|
|
140
|
+
### Fixed (IT)
|
|
141
|
+
- `loadExistingData` (legacy loader) ora deduplica le relationship triple
|
|
142
|
+
`(from_us, to_us, relationship)` e suffissa gli ID Cytoscape che
|
|
143
|
+
collidono quando la stessa coppia compare con tipi diversi. Risolve
|
|
144
|
+
l'errore "Can not create second element with ID `edge_131_136`" che
|
|
145
|
+
abortiva l'intero forEach e lasciava il canvas senza archi.
|
|
146
|
+
|
|
147
|
+
### Fixed (EN)
|
|
148
|
+
- Legacy `loadExistingData` now deduplicates relationship triples and
|
|
149
|
+
suffixes colliding edge IDs. Fixes "second element with ID
|
|
150
|
+
edge_X_Y" errors that previously aborted edge loading.
|
|
151
|
+
|
|
1
152
|
## [2.4.7] - 2026-05-18
|
|
2
153
|
|
|
3
154
|
### Fixed (IT)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyarchinit-mini
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.1
|
|
4
4
|
Summary: Lightweight archaeological data management system with REST API, Web UI, Desktop GUI, CLI, multi-user authentication, real-time collaboration, analytics dashboard, PyArchInit import/export, Heriverse/ATON export integration, and 3D CRUD viewer
|
|
5
5
|
Home-page: https://github.com/enzococca/pyarchinit-mini
|
|
6
6
|
Author: PyArchInit Team
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""AI Matrix Import — Vision API based stratigraphic matrix extraction."""
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""Commit an AIPlan to the database: site auto-create, US dedupe, edge int guard."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
|
|
7
|
+
from sqlalchemy import text
|
|
8
|
+
|
|
9
|
+
from pyarchinit_mini.ai_matrix.plan import AIPlan
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
VALID_UNIT_TYPES = {"USM", "USR", "US"}
|
|
13
|
+
VALID_REL_TYPES = {
|
|
14
|
+
"copre", "coperto da",
|
|
15
|
+
"taglia", "tagliato da",
|
|
16
|
+
"riempie", "riempito da",
|
|
17
|
+
"si appoggia", "gli si appoggia",
|
|
18
|
+
"uguale a",
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class ApplyResult:
|
|
24
|
+
us_imported: int = 0
|
|
25
|
+
us_skipped: int = 0
|
|
26
|
+
edges_imported: int = 0
|
|
27
|
+
edges_skipped: int = 0
|
|
28
|
+
site_created: bool = False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def apply_ai_plan(plan: AIPlan, sito: str, db_session) -> ApplyResult:
|
|
32
|
+
now = datetime.utcnow()
|
|
33
|
+
result = ApplyResult()
|
|
34
|
+
|
|
35
|
+
# Step 1: site_table auto-create
|
|
36
|
+
existing = db_session.execute(
|
|
37
|
+
text("SELECT sito FROM site_table WHERE sito = :s"), {"s": sito}
|
|
38
|
+
).fetchone()
|
|
39
|
+
if not existing:
|
|
40
|
+
db_session.execute(text("""
|
|
41
|
+
INSERT INTO site_table (sito, descrizione, created_at, updated_at)
|
|
42
|
+
VALUES (:sito, :desc, :now, :now)
|
|
43
|
+
"""), {"sito": sito, "desc": "Auto-creato da AI Matrix Import", "now": now})
|
|
44
|
+
result.site_created = True
|
|
45
|
+
|
|
46
|
+
# Step 2: us_table
|
|
47
|
+
for u in plan.us:
|
|
48
|
+
if not u.us_num or not u.area or not u.unit_type:
|
|
49
|
+
result.us_skipped += 1
|
|
50
|
+
continue
|
|
51
|
+
unit_type = u.unit_type if u.unit_type in VALID_UNIT_TYPES else "US"
|
|
52
|
+
existing_us = db_session.execute(
|
|
53
|
+
text("SELECT us FROM us_table WHERE sito = :s AND us = :u"),
|
|
54
|
+
{"s": sito, "u": u.us_num},
|
|
55
|
+
).fetchone()
|
|
56
|
+
if existing_us:
|
|
57
|
+
result.us_skipped += 1
|
|
58
|
+
continue
|
|
59
|
+
db_session.execute(text("""
|
|
60
|
+
INSERT INTO us_table
|
|
61
|
+
(sito, area, us, unita_tipo, descrizione,
|
|
62
|
+
fase_finale, fase_iniziale, created_at, updated_at)
|
|
63
|
+
VALUES (:sito, :area, :us, :ut, :desc, :ffin, :fini, :now, :now)
|
|
64
|
+
"""), {
|
|
65
|
+
"sito": sito, "area": u.area, "us": u.us_num, "ut": unit_type,
|
|
66
|
+
"desc": u.descrizione,
|
|
67
|
+
"ffin": str(u.fase_recente) if u.fase_recente is not None else None,
|
|
68
|
+
"fini": str(u.fase_iniziale) if u.fase_iniziale is not None else None,
|
|
69
|
+
"now": now,
|
|
70
|
+
})
|
|
71
|
+
result.us_imported += 1
|
|
72
|
+
|
|
73
|
+
# Step 3: us_relationships_table
|
|
74
|
+
# Schema: sito (single), us_from (int), us_to (int), relationship_type, created_at, updated_at
|
|
75
|
+
for e in plan.edges:
|
|
76
|
+
try:
|
|
77
|
+
us_from = int(e.us_from)
|
|
78
|
+
us_to = int(e.us_to)
|
|
79
|
+
except (ValueError, TypeError):
|
|
80
|
+
result.edges_skipped += 1
|
|
81
|
+
continue
|
|
82
|
+
if e.tipo not in VALID_REL_TYPES:
|
|
83
|
+
result.edges_skipped += 1
|
|
84
|
+
continue
|
|
85
|
+
existing_rel = db_session.execute(text("""
|
|
86
|
+
SELECT 1 FROM us_relationships_table
|
|
87
|
+
WHERE sito = :s
|
|
88
|
+
AND us_from = :uf AND us_to = :ut AND relationship_type = :t
|
|
89
|
+
"""), {"s": sito, "uf": us_from, "ut": us_to, "t": e.tipo}).fetchone()
|
|
90
|
+
if existing_rel:
|
|
91
|
+
result.edges_skipped += 1
|
|
92
|
+
continue
|
|
93
|
+
db_session.execute(text("""
|
|
94
|
+
INSERT INTO us_relationships_table
|
|
95
|
+
(sito, us_from, us_to, relationship_type,
|
|
96
|
+
created_at, updated_at)
|
|
97
|
+
VALUES (:s, :uf, :ut, :t, :now, :now)
|
|
98
|
+
"""), {"s": sito, "uf": us_from, "ut": us_to, "t": e.tipo, "now": now})
|
|
99
|
+
result.edges_imported += 1
|
|
100
|
+
|
|
101
|
+
db_session.commit()
|
|
102
|
+
return result
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Dataclasses for AI Matrix Import plan + extraction results."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from dataclasses import dataclass, field, asdict
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class USRow:
|
|
9
|
+
us_num: str
|
|
10
|
+
area: str | None
|
|
11
|
+
unit_type: str
|
|
12
|
+
descrizione: str
|
|
13
|
+
fase_recente: int
|
|
14
|
+
fase_iniziale: int
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class EdgeRow:
|
|
19
|
+
us_from: str
|
|
20
|
+
us_to: str
|
|
21
|
+
tipo: str
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class AIPlan:
|
|
26
|
+
detected_site: str | None
|
|
27
|
+
detected_area: str | None
|
|
28
|
+
us: list[USRow] = field(default_factory=list)
|
|
29
|
+
edges: list[EdgeRow] = field(default_factory=list)
|
|
30
|
+
|
|
31
|
+
def as_dict(self) -> dict:
|
|
32
|
+
return {
|
|
33
|
+
"detected_site": self.detected_site,
|
|
34
|
+
"detected_area": self.detected_area,
|
|
35
|
+
"us": [asdict(u) for u in self.us],
|
|
36
|
+
"edges": [asdict(e) for e in self.edges],
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def from_dict(cls, d: dict) -> "AIPlan":
|
|
41
|
+
return cls(
|
|
42
|
+
detected_site=d.get("detected_site"),
|
|
43
|
+
detected_area=d.get("detected_area"),
|
|
44
|
+
us=[USRow(**u) for u in d.get("us", [])],
|
|
45
|
+
edges=[EdgeRow(**e) for e in d.get("edges", [])],
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass
|
|
50
|
+
class ExtractResult:
|
|
51
|
+
rejected: bool
|
|
52
|
+
reason: str
|
|
53
|
+
confidence: float
|
|
54
|
+
plan: AIPlan | None
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""Vision API extractor for Harris matrix images."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import base64
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
from pyarchinit_mini.ai_matrix.plan import AIPlan, USRow, EdgeRow, ExtractResult
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
CONFIDENCE_THRESHOLD = 0.7
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _parse_response(raw: str) -> ExtractResult:
|
|
15
|
+
"""Parse the AI's JSON response into an ExtractResult.
|
|
16
|
+
|
|
17
|
+
Applies the validation gate: rejects non-matrix images and low-confidence
|
|
18
|
+
results before constructing an AIPlan.
|
|
19
|
+
"""
|
|
20
|
+
try:
|
|
21
|
+
data = json.loads(raw)
|
|
22
|
+
except json.JSONDecodeError as e:
|
|
23
|
+
return ExtractResult(
|
|
24
|
+
rejected=True,
|
|
25
|
+
reason=f"AI returned non-JSON response: {e}",
|
|
26
|
+
confidence=0.0,
|
|
27
|
+
plan=None,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
confidence = float(data.get("confidence", 0.0))
|
|
32
|
+
is_matrix = bool(data.get("is_harris_matrix", False))
|
|
33
|
+
|
|
34
|
+
if not is_matrix or confidence < CONFIDENCE_THRESHOLD:
|
|
35
|
+
return ExtractResult(
|
|
36
|
+
rejected=True,
|
|
37
|
+
reason=data.get("reason", "Immagine non riconosciuta come Harris matrix"),
|
|
38
|
+
confidence=confidence,
|
|
39
|
+
plan=None,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
plan = AIPlan(
|
|
43
|
+
detected_site=data.get("detected_site"),
|
|
44
|
+
detected_area=data.get("detected_area"),
|
|
45
|
+
us=[USRow(
|
|
46
|
+
us_num=str(u.get("us_num", "")),
|
|
47
|
+
area=u.get("area"),
|
|
48
|
+
unit_type=str(u.get("unit_type", "US")),
|
|
49
|
+
descrizione=str(u.get("descrizione", "")),
|
|
50
|
+
fase_recente=int(u.get("fase_recente", 1)),
|
|
51
|
+
fase_iniziale=int(u.get("fase_iniziale", 1)),
|
|
52
|
+
) for u in data.get("us", [])],
|
|
53
|
+
edges=[EdgeRow(
|
|
54
|
+
us_from=str(edge_e.get("us_from", "")),
|
|
55
|
+
us_to=str(edge_e.get("us_to", "")),
|
|
56
|
+
tipo=str(edge_e.get("tipo", "")),
|
|
57
|
+
) for edge_e in data.get("edges", [])],
|
|
58
|
+
)
|
|
59
|
+
return ExtractResult(rejected=False, reason="OK", confidence=confidence, plan=plan)
|
|
60
|
+
except (ValueError, TypeError) as e:
|
|
61
|
+
return ExtractResult(
|
|
62
|
+
rejected=True,
|
|
63
|
+
reason=f"AI returned malformed values: {e}",
|
|
64
|
+
confidence=0.0,
|
|
65
|
+
plan=None,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
MAX_IMAGE_BYTES = 10 * 1024 * 1024 # 10MB
|
|
70
|
+
API_TIMEOUT_S = 90
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
SYSTEM_PROMPT = """You are an expert in archaeological stratigraphy and Harris matrix diagrams.
|
|
74
|
+
|
|
75
|
+
Your task: analyze the attached image and determine if it depicts a Harris matrix (stratigraphic diagram). If yes, extract all stratigraphic units (US/SU) and their relationships.
|
|
76
|
+
|
|
77
|
+
A Harris matrix is a diagram with:
|
|
78
|
+
- Numbered rectangles/boxes (= stratigraphic units, US)
|
|
79
|
+
- Lines/arrows connecting them (= temporal relationships)
|
|
80
|
+
- Hierarchical layout: recent units on top, older on bottom
|
|
81
|
+
|
|
82
|
+
Vocabulary for unit_type:
|
|
83
|
+
- USM = muratura (masonry/wall)
|
|
84
|
+
- USR = revestimento (covering/coating)
|
|
85
|
+
- US = stratigraphic deposit (default if ambiguous)
|
|
86
|
+
|
|
87
|
+
Vocabulary for edge tipo (Italian stratigraphic vocabulary):
|
|
88
|
+
- "copre" = covers
|
|
89
|
+
- "taglia" = cuts
|
|
90
|
+
- "riempie" = fills
|
|
91
|
+
- "si appoggia" = leans on
|
|
92
|
+
- "uguale a" = same as
|
|
93
|
+
|
|
94
|
+
OUTPUT: strict JSON only, no markdown, no commentary. Schema:
|
|
95
|
+
{
|
|
96
|
+
"is_harris_matrix": bool,
|
|
97
|
+
"confidence": float 0..1,
|
|
98
|
+
"reason": str,
|
|
99
|
+
"detected_site": str | null,
|
|
100
|
+
"detected_area": str | null,
|
|
101
|
+
"us": [{"us_num": str, "area": str | null, "unit_type": str,
|
|
102
|
+
"descrizione": str, "fase_recente": int, "fase_iniziale": int}],
|
|
103
|
+
"edges": [{"us_from": str, "us_to": str, "tipo": str}]
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
If is_harris_matrix is false, return empty us and edges arrays and explain in 'reason' what you see instead."""
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _detect_media_type(image_bytes: bytes) -> str:
|
|
110
|
+
"""Return MIME type based on magic bytes. Defaults to PNG."""
|
|
111
|
+
if image_bytes[:3] == b"\xff\xd8\xff":
|
|
112
|
+
return "image/jpeg"
|
|
113
|
+
if image_bytes[:8] == b"\x89PNG\r\n\x1a\n":
|
|
114
|
+
return "image/png"
|
|
115
|
+
if image_bytes[:6] in (b"GIF87a", b"GIF89a"):
|
|
116
|
+
return "image/gif"
|
|
117
|
+
if image_bytes[:4] == b"RIFF" and image_bytes[8:12] == b"WEBP":
|
|
118
|
+
return "image/webp"
|
|
119
|
+
return "image/png"
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def extract(image_bytes: bytes, text: str | None, provider: str) -> ExtractResult:
|
|
123
|
+
"""Send image to Vision API and return parsed ExtractResult.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
image_bytes: raw image content (<=10MB)
|
|
127
|
+
text: optional user-provided context
|
|
128
|
+
provider: 'anthropic' or 'openai'
|
|
129
|
+
"""
|
|
130
|
+
if len(image_bytes) > MAX_IMAGE_BYTES:
|
|
131
|
+
return ExtractResult(
|
|
132
|
+
rejected=True,
|
|
133
|
+
reason="Immagine troppo grande (max 10MB)",
|
|
134
|
+
confidence=0.0,
|
|
135
|
+
plan=None,
|
|
136
|
+
)
|
|
137
|
+
if provider == "anthropic":
|
|
138
|
+
raw = _call_anthropic_vision(image_bytes, text)
|
|
139
|
+
elif provider == "openai":
|
|
140
|
+
raw = _call_openai_vision(image_bytes, text)
|
|
141
|
+
else:
|
|
142
|
+
raise ValueError(f"unknown provider: {provider}")
|
|
143
|
+
return _parse_response(raw)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def _call_anthropic_vision(image_bytes: bytes, text: str | None) -> str:
|
|
147
|
+
try:
|
|
148
|
+
import anthropic
|
|
149
|
+
except ImportError:
|
|
150
|
+
raise RuntimeError("Il package 'anthropic' non è installato. pip install anthropic")
|
|
151
|
+
api_key = os.environ.get("ANTHROPIC_API_KEY")
|
|
152
|
+
if not api_key:
|
|
153
|
+
raise RuntimeError("ANTHROPIC_API_KEY non configurata")
|
|
154
|
+
client = anthropic.Anthropic(api_key=api_key, timeout=API_TIMEOUT_S)
|
|
155
|
+
response = client.messages.create(
|
|
156
|
+
model="claude-sonnet-4-7",
|
|
157
|
+
max_tokens=4096,
|
|
158
|
+
system=SYSTEM_PROMPT,
|
|
159
|
+
messages=[{
|
|
160
|
+
"role": "user",
|
|
161
|
+
"content": [
|
|
162
|
+
{"type": "image", "source": {
|
|
163
|
+
"type": "base64",
|
|
164
|
+
"media_type": _detect_media_type(image_bytes),
|
|
165
|
+
"data": base64.b64encode(image_bytes).decode(),
|
|
166
|
+
}},
|
|
167
|
+
{"type": "text", "text": text or "Analyze the matrix."},
|
|
168
|
+
],
|
|
169
|
+
}],
|
|
170
|
+
)
|
|
171
|
+
return response.content[0].text
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def _call_openai_vision(image_bytes: bytes, text: str | None) -> str:
|
|
175
|
+
try:
|
|
176
|
+
import openai
|
|
177
|
+
except ImportError:
|
|
178
|
+
raise RuntimeError("Il package 'openai' non è installato. pip install openai")
|
|
179
|
+
api_key = os.environ.get("OPENAI_API_KEY")
|
|
180
|
+
if not api_key:
|
|
181
|
+
raise RuntimeError("OPENAI_API_KEY non configurata")
|
|
182
|
+
client = openai.OpenAI(api_key=api_key, timeout=API_TIMEOUT_S)
|
|
183
|
+
media_type = _detect_media_type(image_bytes)
|
|
184
|
+
response = client.chat.completions.create(
|
|
185
|
+
model="gpt-5.5",
|
|
186
|
+
response_format={"type": "json_object"},
|
|
187
|
+
messages=[
|
|
188
|
+
{"role": "system", "content": SYSTEM_PROMPT},
|
|
189
|
+
{"role": "user", "content": [
|
|
190
|
+
{"type": "image_url", "image_url": {
|
|
191
|
+
"url": f"data:{media_type};base64,{base64.b64encode(image_bytes).decode()}"
|
|
192
|
+
}},
|
|
193
|
+
{"type": "text", "text": text or "Analyze the matrix."},
|
|
194
|
+
]},
|
|
195
|
+
],
|
|
196
|
+
)
|
|
197
|
+
return response.choices[0].message.content
|