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.
Files changed (515) hide show
  1. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/CHANGELOG.md +137 -0
  2. {pyarchinit_mini-2.4.8/pyarchinit_mini.egg-info → pyarchinit_mini-2.7.1}/PKG-INFO +1 -1
  3. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/__init__.py +1 -1
  4. pyarchinit_mini-2.7.1/pyarchinit_mini/ai_matrix/__init__.py +1 -0
  5. pyarchinit_mini-2.7.1/pyarchinit_mini/ai_matrix/apply.py +102 -0
  6. pyarchinit_mini-2.7.1/pyarchinit_mini/ai_matrix/plan.py +54 -0
  7. pyarchinit_mini-2.7.1/pyarchinit_mini/ai_matrix/vision_extractor.py +197 -0
  8. pyarchinit_mini-2.7.1/pyarchinit_mini/graphml_io/yed_importer.py +356 -0
  9. pyarchinit_mini-2.7.1/pyarchinit_mini/graphml_io/yed_keys.py +75 -0
  10. pyarchinit_mini-2.7.1/pyarchinit_mini/graphml_io/yed_writer.py +251 -0
  11. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/exceptions.py +8 -0
  12. pyarchinit_mini-2.7.1/pyarchinit_mini/harris_swimlane/harris_layout.py +128 -0
  13. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/swimlane_state.py +164 -40
  14. pyarchinit_mini-2.7.1/pyarchinit_mini/i18n/lang_routes.py +21 -0
  15. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/media_service.py +37 -2
  16. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/pottery_service.py +11 -0
  17. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/app.py +21 -0
  18. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/data/paradata/domus-pompeiana/stratigraphy.graphml +265 -0
  19. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/data/paradata/metro-c-amba-aradam/stratigraphy.graphml +265 -0
  20. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/harris_creator_routes.py +72 -34
  21. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/matrix_import_routes.py +243 -0
  22. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/pottery_routes.py +11 -4
  23. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/harris_creator_editor.js +5 -1
  24. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/base.html +4 -0
  25. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/components/language_switcher.html +27 -0
  26. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_creator/editor.html +33 -1
  27. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/matrix_import/preview.html +103 -0
  28. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/matrix_import/rejected.html +22 -0
  29. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/matrix_import/upload.html +69 -0
  30. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/detail.html +29 -4
  31. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/list.html +39 -9
  32. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/yed_import/index.html +21 -0
  33. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/yed_import/preview.html +64 -0
  34. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/templates/yed_import/result.html +26 -0
  35. pyarchinit_mini-2.7.1/pyarchinit_mini/web_interface/yed_import_routes.py +84 -0
  36. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1/pyarchinit_mini.egg-info}/PKG-INFO +1 -1
  37. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/SOURCES.txt +38 -1
  38. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyproject.toml +1 -1
  39. pyarchinit_mini-2.7.1/tests/fixtures/_generate_yed_test_files.py +82 -0
  40. pyarchinit_mini-2.7.1/tests/integration/test_lang_routes.py +57 -0
  41. pyarchinit_mini-2.7.1/tests/integration/test_matrix_import_apply_route.py +181 -0
  42. pyarchinit_mini-2.7.1/tests/integration/test_matrix_import_rejected_route.py +73 -0
  43. pyarchinit_mini-2.7.1/tests/integration/test_matrix_import_site_widget.py +70 -0
  44. pyarchinit_mini-2.7.1/tests/integration/test_matrix_import_upload_route.py +133 -0
  45. pyarchinit_mini-2.7.1/tests/integration/test_pottery_filters_id_number_anno.py +67 -0
  46. pyarchinit_mini-2.7.1/tests/integration/test_pottery_list_media_thumbs.py +31 -0
  47. pyarchinit_mini-2.7.1/tests/integration/test_roundtrip_extmatrix.py +81 -0
  48. pyarchinit_mini-2.7.1/tests/integration/test_swimlane_group_by.py +118 -0
  49. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_yed_export_route.py +1 -1
  50. pyarchinit_mini-2.7.1/tests/integration/test_yed_import_routes.py +105 -0
  51. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_yed_writer_parity.py +2 -1
  52. pyarchinit_mini-2.7.1/tests/unit/test_ai_matrix_apply.py +165 -0
  53. pyarchinit_mini-2.7.1/tests/unit/test_ai_matrix_extractor_parse.py +84 -0
  54. pyarchinit_mini-2.7.1/tests/unit/test_ai_matrix_extractor_providers.py +97 -0
  55. pyarchinit_mini-2.7.1/tests/unit/test_ai_matrix_plan_serialization.py +38 -0
  56. pyarchinit_mini-2.7.1/tests/unit/test_harris_layout.py +127 -0
  57. pyarchinit_mini-2.7.1/tests/unit/test_yed_importer_parse.py +46 -0
  58. pyarchinit_mini-2.7.1/tests/unit/test_yed_importer_plan.py +113 -0
  59. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_yed_writer.py +8 -0
  60. pyarchinit_mini-2.7.1/tests/unit/test_yed_writer_extended_matrix.py +179 -0
  61. pyarchinit_mini-2.4.8/pyarchinit_mini/graphml_io/yed_writer.py +0 -157
  62. pyarchinit_mini-2.4.8/pyarchinit_mini/web_interface/templates/components/language_switcher.html +0 -47
  63. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/MANIFEST.in +0 -0
  64. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/README.md +0 -0
  65. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/babel.cfg +0 -0
  66. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/media_viewer_demo.db +0 -0
  67. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_mini 2.db +0 -0
  68. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_mini.db +0 -0
  69. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_mini_sample.db +0 -0
  70. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial.db +0 -0
  71. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial_backup_20251030_093228.db +0 -0
  72. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial_clean.db +0 -0
  73. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_tutorial_video.db +0 -0
  74. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/data/pyarchinit_v18_demo.db +0 -0
  75. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/logo/logo_pyarchinit-mini.png +0 -0
  76. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/__init__.py +0 -0
  77. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/auth.py +0 -0
  78. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/dependencies.py +0 -0
  79. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/graphml.py +0 -0
  80. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/inventario.py +0 -0
  81. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/schemas.py +0 -0
  82. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/site.py +0 -0
  83. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/sync.py +0 -0
  84. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/api/us.py +0 -0
  85. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/__init__.py +0 -0
  86. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/export_import_cli.py +0 -0
  87. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/extended_matrix_import.py +0 -0
  88. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/graphml_cli.py +0 -0
  89. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/harris_import.py +0 -0
  90. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/harris_template.py +0 -0
  91. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/migrate.py +0 -0
  92. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/migrate_vocab.py +0 -0
  93. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/pyarchinit_import_export_cli.py +0 -0
  94. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli/sync_cli.py +0 -0
  95. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli_interface/__init__.py +0 -0
  96. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/cli_interface/cli_app.py +0 -0
  97. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/__init__.py +0 -0
  98. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/connection_manager.py +0 -0
  99. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/em_node_config_manager.py +0 -0
  100. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/config/em_node_types.yaml +0 -0
  101. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/__init__.py +0 -0
  102. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/concurrency_manager.py +0 -0
  103. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/connection.py +0 -0
  104. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/database_creator.py +0 -0
  105. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/manager.py +0 -0
  106. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/__init__.py +0 -0
  107. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/add_file_path.py +0 -0
  108. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/add_i18n_columns.py +0 -0
  109. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/add_tipo_documento.py +0 -0
  110. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text.py +0 -0
  111. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text_simple.py +0 -0
  112. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_backfill.py +0 -0
  113. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_schema.py +0 -0
  114. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_period_table_schema.py +0 -0
  115. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/_2026_05_vocab_alignment.py +0 -0
  116. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/__init__.py +0 -0
  117. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/migrations/backup.py +0 -0
  118. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/postgres_installer.py +0 -0
  119. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/schemas.py +0 -0
  120. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/database/utils.py +0 -0
  121. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/__init__.py +0 -0
  122. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/analytics_dialog.py +0 -0
  123. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/assets/logo.png +0 -0
  124. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/dialogs.py +0 -0
  125. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/excel_import_dialog.py +0 -0
  126. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/export_import_dialog.py +0 -0
  127. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/graphml_export_dialog.py +0 -0
  128. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/gui_app.py +0 -0
  129. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/harris_matrix_editor.py +0 -0
  130. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/i18n.py +0 -0
  131. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/icons.py +0 -0
  132. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/inventario_dialog_extended.py +0 -0
  133. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/main_window.py +0 -0
  134. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/media_manager_advanced.py +0 -0
  135. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/postgres_installer_dialog.py +0 -0
  136. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/pottery_dialog_extended.py +0 -0
  137. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/pottery_panel.py +0 -0
  138. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/pyarchinit_import_export_dialog.py +0 -0
  139. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/thesaurus_dialog.py +0 -0
  140. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/desktop_gui/us_dialog_extended.py +0 -0
  141. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/__init__.py +0 -0
  142. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/inventario_dto.py +0 -0
  143. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/site_dto.py +0 -0
  144. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/dto/us_dto.py +0 -0
  145. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/exceptions.py +0 -0
  146. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/__init__.py +0 -0
  147. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/converter.py +0 -0
  148. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/dot_parser.py +0 -0
  149. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/em_palette.py +0 -0
  150. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/graphml_builder.py +0 -0
  151. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/graphml_exporter.py +0 -0
  152. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/pure_networkx_exporter.py +0 -0
  153. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/svg_resources.py +0 -0
  154. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/templates/EM_palette.graphml +0 -0
  155. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/x11_colors.py +0 -0
  156. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_converter/yed_template.py +0 -0
  157. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_io/__init__.py +0 -0
  158. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_io/reader.py +0 -0
  159. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphml_io/writer.py +0 -0
  160. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/__init__.py +0 -0
  161. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/auto_regen.py +0 -0
  162. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/edge_registry.py +0 -0
  163. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/exceptions.py +0 -0
  164. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/filesystem.py +0 -0
  165. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/ingest_plan.py +0 -0
  166. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/ingestor.py +0 -0
  167. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/paradata_store.py +0 -0
  168. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/graphproj/projector.py +0 -0
  169. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/__init__.py +0 -0
  170. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +0 -0
  171. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/matrix_generator.py +0 -0
  172. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/matrix_visualizer.py +0 -0
  173. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +0 -0
  174. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/__init__.py +0 -0
  175. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/compound_layout.py +0 -0
  176. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/period_sync_service.py +0 -0
  177. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/harris_swimlane/row_provider.py +0 -0
  178. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/i18n/__init__.py +0 -0
  179. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/i18n/flask_babel_config.py +0 -0
  180. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/i18n/locale_manager.py +0 -0
  181. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/__init__.py +0 -0
  182. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/__main__.py +0 -0
  183. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/blender_client.py +0 -0
  184. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/config.py +0 -0
  185. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/event_stream.py +0 -0
  186. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/graphml_parser.py +0 -0
  187. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/http_server.py +0 -0
  188. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/period_filter.py +0 -0
  189. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/__init__.py +0 -0
  190. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/base_prompt.py +0 -0
  191. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/period_visualization_prompt.py +0 -0
  192. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/stratigraphic_model_prompt.py +0 -0
  193. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/prompts/us_description_prompt.py +0 -0
  194. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/proxy_generator.py +0 -0
  195. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/__init__.py +0 -0
  196. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/base_resource.py +0 -0
  197. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/graphml_resource.py +0 -0
  198. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/periods_resource.py +0 -0
  199. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/relationships_resource.py +0 -0
  200. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/sites_resource.py +0 -0
  201. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/resources/us_resource.py +0 -0
  202. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/server.py +0 -0
  203. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/__init__.py +0 -0
  204. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/base_tool.py +0 -0
  205. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/batch_insert_tool.py +0 -0
  206. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/build_3d_tool.py +0 -0
  207. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/chatgpt_fetch_tool.py +0 -0
  208. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/chatgpt_search_tool.py +0 -0
  209. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/configure_em_nodes_tool.py +0 -0
  210. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/create_database_tool.py +0 -0
  211. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/create_harris_matrix_tool.py +0 -0
  212. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/data_import_parser_tool.py +0 -0
  213. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/data_management_tool.py +0 -0
  214. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/database_manager_tool.py +0 -0
  215. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/delete_data_tool.py +0 -0
  216. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/export_harris_matrix_graphml_tool.py +0 -0
  217. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/export_tool.py +0 -0
  218. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/filter_tool.py +0 -0
  219. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/generate_report_tool.py +0 -0
  220. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/get_schema_tool.py +0 -0
  221. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/import_excel_tool.py +0 -0
  222. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/insert_data_tool.py +0 -0
  223. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/manage_services_tool.py +0 -0
  224. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/material_tool.py +0 -0
  225. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/media_management_tool.py +0 -0
  226. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/position_tool.py +0 -0
  227. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/pyarchinit_sync_tool.py +0 -0
  228. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/resolve_conflicts_tool.py +0 -0
  229. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/service_management_tool.py +0 -0
  230. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/thesaurus_management_tool.py +0 -0
  231. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/update_data_tool.py +0 -0
  232. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/upload_file_tool.py +0 -0
  233. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_relationship_format_tool.py +0 -0
  234. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_relationship_integrity_tool.py +0 -0
  235. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_stratigraphic_relationships_tool.py +0 -0
  236. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/mcp_server/tools/validate_stratigraphy_tool.py +0 -0
  237. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/media_manager/__init__.py +0 -0
  238. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/media_manager/media_handler.py +0 -0
  239. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/__init__.py +0 -0
  240. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/ai_chat.py +0 -0
  241. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/app_setting.py +0 -0
  242. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/base.py +0 -0
  243. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/datazione.py +0 -0
  244. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/extended_matrix.py +0 -0
  245. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/harris_matrix.py +0 -0
  246. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/inventario_materiali.py +0 -0
  247. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/media.py +0 -0
  248. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/pottery.py +0 -0
  249. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/site.py +0 -0
  250. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/thesaurus.py +0 -0
  251. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/tma.py +0 -0
  252. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/us.py +0 -0
  253. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/models/user.py +0 -0
  254. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/__init__.py +0 -0
  255. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pdf_generator.py +0 -0
  256. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pdf_generator_backup.py +0 -0
  257. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +0 -0
  258. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +0 -0
  259. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/pdf_export/usm_implementation.py +0 -0
  260. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/s3d_integration/__init__.py +0 -0
  261. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/s3d_integration/model_manager.py +0 -0
  262. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/s3d_integration/s3d_converter.py +0 -0
  263. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/__init__.py +0 -0
  264. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/auto_translate.py +0 -0
  265. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/configure_claude_desktop.py +0 -0
  266. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_admin_user.py +0 -0
  267. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_correct_stratigraphy_sample.py +0 -0
  268. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_italian_sample_database.py +0 -0
  269. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_sample_for_webapp.py +0 -0
  270. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/create_sample_with_50_us.py +0 -0
  271. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/generate_test_3d_model.py +0 -0
  272. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/load_italian_as_main.py +0 -0
  273. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/load_sample_as_main.py +0 -0
  274. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/migrate_relationships.py +0 -0
  275. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/populate_sample_data.py +0 -0
  276. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/populate_simple_data.py +0 -0
  277. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/setup_auth.py +0 -0
  278. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/setup_user_env.py +0 -0
  279. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/test_cascade_delete.py +0 -0
  280. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/test_relationship_fix.py +0 -0
  281. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/update_sample_relationships.py +0 -0
  282. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/update_urls_and_versions.py +0 -0
  283. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/scripts/verify_docs.py +0 -0
  284. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/__init__.py +0 -0
  285. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/ai_assistant_service.py +0 -0
  286. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/ai_chat_service.py +0 -0
  287. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/analytics_service.py +0 -0
  288. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/app_setting_service.py +0 -0
  289. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/backup_service.py +0 -0
  290. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/command_parser.py +0 -0
  291. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/datazione_service.py +0 -0
  292. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/export_import_service.py +0 -0
  293. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/extended_matrix_excel_parser.py +0 -0
  294. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/import_export_service.py +0 -0
  295. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/inventario_service.py +0 -0
  296. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/mcp_executor.py +0 -0
  297. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/periodizzazione_service.py +0 -0
  298. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/pottery_dto.py +0 -0
  299. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/pottery_pdf_service.py +0 -0
  300. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/relationship_sync_service.py +0 -0
  301. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/search_service.py +0 -0
  302. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/site_service.py +0 -0
  303. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/thesaurus_service.py +0 -0
  304. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/tma_service.py +0 -0
  305. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/us_service.py +0 -0
  306. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/services/user_service.py +0 -0
  307. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/__init__.py +0 -0
  308. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/bundle_creator.py +0 -0
  309. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/bundle_manifest.py +0 -0
  310. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/bundle_validator.py +0 -0
  311. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/connectivity_monitor.py +0 -0
  312. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/sync_orchestrator.py +0 -0
  313. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/sync_queue.py +0 -0
  314. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/sync_state_machine.py +0 -0
  315. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/stratigraph/uuid_manager.py +0 -0
  316. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.mo +0 -0
  317. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.po +0 -0
  318. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.mo +0 -0
  319. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.po +0 -0
  320. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/translations/messages.pot +0 -0
  321. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/__init__.py +0 -0
  322. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/auth.py +0 -0
  323. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/exceptions.py +0 -0
  324. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/relationship_validator.py +0 -0
  325. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/stratigraphic_validator.py +0 -0
  326. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/tma_label_generator.py +0 -0
  327. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/utils/validators.py +0 -0
  328. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/__init__.py +0 -0
  329. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/exceptions.py +0 -0
  330. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/i18n.py +0 -0
  331. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/loader.py +0 -0
  332. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/provider.py +0 -0
  333. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/translations/vocab_en.json +0 -0
  334. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/translations/vocab_it.json +0 -0
  335. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/vocab/types.py +0 -0
  336. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/auth_routes.py +0 -0
  337. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/em_node_config_routes.py +0 -0
  338. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/excel_import_routes.py +0 -0
  339. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/graph_routes.py +0 -0
  340. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/paradata_routes.py +0 -0
  341. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/paradata_ui_routes.py +0 -0
  342. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/pyarchinit_import_export_routes.py +0 -0
  343. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/s3d_routes.py +0 -0
  344. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/socketio_events.py +0 -0
  345. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/css/style.css +0 -0
  346. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/favicon.ico +0 -0
  347. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/logo.png +0 -0
  348. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/no-image.png +0 -0
  349. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/images/pyarchinit-mini-logo.png +0 -0
  350. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/OrbitControls.js +0 -0
  351. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/stratigraphic_layout.js +0 -0
  352. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/three-d-viewer.js +0 -0
  353. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/three.min.js +0 -0
  354. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/static/js/universal_search.js +0 -0
  355. {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
  356. {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
  357. {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
  358. {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
  359. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/3d_builder/index.html +0 -0
  360. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/3d_viewer/viewer.html +0 -0
  361. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/backups.html +0 -0
  362. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database.html +0 -0
  363. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database_connect.html +0 -0
  364. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database_info.html +0 -0
  365. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/database_upload.html +0 -0
  366. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/admin/settings_ai.html +0 -0
  367. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/ai/assistant.html +0 -0
  368. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/analytics/dashboard.html +0 -0
  369. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/auth/login.html +0 -0
  370. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/auth/users.html +0 -0
  371. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/blender_viewer.html +0 -0
  372. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/dashboard.html +0 -0
  373. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/datazioni/list.html +0 -0
  374. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/docs/index.html +0 -0
  375. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/em_node_config/index.html +0 -0
  376. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/excel_import/index.html +0 -0
  377. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/export/export_import.html +0 -0
  378. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/graph_import_preview.html +0 -0
  379. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/graph_import_result.html +0 -0
  380. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_creator/index.html +0 -0
  381. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/graphml_export.html +0 -0
  382. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/large_graph_message.html +0 -0
  383. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/stratigraph_viewer.html +0 -0
  384. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/view.html +0 -0
  385. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/view_graphviz.html +0 -0
  386. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/harris_matrix/viewer_3d_integrated.html +0 -0
  387. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/inventario/form.html +0 -0
  388. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/inventario/list.html +0 -0
  389. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/media/list.html +0 -0
  390. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/media/upload.html +0 -0
  391. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/messaging/contacts.html +0 -0
  392. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/operators/directory.html +0 -0
  393. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/paradata/edit.html +0 -0
  394. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/paradata/index.html +0 -0
  395. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/paradata/list.html +0 -0
  396. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pdf/pottery_sheet.html +0 -0
  397. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/periodizzazione/form.html +0 -0
  398. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/periodizzazione/list.html +0 -0
  399. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/periodizzazione/periods.html +0 -0
  400. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/form.html +0 -0
  401. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pottery/import_form.html +0 -0
  402. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/pyarchinit_import_export/index.html +0 -0
  403. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/search/results.html +0 -0
  404. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/detail.html +0 -0
  405. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/form.html +0 -0
  406. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/list.html +0 -0
  407. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/sites/map.html +0 -0
  408. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/stats/targeted.html +0 -0
  409. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/thesaurus/list.html +0 -0
  410. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/tma/form.html +0 -0
  411. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/tma/list.html +0 -0
  412. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/us/form.html +0 -0
  413. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/us/list.html +0 -0
  414. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/templates/validation/report.html +0 -0
  415. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/test_prova_extended_matrix.graphml +0 -0
  416. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/three_d_builder_routes.py +0 -0
  417. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.graphml +0 -0
  418. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
  419. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini/web_interface/vocab_routes.py +0 -0
  420. {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
  421. {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
  422. {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
  423. {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
  424. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/dependency_links.txt +0 -0
  425. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/entry_points.txt +0 -0
  426. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/not-zip-safe +0 -0
  427. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/requires.txt +0 -0
  428. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/pyarchinit_mini.egg-info/top_level.txt +0 -0
  429. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/requirements.txt +0 -0
  430. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/setup.cfg +0 -0
  431. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/setup.py +0 -0
  432. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/__init__.py +0 -0
  433. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/conftest.py +0 -0
  434. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/e2e/__init__.py +0 -0
  435. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/e2e/test_web_vocab_full_flow.py +0 -0
  436. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/fixtures/_generate_baseline_graphml.py +0 -0
  437. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/fixtures/_generate_harris_swimlane_synthetic.py +0 -0
  438. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/fixtures/_generate_synthetic_db.py +0 -0
  439. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/fixtures/build_legacy_with_pottery.py +0 -0
  440. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/__init__.py +0 -0
  441. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_admin_ai_settings_routes.py +0 -0
  442. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_admin_backup_routes.py +0 -0
  443. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_auto_regen_on_save.py +0 -0
  444. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_full_sync_flow.py +0 -0
  445. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_graph_import_flow.py +0 -0
  446. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_graph_routes.py +0 -0
  447. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_matrix_post_cutover.py +0 -0
  448. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_matrix_visual_parity.py +0 -0
  449. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_create_row.py +0 -0
  450. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_load.py +0 -0
  451. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_save.py +0 -0
  452. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_harris_swimlane_routes_session_missing.py +0 -0
  453. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_migrate_vocab_cli.py +0 -0
  454. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_paradata_routes_authors.py +0 -0
  455. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_paradata_routes_other_types.py +0 -0
  456. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_paradata_ui.py +0 -0
  457. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_completion.py +0 -0
  458. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_excel_roundtrip.py +0 -0
  459. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_legacy_upgrade.py +0 -0
  460. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_pottery_routes.py +0 -0
  461. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_spec2_coverage_gaps.py +0 -0
  462. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/integration/test_vocab_routes.py +0 -0
  463. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/__init__.py +0 -0
  464. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_app_setting_model.py +0 -0
  465. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_app_setting_service.py +0 -0
  466. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_auto_regen.py +0 -0
  467. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_backup_service.py +0 -0
  468. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_bundle.py +0 -0
  469. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_concurrency_columns.py +0 -0
  470. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_concurrency_manager.py +0 -0
  471. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_connectivity_monitor.py +0 -0
  472. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_database_utils.py +0 -0
  473. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_deprecated_writers_shim.py +0 -0
  474. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_em_palette_vocab_backed.py +0 -0
  475. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphml_io_reader.py +0 -0
  476. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphml_io_writer.py +0 -0
  477. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_edge_registry.py +0 -0
  478. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_exceptions.py +0 -0
  479. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_filesystem.py +0 -0
  480. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_ingestor_apply.py +0 -0
  481. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_ingestor_preview.py +0 -0
  482. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_graphproj_projector.py +0 -0
  483. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_compound_layout.py +0 -0
  484. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_exceptions.py +0 -0
  485. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_period_sync.py +0 -0
  486. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_row_provider.py +0 -0
  487. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_state_load.py +0 -0
  488. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_harris_swimlane_state_save.py +0 -0
  489. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_ingest_plan.py +0 -0
  490. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_inventario_schema.py +0 -0
  491. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_migrations_backup.py +0 -0
  492. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_migrations_idempotent.py +0 -0
  493. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_optimistic_locking.py +0 -0
  494. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_paradata_store_authors.py +0 -0
  495. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_paradata_store_basic.py +0 -0
  496. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_paradata_store_other_types.py +0 -0
  497. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_pottery_dto.py +0 -0
  498. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_pottery_model.py +0 -0
  499. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_pottery_service.py +0 -0
  500. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_s3d_converter_vocab_backed.py +0 -0
  501. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_site_service.py +0 -0
  502. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_api.py +0 -0
  503. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_cli.py +0 -0
  504. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_orchestrator.py +0 -0
  505. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_queue.py +0 -0
  506. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_sync_state_machine.py +0 -0
  507. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_us_dto_unita_tipo_validator.py +0 -0
  508. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_us_schema.py +0 -0
  509. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_uuid_manager.py +0 -0
  510. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_bootstrap_failures.py +0 -0
  511. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_exceptions.py +0 -0
  512. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_i18n.py +0 -0
  513. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_loader.py +0 -0
  514. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.7.1}/tests/unit/test_vocab_provider.py +0 -0
  515. {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.4.8
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
@@ -23,7 +23,7 @@ Features:
23
23
  - Scalable and modular architecture
24
24
  """
25
25
 
26
- __version__ = "2.4.8"
26
+ __version__ = "2.7.1"
27
27
  __author__ = "PyArchInit Team"
28
28
  __email__ = "enzo.ccc@gmail.com"
29
29
 
@@ -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