pyarchinit-mini 2.4.8__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.8 → pyarchinit_mini-2.7.1}/CHANGELOG.md +137 -0
- {pyarchinit_mini-2.4.8/pyarchinit_mini.egg-info → pyarchinit_mini-2.7.1}/PKG-INFO +1 -1
- {pyarchinit_mini-2.4.8 → 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.8 → 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.8 → 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.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/media_service.py +37 -2
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/pottery_service.py +11 -0
- {pyarchinit_mini-2.4.8 → 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.8 → 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.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/pottery_routes.py +11 -4
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/harris_creator_editor.js +5 -1
- {pyarchinit_mini-2.4.8 → 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.8 → 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.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/detail.html +29 -4
- {pyarchinit_mini-2.4.8 → 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.8 → pyarchinit_mini-2.7.1/pyarchinit_mini.egg-info}/PKG-INFO +1 -1
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/SOURCES.txt +38 -1
- {pyarchinit_mini-2.4.8 → 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.8 → 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.8 → 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.8 → 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.8/pyarchinit_mini/graphml_io/yed_writer.py +0 -157
- pyarchinit_mini-2.4.8/pyarchinit_mini/web_interface/templates/components/language_switcher.html +0 -47
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/MANIFEST.in +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/README.md +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/babel.cfg +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/media_viewer_demo.db +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_mini 2.db +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_mini.db +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_mini_sample.db +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial.db +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial_backup_20251030_093228.db +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial_clean.db +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial_video.db +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_v18_demo.db +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/logo/logo_pyarchinit-mini.png +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/auth.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/dependencies.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/graphml.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/inventario.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/schemas.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/site.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/sync.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/us.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/export_import_cli.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/extended_matrix_import.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/graphml_cli.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/harris_import.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/harris_template.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/migrate.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/migrate_vocab.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/pyarchinit_import_export_cli.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/sync_cli.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli_interface/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli_interface/cli_app.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/connection_manager.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/em_node_config_manager.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/em_node_types.yaml +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/concurrency_manager.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/connection.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/database_creator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/manager.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/add_file_path.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/add_i18n_columns.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/add_tipo_documento.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text_simple.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_backfill.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_schema.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_period_table_schema.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_vocab_alignment.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/backup.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/postgres_installer.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/schemas.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/utils.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/analytics_dialog.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/assets/logo.png +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/dialogs.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/excel_import_dialog.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/export_import_dialog.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/graphml_export_dialog.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/gui_app.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/harris_matrix_editor.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/i18n.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/icons.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/inventario_dialog_extended.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/main_window.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/media_manager_advanced.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/postgres_installer_dialog.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/pottery_dialog_extended.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/pottery_panel.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/pyarchinit_import_export_dialog.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/thesaurus_dialog.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/us_dialog_extended.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/inventario_dto.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/site_dto.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/us_dto.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/exceptions.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/converter.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/dot_parser.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/em_palette.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/graphml_builder.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/graphml_exporter.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/pure_networkx_exporter.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/svg_resources.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/templates/EM_palette.graphml +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/x11_colors.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/yed_template.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_io/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_io/reader.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_io/writer.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/auto_regen.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/edge_registry.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/exceptions.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/filesystem.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/ingest_plan.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/ingestor.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/paradata_store.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/projector.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/matrix_generator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/matrix_visualizer.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/compound_layout.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/period_sync_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/row_provider.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/i18n/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/i18n/flask_babel_config.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/i18n/locale_manager.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/__main__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/blender_client.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/config.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/event_stream.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/graphml_parser.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/http_server.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/period_filter.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/base_prompt.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/period_visualization_prompt.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/stratigraphic_model_prompt.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/us_description_prompt.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/proxy_generator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/base_resource.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/graphml_resource.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/periods_resource.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/relationships_resource.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/sites_resource.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/us_resource.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/server.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/base_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/batch_insert_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/build_3d_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/chatgpt_fetch_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/chatgpt_search_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/configure_em_nodes_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/create_database_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/create_harris_matrix_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/data_import_parser_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/data_management_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/database_manager_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/delete_data_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/export_harris_matrix_graphml_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/export_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/filter_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/generate_report_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/get_schema_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/import_excel_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/insert_data_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/manage_services_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/material_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/media_management_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/position_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/pyarchinit_sync_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/resolve_conflicts_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/service_management_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/thesaurus_management_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/update_data_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/upload_file_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_relationship_format_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_relationship_integrity_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_stratigraphic_relationships_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_stratigraphy_tool.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/media_manager/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/media_manager/media_handler.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/ai_chat.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/app_setting.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/base.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/datazione.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/extended_matrix.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/harris_matrix.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/inventario_materiali.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/media.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/pottery.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/site.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/thesaurus.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/tma.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/us.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/user.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pdf_generator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pdf_generator_backup.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/usm_implementation.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/s3d_integration/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/s3d_integration/model_manager.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/s3d_integration/s3d_converter.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/auto_translate.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/configure_claude_desktop.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_admin_user.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_correct_stratigraphy_sample.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_italian_sample_database.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_sample_for_webapp.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_sample_with_50_us.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/generate_test_3d_model.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/load_italian_as_main.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/load_sample_as_main.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/migrate_relationships.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/populate_sample_data.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/populate_simple_data.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/setup_auth.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/setup_user_env.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/test_cascade_delete.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/test_relationship_fix.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/update_sample_relationships.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/update_urls_and_versions.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/verify_docs.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/ai_assistant_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/ai_chat_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/analytics_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/app_setting_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/backup_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/command_parser.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/datazione_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/export_import_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/extended_matrix_excel_parser.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/import_export_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/inventario_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/mcp_executor.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/periodizzazione_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/pottery_dto.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/pottery_pdf_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/relationship_sync_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/search_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/site_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/thesaurus_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/tma_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/us_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/user_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/bundle_creator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/bundle_manifest.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/bundle_validator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/connectivity_monitor.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/sync_orchestrator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/sync_queue.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/sync_state_machine.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/uuid_manager.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.mo +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.po +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.mo +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.po +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/messages.pot +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/auth.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/exceptions.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/relationship_validator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/stratigraphic_validator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/tma_label_generator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/validators.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/exceptions.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/i18n.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/loader.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/provider.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/translations/vocab_en.json +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/translations/vocab_it.json +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/types.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/auth_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/em_node_config_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/excel_import_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/graph_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/paradata_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/paradata_ui_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/pyarchinit_import_export_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/s3d_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/socketio_events.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/css/style.css +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/favicon.ico +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/logo.png +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/no-image.png +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/pyarchinit-mini-logo.png +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/OrbitControls.js +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/stratigraphic_layout.js +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/three-d-viewer.js +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/three.min.js +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/universal_search.js +0 -0
- {pyarchinit_mini-2.4.8 → 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.8 → 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.8 → 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.8 → 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.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/3d_builder/index.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/3d_viewer/viewer.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/backups.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database_connect.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database_info.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database_upload.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/settings_ai.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/ai/assistant.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/analytics/dashboard.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/auth/login.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/auth/users.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/blender_viewer.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/dashboard.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/datazioni/list.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/docs/index.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/em_node_config/index.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/excel_import/index.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/export/export_import.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/graph_import_preview.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/graph_import_result.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_creator/index.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/graphml_export.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/large_graph_message.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/stratigraph_viewer.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/view.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/view_graphviz.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/viewer_3d_integrated.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/inventario/form.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/inventario/list.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/media/list.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/media/upload.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/messaging/contacts.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/operators/directory.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/paradata/edit.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/paradata/index.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/paradata/list.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pdf/pottery_sheet.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/periodizzazione/form.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/periodizzazione/list.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/periodizzazione/periods.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/form.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/import_form.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pyarchinit_import_export/index.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/search/results.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/detail.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/form.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/list.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/map.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/stats/targeted.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/thesaurus/list.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/tma/form.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/tma/list.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/us/form.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/us/list.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/validation/report.html +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/test_prova_extended_matrix.graphml +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/three_d_builder_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.graphml +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/vocab_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_heriverse.json +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.graphml +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.json +0 -0
- {pyarchinit_mini-2.4.8 → 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.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/dependency_links.txt +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/entry_points.txt +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/not-zip-safe +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/requires.txt +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/top_level.txt +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/requirements.txt +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/setup.cfg +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/setup.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/conftest.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/e2e/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/e2e/test_web_vocab_full_flow.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/fixtures/_generate_baseline_graphml.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/fixtures/_generate_harris_swimlane_synthetic.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/fixtures/_generate_synthetic_db.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/fixtures/build_legacy_with_pottery.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_admin_ai_settings_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_admin_backup_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_auto_regen_on_save.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_full_sync_flow.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_graph_import_flow.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_graph_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_matrix_post_cutover.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_matrix_visual_parity.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_create_row.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_load.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_save.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_session_missing.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_migrate_vocab_cli.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_paradata_routes_authors.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_paradata_routes_other_types.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_paradata_ui.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_completion.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_excel_roundtrip.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_legacy_upgrade.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_spec2_coverage_gaps.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_vocab_routes.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/__init__.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_app_setting_model.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_app_setting_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_auto_regen.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_backup_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_bundle.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_concurrency_columns.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_concurrency_manager.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_connectivity_monitor.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_database_utils.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_deprecated_writers_shim.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_em_palette_vocab_backed.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphml_io_reader.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphml_io_writer.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_edge_registry.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_exceptions.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_filesystem.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_ingestor_apply.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_ingestor_preview.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_projector.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_compound_layout.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_exceptions.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_period_sync.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_row_provider.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_state_load.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_state_save.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_ingest_plan.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_inventario_schema.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_migrations_backup.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_migrations_idempotent.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_optimistic_locking.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_paradata_store_authors.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_paradata_store_basic.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_paradata_store_other_types.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_pottery_dto.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_pottery_model.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_pottery_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_s3d_converter_vocab_backed.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_site_service.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_api.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_cli.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_orchestrator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_queue.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_state_machine.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_us_dto_unita_tipo_validator.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_us_schema.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_uuid_manager.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_bootstrap_failures.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_exceptions.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_i18n.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_loader.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_provider.py +0 -0
- {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_types.py +0 -0
|
@@ -1,3 +1,140 @@
|
|
|
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
|
+
|
|
1
138
|
## [2.4.8] - 2026-05-18
|
|
2
139
|
|
|
3
140
|
### 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
|