pyarchinit-mini 2.4.8__tar.gz → 2.8.0__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 (543) hide show
  1. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/CHANGELOG.md +163 -0
  2. {pyarchinit_mini-2.4.8/pyarchinit_mini.egg-info → pyarchinit_mini-2.8.0}/PKG-INFO +1 -1
  3. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/__init__.py +1 -1
  4. pyarchinit_mini-2.8.0/pyarchinit_mini/ai_matrix/__init__.py +1 -0
  5. pyarchinit_mini-2.8.0/pyarchinit_mini/ai_matrix/apply.py +102 -0
  6. pyarchinit_mini-2.8.0/pyarchinit_mini/ai_matrix/plan.py +54 -0
  7. pyarchinit_mini-2.8.0/pyarchinit_mini/ai_matrix/vision_extractor.py +197 -0
  8. pyarchinit_mini-2.8.0/pyarchinit_mini/em_palette/__init__.py +11 -0
  9. pyarchinit_mini-2.8.0/pyarchinit_mini/em_palette/loader.py +171 -0
  10. pyarchinit_mini-2.8.0/pyarchinit_mini/em_palette/styles.py +27 -0
  11. pyarchinit_mini-2.8.0/pyarchinit_mini/graphml_converter/templates/EM_palette.graphml +3246 -0
  12. pyarchinit_mini-2.8.0/pyarchinit_mini/graphml_io/yed_importer.py +356 -0
  13. pyarchinit_mini-2.8.0/pyarchinit_mini/graphml_io/yed_keys.py +75 -0
  14. pyarchinit_mini-2.8.0/pyarchinit_mini/graphml_io/yed_writer.py +251 -0
  15. pyarchinit_mini-2.8.0/pyarchinit_mini/graphproj/graph_to_db.py +152 -0
  16. pyarchinit_mini-2.8.0/pyarchinit_mini/graphproj/graphml_reader.py +72 -0
  17. pyarchinit_mini-2.8.0/pyarchinit_mini/graphproj/graphml_writer.py +89 -0
  18. pyarchinit_mini-2.8.0/pyarchinit_mini/graphproj/heriverse_parser.py +87 -0
  19. pyarchinit_mini-2.8.0/pyarchinit_mini/graphproj/rapporti_codec.py +164 -0
  20. pyarchinit_mini-2.8.0/pyarchinit_mini/graphproj/s3d_projector.py +230 -0
  21. pyarchinit_mini-2.8.0/pyarchinit_mini/graphproj/s3d_to_cytoscape.py +103 -0
  22. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_swimlane/exceptions.py +8 -0
  23. pyarchinit_mini-2.8.0/pyarchinit_mini/harris_swimlane/harris_layout.py +128 -0
  24. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_swimlane/swimlane_state.py +247 -40
  25. pyarchinit_mini-2.8.0/pyarchinit_mini/i18n/lang_routes.py +21 -0
  26. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/media_service.py +37 -2
  27. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/pottery_service.py +11 -0
  28. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/app.py +26 -0
  29. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/data/paradata/domus-pompeiana/stratigraphy.graphml +265 -0
  30. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/data/paradata/metro-c-amba-aradam/stratigraphy.graphml +265 -0
  31. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/harris_creator_routes.py +217 -54
  32. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/matrix_import_routes.py +243 -0
  33. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/matrix_tools_routes.py +26 -0
  34. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/pottery_routes.py +11 -4
  35. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/js/harris_creator_editor.js +5 -1
  36. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/base.html +4 -0
  37. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/templates/components/language_switcher.html +27 -0
  38. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/harris_creator/editor.html +112 -1
  39. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/templates/matrix_import/preview.html +103 -0
  40. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/templates/matrix_import/rejected.html +22 -0
  41. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/templates/matrix_import/upload.html +69 -0
  42. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/templates/matrix_tools/index.html +80 -0
  43. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/pottery/detail.html +29 -4
  44. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/pottery/list.html +39 -9
  45. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/sites/list.html +8 -0
  46. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/templates/yed_import/index.html +21 -0
  47. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/templates/yed_import/preview.html +64 -0
  48. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/templates/yed_import/result.html +26 -0
  49. pyarchinit_mini-2.8.0/pyarchinit_mini/web_interface/yed_import_routes.py +84 -0
  50. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0/pyarchinit_mini.egg-info}/PKG-INFO +1 -1
  51. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini.egg-info/SOURCES.txt +65 -1
  52. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyproject.toml +1 -1
  53. pyarchinit_mini-2.8.0/tests/fixtures/_generate_yed_test_files.py +82 -0
  54. pyarchinit_mini-2.8.0/tests/integration/test_adarte_regression.py +61 -0
  55. pyarchinit_mini-2.8.0/tests/integration/test_api_export_graphml.py +59 -0
  56. pyarchinit_mini-2.8.0/tests/integration/test_api_export_heriverse.py +87 -0
  57. pyarchinit_mini-2.8.0/tests/integration/test_api_import_graphml.py +104 -0
  58. pyarchinit_mini-2.8.0/tests/integration/test_api_import_json.py +85 -0
  59. pyarchinit_mini-2.8.0/tests/integration/test_api_load_site.py +81 -0
  60. pyarchinit_mini-2.8.0/tests/integration/test_feature_flag_pipelines.py +67 -0
  61. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_harris_swimlane_routes_load.py +8 -0
  62. pyarchinit_mini-2.8.0/tests/integration/test_lang_routes.py +57 -0
  63. pyarchinit_mini-2.8.0/tests/integration/test_matrix_import_apply_route.py +181 -0
  64. pyarchinit_mini-2.8.0/tests/integration/test_matrix_import_rejected_route.py +73 -0
  65. pyarchinit_mini-2.8.0/tests/integration/test_matrix_import_site_widget.py +70 -0
  66. pyarchinit_mini-2.8.0/tests/integration/test_matrix_import_upload_route.py +133 -0
  67. pyarchinit_mini-2.8.0/tests/integration/test_pottery_filters_id_number_anno.py +67 -0
  68. pyarchinit_mini-2.8.0/tests/integration/test_pottery_list_media_thumbs.py +31 -0
  69. pyarchinit_mini-2.8.0/tests/integration/test_roundtrip.py +85 -0
  70. pyarchinit_mini-2.8.0/tests/integration/test_roundtrip_extmatrix.py +81 -0
  71. pyarchinit_mini-2.8.0/tests/integration/test_swimlane_group_by.py +128 -0
  72. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_yed_export_route.py +36 -23
  73. pyarchinit_mini-2.8.0/tests/integration/test_yed_import_routes.py +105 -0
  74. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_yed_writer_parity.py +2 -1
  75. pyarchinit_mini-2.8.0/tests/unit/test_ai_matrix_apply.py +165 -0
  76. pyarchinit_mini-2.8.0/tests/unit/test_ai_matrix_extractor_parse.py +84 -0
  77. pyarchinit_mini-2.8.0/tests/unit/test_ai_matrix_extractor_providers.py +97 -0
  78. pyarchinit_mini-2.8.0/tests/unit/test_ai_matrix_plan_serialization.py +38 -0
  79. pyarchinit_mini-2.8.0/tests/unit/test_graph_to_db.py +117 -0
  80. pyarchinit_mini-2.8.0/tests/unit/test_harris_layout.py +127 -0
  81. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_harris_swimlane_state_load.py +8 -0
  82. pyarchinit_mini-2.8.0/tests/unit/test_heriverse_parser.py +93 -0
  83. pyarchinit_mini-2.8.0/tests/unit/test_palette_loader.py +59 -0
  84. pyarchinit_mini-2.8.0/tests/unit/test_palette_styles.py +20 -0
  85. pyarchinit_mini-2.8.0/tests/unit/test_rapporti_codec.py +104 -0
  86. pyarchinit_mini-2.8.0/tests/unit/test_s3d_projector.py +180 -0
  87. pyarchinit_mini-2.8.0/tests/unit/test_s3d_to_cytoscape.py +75 -0
  88. pyarchinit_mini-2.8.0/tests/unit/test_yed_importer_parse.py +46 -0
  89. pyarchinit_mini-2.8.0/tests/unit/test_yed_importer_plan.py +113 -0
  90. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_yed_writer.py +8 -0
  91. pyarchinit_mini-2.8.0/tests/unit/test_yed_writer_extended_matrix.py +182 -0
  92. pyarchinit_mini-2.4.8/pyarchinit_mini/graphml_converter/templates/EM_palette.graphml +0 -658
  93. pyarchinit_mini-2.4.8/pyarchinit_mini/graphml_io/yed_writer.py +0 -157
  94. pyarchinit_mini-2.4.8/pyarchinit_mini/web_interface/templates/components/language_switcher.html +0 -47
  95. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/MANIFEST.in +0 -0
  96. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/README.md +0 -0
  97. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/babel.cfg +0 -0
  98. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/data/media_viewer_demo.db +0 -0
  99. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/data/pyarchinit_mini 2.db +0 -0
  100. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/data/pyarchinit_mini.db +0 -0
  101. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/data/pyarchinit_mini_sample.db +0 -0
  102. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/data/pyarchinit_tutorial.db +0 -0
  103. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/data/pyarchinit_tutorial_backup_20251030_093228.db +0 -0
  104. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/data/pyarchinit_tutorial_clean.db +0 -0
  105. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/data/pyarchinit_tutorial_video.db +0 -0
  106. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/data/pyarchinit_v18_demo.db +0 -0
  107. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/logo/logo_pyarchinit-mini.png +0 -0
  108. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/api/__init__.py +0 -0
  109. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/api/auth.py +0 -0
  110. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/api/dependencies.py +0 -0
  111. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/api/graphml.py +0 -0
  112. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/api/inventario.py +0 -0
  113. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/api/schemas.py +0 -0
  114. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/api/site.py +0 -0
  115. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/api/sync.py +0 -0
  116. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/api/us.py +0 -0
  117. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli/__init__.py +0 -0
  118. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli/export_import_cli.py +0 -0
  119. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli/extended_matrix_import.py +0 -0
  120. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli/graphml_cli.py +0 -0
  121. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli/harris_import.py +0 -0
  122. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli/harris_template.py +0 -0
  123. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli/migrate.py +0 -0
  124. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli/migrate_vocab.py +0 -0
  125. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli/pyarchinit_import_export_cli.py +0 -0
  126. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli/sync_cli.py +0 -0
  127. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli_interface/__init__.py +0 -0
  128. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/cli_interface/cli_app.py +0 -0
  129. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/config/__init__.py +0 -0
  130. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/config/connection_manager.py +0 -0
  131. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/config/em_node_config_manager.py +0 -0
  132. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/config/em_node_types.yaml +0 -0
  133. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/__init__.py +0 -0
  134. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/concurrency_manager.py +0 -0
  135. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/connection.py +0 -0
  136. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/database_creator.py +0 -0
  137. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/manager.py +0 -0
  138. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migration_scripts/__init__.py +0 -0
  139. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migration_scripts/add_file_path.py +0 -0
  140. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migration_scripts/add_i18n_columns.py +0 -0
  141. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migration_scripts/add_tipo_documento.py +0 -0
  142. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text.py +0 -0
  143. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text_simple.py +0 -0
  144. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_backfill.py +0 -0
  145. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_schema.py +0 -0
  146. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migrations/_2026_05_period_table_schema.py +0 -0
  147. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migrations/_2026_05_vocab_alignment.py +0 -0
  148. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migrations/__init__.py +0 -0
  149. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/migrations/backup.py +0 -0
  150. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/postgres_installer.py +0 -0
  151. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/schemas.py +0 -0
  152. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/database/utils.py +0 -0
  153. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/__init__.py +0 -0
  154. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/analytics_dialog.py +0 -0
  155. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/assets/logo.png +0 -0
  156. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/dialogs.py +0 -0
  157. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/excel_import_dialog.py +0 -0
  158. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/export_import_dialog.py +0 -0
  159. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/graphml_export_dialog.py +0 -0
  160. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/gui_app.py +0 -0
  161. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/harris_matrix_editor.py +0 -0
  162. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/i18n.py +0 -0
  163. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/icons.py +0 -0
  164. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/inventario_dialog_extended.py +0 -0
  165. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/main_window.py +0 -0
  166. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/media_manager_advanced.py +0 -0
  167. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/postgres_installer_dialog.py +0 -0
  168. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/pottery_dialog_extended.py +0 -0
  169. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/pottery_panel.py +0 -0
  170. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/pyarchinit_import_export_dialog.py +0 -0
  171. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/thesaurus_dialog.py +0 -0
  172. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/desktop_gui/us_dialog_extended.py +0 -0
  173. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/dto/__init__.py +0 -0
  174. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/dto/inventario_dto.py +0 -0
  175. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/dto/site_dto.py +0 -0
  176. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/dto/us_dto.py +0 -0
  177. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/exceptions.py +0 -0
  178. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_converter/__init__.py +0 -0
  179. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_converter/converter.py +0 -0
  180. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_converter/dot_parser.py +0 -0
  181. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_converter/em_palette.py +0 -0
  182. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_converter/graphml_builder.py +0 -0
  183. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_converter/graphml_exporter.py +0 -0
  184. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_converter/pure_networkx_exporter.py +0 -0
  185. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_converter/svg_resources.py +0 -0
  186. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_converter/x11_colors.py +0 -0
  187. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_converter/yed_template.py +0 -0
  188. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_io/__init__.py +0 -0
  189. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_io/reader.py +0 -0
  190. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphml_io/writer.py +0 -0
  191. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphproj/__init__.py +0 -0
  192. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphproj/auto_regen.py +0 -0
  193. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphproj/edge_registry.py +0 -0
  194. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphproj/exceptions.py +0 -0
  195. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphproj/filesystem.py +0 -0
  196. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphproj/ingest_plan.py +0 -0
  197. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphproj/ingestor.py +0 -0
  198. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphproj/paradata_store.py +0 -0
  199. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/graphproj/projector.py +0 -0
  200. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_matrix/__init__.py +0 -0
  201. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +0 -0
  202. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_matrix/matrix_generator.py +0 -0
  203. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_matrix/matrix_visualizer.py +0 -0
  204. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +0 -0
  205. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_swimlane/__init__.py +0 -0
  206. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_swimlane/compound_layout.py +0 -0
  207. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_swimlane/period_sync_service.py +0 -0
  208. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/harris_swimlane/row_provider.py +0 -0
  209. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/i18n/__init__.py +0 -0
  210. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/i18n/flask_babel_config.py +0 -0
  211. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/i18n/locale_manager.py +0 -0
  212. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/__init__.py +0 -0
  213. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/__main__.py +0 -0
  214. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/blender_client.py +0 -0
  215. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/config.py +0 -0
  216. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/event_stream.py +0 -0
  217. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/graphml_parser.py +0 -0
  218. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/http_server.py +0 -0
  219. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/period_filter.py +0 -0
  220. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/prompts/__init__.py +0 -0
  221. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/prompts/base_prompt.py +0 -0
  222. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/prompts/period_visualization_prompt.py +0 -0
  223. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/prompts/stratigraphic_model_prompt.py +0 -0
  224. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/prompts/us_description_prompt.py +0 -0
  225. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/proxy_generator.py +0 -0
  226. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/resources/__init__.py +0 -0
  227. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/resources/base_resource.py +0 -0
  228. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/resources/graphml_resource.py +0 -0
  229. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/resources/periods_resource.py +0 -0
  230. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/resources/relationships_resource.py +0 -0
  231. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/resources/sites_resource.py +0 -0
  232. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/resources/us_resource.py +0 -0
  233. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/server.py +0 -0
  234. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/__init__.py +0 -0
  235. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/base_tool.py +0 -0
  236. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/batch_insert_tool.py +0 -0
  237. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/build_3d_tool.py +0 -0
  238. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/chatgpt_fetch_tool.py +0 -0
  239. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/chatgpt_search_tool.py +0 -0
  240. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/configure_em_nodes_tool.py +0 -0
  241. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/create_database_tool.py +0 -0
  242. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/create_harris_matrix_tool.py +0 -0
  243. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/data_import_parser_tool.py +0 -0
  244. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/data_management_tool.py +0 -0
  245. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/database_manager_tool.py +0 -0
  246. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/delete_data_tool.py +0 -0
  247. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/export_harris_matrix_graphml_tool.py +0 -0
  248. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/export_tool.py +0 -0
  249. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/filter_tool.py +0 -0
  250. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/generate_report_tool.py +0 -0
  251. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/get_schema_tool.py +0 -0
  252. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/import_excel_tool.py +0 -0
  253. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/insert_data_tool.py +0 -0
  254. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/manage_services_tool.py +0 -0
  255. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/material_tool.py +0 -0
  256. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/media_management_tool.py +0 -0
  257. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/position_tool.py +0 -0
  258. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/pyarchinit_sync_tool.py +0 -0
  259. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/resolve_conflicts_tool.py +0 -0
  260. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/service_management_tool.py +0 -0
  261. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/thesaurus_management_tool.py +0 -0
  262. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/update_data_tool.py +0 -0
  263. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/upload_file_tool.py +0 -0
  264. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/validate_relationship_format_tool.py +0 -0
  265. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/validate_relationship_integrity_tool.py +0 -0
  266. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/validate_stratigraphic_relationships_tool.py +0 -0
  267. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/mcp_server/tools/validate_stratigraphy_tool.py +0 -0
  268. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/media_manager/__init__.py +0 -0
  269. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/media_manager/media_handler.py +0 -0
  270. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/__init__.py +0 -0
  271. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/ai_chat.py +0 -0
  272. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/app_setting.py +0 -0
  273. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/base.py +0 -0
  274. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/datazione.py +0 -0
  275. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/extended_matrix.py +0 -0
  276. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/harris_matrix.py +0 -0
  277. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/inventario_materiali.py +0 -0
  278. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/media.py +0 -0
  279. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/pottery.py +0 -0
  280. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/site.py +0 -0
  281. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/thesaurus.py +0 -0
  282. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/tma.py +0 -0
  283. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/us.py +0 -0
  284. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/models/user.py +0 -0
  285. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/pdf_export/__init__.py +0 -0
  286. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/pdf_export/pdf_generator.py +0 -0
  287. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/pdf_export/pdf_generator_backup.py +0 -0
  288. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +0 -0
  289. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +0 -0
  290. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/pdf_export/usm_implementation.py +0 -0
  291. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/s3d_integration/__init__.py +0 -0
  292. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/s3d_integration/model_manager.py +0 -0
  293. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/s3d_integration/s3d_converter.py +0 -0
  294. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/__init__.py +0 -0
  295. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/auto_translate.py +0 -0
  296. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/configure_claude_desktop.py +0 -0
  297. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/create_admin_user.py +0 -0
  298. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/create_correct_stratigraphy_sample.py +0 -0
  299. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/create_italian_sample_database.py +0 -0
  300. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/create_sample_for_webapp.py +0 -0
  301. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/create_sample_with_50_us.py +0 -0
  302. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/generate_test_3d_model.py +0 -0
  303. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/load_italian_as_main.py +0 -0
  304. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/load_sample_as_main.py +0 -0
  305. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/migrate_relationships.py +0 -0
  306. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/populate_sample_data.py +0 -0
  307. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/populate_simple_data.py +0 -0
  308. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/setup_auth.py +0 -0
  309. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/setup_user_env.py +0 -0
  310. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/test_cascade_delete.py +0 -0
  311. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/test_relationship_fix.py +0 -0
  312. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/update_sample_relationships.py +0 -0
  313. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/update_urls_and_versions.py +0 -0
  314. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/scripts/verify_docs.py +0 -0
  315. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/__init__.py +0 -0
  316. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/ai_assistant_service.py +0 -0
  317. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/ai_chat_service.py +0 -0
  318. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/analytics_service.py +0 -0
  319. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/app_setting_service.py +0 -0
  320. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/backup_service.py +0 -0
  321. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/command_parser.py +0 -0
  322. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/datazione_service.py +0 -0
  323. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/export_import_service.py +0 -0
  324. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/extended_matrix_excel_parser.py +0 -0
  325. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/import_export_service.py +0 -0
  326. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/inventario_service.py +0 -0
  327. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/mcp_executor.py +0 -0
  328. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/periodizzazione_service.py +0 -0
  329. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/pottery_dto.py +0 -0
  330. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/pottery_pdf_service.py +0 -0
  331. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/relationship_sync_service.py +0 -0
  332. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/search_service.py +0 -0
  333. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/site_service.py +0 -0
  334. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/thesaurus_service.py +0 -0
  335. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/tma_service.py +0 -0
  336. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/us_service.py +0 -0
  337. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/services/user_service.py +0 -0
  338. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/stratigraph/__init__.py +0 -0
  339. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/stratigraph/bundle_creator.py +0 -0
  340. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/stratigraph/bundle_manifest.py +0 -0
  341. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/stratigraph/bundle_validator.py +0 -0
  342. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/stratigraph/connectivity_monitor.py +0 -0
  343. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/stratigraph/sync_orchestrator.py +0 -0
  344. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/stratigraph/sync_queue.py +0 -0
  345. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/stratigraph/sync_state_machine.py +0 -0
  346. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/stratigraph/uuid_manager.py +0 -0
  347. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.mo +0 -0
  348. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.po +0 -0
  349. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.mo +0 -0
  350. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.po +0 -0
  351. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/translations/messages.pot +0 -0
  352. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/utils/__init__.py +0 -0
  353. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/utils/auth.py +0 -0
  354. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/utils/exceptions.py +0 -0
  355. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/utils/relationship_validator.py +0 -0
  356. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/utils/stratigraphic_validator.py +0 -0
  357. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/utils/tma_label_generator.py +0 -0
  358. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/utils/validators.py +0 -0
  359. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/vocab/__init__.py +0 -0
  360. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/vocab/exceptions.py +0 -0
  361. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/vocab/i18n.py +0 -0
  362. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/vocab/loader.py +0 -0
  363. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/vocab/provider.py +0 -0
  364. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/vocab/translations/vocab_en.json +0 -0
  365. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/vocab/translations/vocab_it.json +0 -0
  366. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/vocab/types.py +0 -0
  367. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/auth_routes.py +0 -0
  368. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/em_node_config_routes.py +0 -0
  369. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/excel_import_routes.py +0 -0
  370. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/graph_routes.py +0 -0
  371. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/paradata_routes.py +0 -0
  372. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/paradata_ui_routes.py +0 -0
  373. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/pyarchinit_import_export_routes.py +0 -0
  374. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/s3d_routes.py +0 -0
  375. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/socketio_events.py +0 -0
  376. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/css/style.css +0 -0
  377. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/images/favicon.ico +0 -0
  378. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/images/logo.png +0 -0
  379. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/images/no-image.png +0 -0
  380. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/images/pyarchinit-mini-logo.png +0 -0
  381. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/js/OrbitControls.js +0 -0
  382. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/js/stratigraphic_layout.js +0 -0
  383. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/js/three-d-viewer.js +0 -0
  384. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/js/three.min.js +0 -0
  385. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/js/universal_search.js +0 -0
  386. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.bin +0 -0
  387. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.gltf +0 -0
  388. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.mtl +0 -0
  389. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.obj +0 -0
  390. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/3d_builder/index.html +0 -0
  391. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/3d_viewer/viewer.html +0 -0
  392. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/admin/backups.html +0 -0
  393. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/admin/database.html +0 -0
  394. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/admin/database_connect.html +0 -0
  395. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/admin/database_info.html +0 -0
  396. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/admin/database_upload.html +0 -0
  397. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/admin/settings_ai.html +0 -0
  398. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/ai/assistant.html +0 -0
  399. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/analytics/dashboard.html +0 -0
  400. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/auth/login.html +0 -0
  401. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/auth/users.html +0 -0
  402. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/blender_viewer.html +0 -0
  403. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/dashboard.html +0 -0
  404. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/datazioni/list.html +0 -0
  405. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/docs/index.html +0 -0
  406. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/em_node_config/index.html +0 -0
  407. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/excel_import/index.html +0 -0
  408. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/export/export_import.html +0 -0
  409. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/graph_import_preview.html +0 -0
  410. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/graph_import_result.html +0 -0
  411. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/harris_creator/index.html +0 -0
  412. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/harris_matrix/graphml_export.html +0 -0
  413. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/harris_matrix/large_graph_message.html +0 -0
  414. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/harris_matrix/stratigraph_viewer.html +0 -0
  415. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/harris_matrix/view.html +0 -0
  416. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/harris_matrix/view_graphviz.html +0 -0
  417. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/harris_matrix/viewer_3d_integrated.html +0 -0
  418. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/inventario/form.html +0 -0
  419. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/inventario/list.html +0 -0
  420. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/media/list.html +0 -0
  421. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/media/upload.html +0 -0
  422. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/messaging/contacts.html +0 -0
  423. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/operators/directory.html +0 -0
  424. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/paradata/edit.html +0 -0
  425. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/paradata/index.html +0 -0
  426. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/paradata/list.html +0 -0
  427. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/pdf/pottery_sheet.html +0 -0
  428. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/periodizzazione/form.html +0 -0
  429. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/periodizzazione/list.html +0 -0
  430. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/periodizzazione/periods.html +0 -0
  431. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/pottery/form.html +0 -0
  432. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/pottery/import_form.html +0 -0
  433. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/pyarchinit_import_export/index.html +0 -0
  434. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/search/results.html +0 -0
  435. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/sites/detail.html +0 -0
  436. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/sites/form.html +0 -0
  437. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/sites/map.html +0 -0
  438. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/stats/targeted.html +0 -0
  439. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/thesaurus/list.html +0 -0
  440. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/tma/form.html +0 -0
  441. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/tma/list.html +0 -0
  442. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/us/form.html +0 -0
  443. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/us/list.html +0 -0
  444. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/templates/validation/report.html +0 -0
  445. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/test_prova_extended_matrix.graphml +0 -0
  446. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/three_d_builder_routes.py +0 -0
  447. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.graphml +0 -0
  448. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
  449. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/vocab_routes.py +0 -0
  450. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_heriverse.json +0 -0
  451. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.graphml +0 -0
  452. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.json +0 -0
  453. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
  454. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini.egg-info/dependency_links.txt +0 -0
  455. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini.egg-info/entry_points.txt +0 -0
  456. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini.egg-info/not-zip-safe +0 -0
  457. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini.egg-info/requires.txt +0 -0
  458. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/pyarchinit_mini.egg-info/top_level.txt +0 -0
  459. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/requirements.txt +0 -0
  460. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/setup.cfg +0 -0
  461. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/setup.py +0 -0
  462. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/__init__.py +0 -0
  463. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/conftest.py +0 -0
  464. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/e2e/__init__.py +0 -0
  465. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/e2e/test_web_vocab_full_flow.py +0 -0
  466. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/fixtures/_generate_baseline_graphml.py +0 -0
  467. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/fixtures/_generate_harris_swimlane_synthetic.py +0 -0
  468. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/fixtures/_generate_synthetic_db.py +0 -0
  469. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/fixtures/build_legacy_with_pottery.py +0 -0
  470. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/__init__.py +0 -0
  471. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_admin_ai_settings_routes.py +0 -0
  472. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_admin_backup_routes.py +0 -0
  473. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_auto_regen_on_save.py +0 -0
  474. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_full_sync_flow.py +0 -0
  475. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_graph_import_flow.py +0 -0
  476. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_graph_routes.py +0 -0
  477. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_harris_matrix_post_cutover.py +0 -0
  478. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_harris_matrix_visual_parity.py +0 -0
  479. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_harris_swimlane_routes_create_row.py +0 -0
  480. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_harris_swimlane_routes_save.py +0 -0
  481. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_harris_swimlane_routes_session_missing.py +0 -0
  482. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_migrate_vocab_cli.py +0 -0
  483. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_paradata_routes_authors.py +0 -0
  484. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_paradata_routes_other_types.py +0 -0
  485. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_paradata_ui.py +0 -0
  486. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_pottery_completion.py +0 -0
  487. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_pottery_excel_roundtrip.py +0 -0
  488. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_pottery_legacy_upgrade.py +0 -0
  489. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_pottery_routes.py +0 -0
  490. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_spec2_coverage_gaps.py +0 -0
  491. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/integration/test_vocab_routes.py +0 -0
  492. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/__init__.py +0 -0
  493. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_app_setting_model.py +0 -0
  494. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_app_setting_service.py +0 -0
  495. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_auto_regen.py +0 -0
  496. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_backup_service.py +0 -0
  497. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_bundle.py +0 -0
  498. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_concurrency_columns.py +0 -0
  499. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_concurrency_manager.py +0 -0
  500. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_connectivity_monitor.py +0 -0
  501. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_database_utils.py +0 -0
  502. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_deprecated_writers_shim.py +0 -0
  503. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_em_palette_vocab_backed.py +0 -0
  504. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_graphml_io_reader.py +0 -0
  505. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_graphml_io_writer.py +0 -0
  506. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_graphproj_edge_registry.py +0 -0
  507. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_graphproj_exceptions.py +0 -0
  508. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_graphproj_filesystem.py +0 -0
  509. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_graphproj_ingestor_apply.py +0 -0
  510. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_graphproj_ingestor_preview.py +0 -0
  511. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_graphproj_projector.py +0 -0
  512. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_harris_swimlane_compound_layout.py +0 -0
  513. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_harris_swimlane_exceptions.py +0 -0
  514. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_harris_swimlane_period_sync.py +0 -0
  515. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_harris_swimlane_row_provider.py +0 -0
  516. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_harris_swimlane_state_save.py +0 -0
  517. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_ingest_plan.py +0 -0
  518. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_inventario_schema.py +0 -0
  519. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_migrations_backup.py +0 -0
  520. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_migrations_idempotent.py +0 -0
  521. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_optimistic_locking.py +0 -0
  522. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_paradata_store_authors.py +0 -0
  523. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_paradata_store_basic.py +0 -0
  524. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_paradata_store_other_types.py +0 -0
  525. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_pottery_dto.py +0 -0
  526. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_pottery_model.py +0 -0
  527. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_pottery_service.py +0 -0
  528. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_s3d_converter_vocab_backed.py +0 -0
  529. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_site_service.py +0 -0
  530. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_sync_api.py +0 -0
  531. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_sync_cli.py +0 -0
  532. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_sync_orchestrator.py +0 -0
  533. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_sync_queue.py +0 -0
  534. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_sync_state_machine.py +0 -0
  535. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_us_dto_unita_tipo_validator.py +0 -0
  536. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_us_schema.py +0 -0
  537. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_uuid_manager.py +0 -0
  538. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_vocab_bootstrap_failures.py +0 -0
  539. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_vocab_exceptions.py +0 -0
  540. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_vocab_i18n.py +0 -0
  541. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_vocab_loader.py +0 -0
  542. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_vocab_provider.py +0 -0
  543. {pyarchinit_mini-2.4.8 → pyarchinit_mini-2.8.0}/tests/unit/test_vocab_types.py +0 -0
@@ -1,3 +1,166 @@
1
+ ## 2.8.0 — 2026-05-19
2
+
3
+ ### Added — EM Palette + Multi-Format Swimlane Round-Trip
4
+ - **EM palette is now the canonical style source** for swimlane rendering, GraphML export, and Heriverse/ATON JSON export. Palette loaded from `pyarchinit_mini/graphml_converter/templates/EM_palette.graphml` (3246-line canonical version) with `PaletteLoader` cache + SIGHUP hot-reload + fallback to minimal hardcoded defaults if missing.
5
+ - **`SWIMLANE_PIPELINE=s3dgraphy|legacy` feature flag** (default `s3dgraphy`) with automatic legacy fallback on exception. Set to `legacy` to roll back instantly.
6
+ - **New endpoints**:
7
+ - `GET /harris-creator/api/export/<site>/heriverse-json` — Heriverse/ATON JSON (single format).
8
+ - `POST /harris-creator/api/import/<site>/graphml` — yEd GraphML import that writes 4-tuple rapporti and inverses on BOTH involved US.
9
+ - `POST /harris-creator/api/import/<site>/json` — Heriverse JSON import (same write path).
10
+ - **Standalone `/matrix-tools` page** for import/export operations (site picker + format radio + file uploader).
11
+ - **Per-site export buttons** (GraphML, Heriverse) in sites list.
12
+ - **Swimlane toolbar**: grouping dropdown (none/area/settore/quadrato/attività/strutture), export menu, import file picker.
13
+ - **Bilingual rapporti parser**: reads both legacy 2-tuple `[rel, us]` and new 4-tuple `[rel, us, area, sito]`; always writes 4-tuple. Italian aliases include extras (`riempito da`, `si lega a`, `gli si appoggia`) absent from `vocab_it.json`.
14
+ - **Automatic stub US creation** when import edges reference missing rows; counted in result.
15
+
16
+ ### Changed
17
+ - Swimlane rows are now always periods (with "Periodo 1" fallback when `period_table` is empty or a US has no period match); the old `group_by=period_phase|struttura|...` registry collapses to a sub-grouping selector within rows. Legacy `group_by` values still work via the `legacy` pipeline.
18
+ - `/api/load/<site>` response includes a `style` dict per node and edge, derived from the EM palette (shape, fill color, border color, line style, arrow heads).
19
+
20
+ ### Internals
21
+ - New modules: `pyarchinit_mini/em_palette/` (loader, styles), `pyarchinit_mini/graphproj/` (rapporti_codec, s3d_projector, s3d_to_cytoscape, graph_to_db, heriverse_parser, graphml_reader, graphml_writer).
22
+ - New tests: 13 test files across `tests/unit/` and `tests/integration/`, plus a regression fixture (`tests/fixtures/adarte_regression_dump.sql`) anonymized from `Rimini_RN_2020_21_Museo_Fellini` (100 US, 516 edges, 8 distinct canonical labels validated end-to-end).
23
+
24
+ ### Migration notes
25
+ - The `patch_pyarchinit_post_upgrade.py` post-upgrade script's Section 27 (`swimlane.row_provider_schema`) and Section 28 (`swimlane.build_edges_literal`) still apply, but their fixes are now native to the s3dgraphy pipeline. After this upgrade, Sections 27/28 are no-ops if the legacy file no longer has the markers.
26
+
27
+ ## [2.7.1] - 2026-05-19
28
+
29
+ ### Fixed (IT)
30
+ - **AI Matrix Import** post-merge hotfix: la 2.7.0 era inservibile in produzione per 4 bug scoperti al primo uso reale.
31
+ - `g.db_session` non viene mai popolato in produzione: ora si usa `_get_session()` context manager (stesso pattern di `yed_import_routes`).
32
+ - 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.
33
+ - 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).
34
+ - Schema `us_relationships_table` corretto: colonna `sito` singola (non `sito_from`/`sito_to`), `relationship_type` (non `tipo_relazione`), `id_relationship` (non `id_rel`).
35
+ - Endpoint redirect: `us_list` (bare route) invece di `us.list_us` (blueprint inesistente).
36
+ - Template (upload/preview/rejected) ora estendono `base.html` con styling Bootstrap, navbar e icone Font Awesome.
37
+
38
+ ### Fixed (EN)
39
+ - **AI Matrix Import** post-merge hotfix: 2.7.0 was unusable in production due to 4 bugs caught on first real use.
40
+ - `g.db_session` was never populated in production: now uses `_get_session()` context manager (same pattern as `yed_import_routes`).
41
+ - 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.
42
+ - 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).
43
+ - Corrected `us_relationships_table` schema: single `sito` column (not `sito_from`/`sito_to`), `relationship_type` (not `tipo_relazione`), `id_relationship` (not `id_rel`).
44
+ - Redirect endpoint: `us_list` (bare route) instead of `us.list_us` (non-existent blueprint).
45
+ - Templates (upload/preview/rejected) now extend `base.html` with Bootstrap styling, navbar, and Font Awesome icons.
46
+
47
+ ## [2.7.0] - 2026-05-18
48
+
49
+ ### Added (IT)
50
+ - **AI Matrix Import** (`/matrix-import/`): nuova feature che usa Vision API
51
+ (Anthropic Claude Sonnet 4.7 o OpenAI GPT-5.5) per estrarre US e relazioni
52
+ stratigrafiche da un'immagine di un Harris matrix. Include validation gate
53
+ (l'AI rifiuta immagini che non sono matrici), preview editabile prima del
54
+ commit, e auto-creazione del sito se nuovo.
55
+ - L'immagine sorgente viene salvata come media legato al sito.
56
+ - Toggle Anthropic / OpenAI nel form di upload.
57
+ - Required env vars: `ANTHROPIC_API_KEY` e/o `OPENAI_API_KEY`, `AI_PROVIDER` opzionale.
58
+
59
+ ### Added (EN)
60
+ - **AI Matrix Import** (`/matrix-import/`): new feature that uses Vision API
61
+ (Anthropic Claude Sonnet 4.7 or OpenAI GPT-5.5) to extract stratigraphic
62
+ units and relationships from an image of a Harris matrix. Includes a
63
+ validation gate (the AI rejects non-matrix images), editable preview
64
+ before commit, and auto-creation of the site if new.
65
+ - Source image saved as media linked to the site.
66
+ - Anthropic / OpenAI toggle in the upload form.
67
+ - Required env vars: `ANTHROPIC_API_KEY` and/or `OPENAI_API_KEY`, optional `AI_PROVIDER`.
68
+
69
+ ## [2.6.0] - 2026-05-18
70
+
71
+ ### Changed (IT)
72
+ - Editor Harris Matrix Creator: gli archi stratigrafici sono ora resi con
73
+ routing ortogonale (90°, `curve-style: 'taxi'`) invece che con curve
74
+ bezier diagonali. Allineato al `y:PolyLineEdge` di yEd usato da
75
+ pyarchinit QGIS plugin.
76
+ - `harris_swimlane/harris_layout.py`: defaults aumentati a `v_gap=40`
77
+ (era 20) e `h_gap=50` (era 30) per dare respiro agli archi ortogonali.
78
+ Chiamanti che passano i parametri esplicitamente non sono toccati.
79
+
80
+ ### Changed (EN)
81
+ - Harris Matrix Creator editor: stratigraphic edges now render with
82
+ right-angle routing (`curve-style: 'taxi'`) instead of bezier curves,
83
+ matching the `y:PolyLineEdge` style used by pyarchinit QGIS.
84
+ - `harris_swimlane/harris_layout.py`: defaults bumped to `v_gap=40`
85
+ (was 20) and `h_gap=50` (was 30) to give orthogonal edges breathing
86
+ room. Explicit callers are unaffected.
87
+
88
+ ## [2.5.1] - 2026-05-18
89
+
90
+ ### Added (IT)
91
+ - Pottery list: anteprima media in linea con mini-carousel CSS scroll-snap
92
+ (thumb 48x48 + GLightbox). N+1 evitato con pre-load batch via
93
+ `MediaService.get_media_for_entity_ids`.
94
+ - Pottery filtri: nuovi input `id_number` e `anno` (esatti, integer cast
95
+ con guard `try/except`).
96
+ - Pottery detail: galleria thumbnail inline (120x120, GLightbox) sopra i
97
+ campi della scheda.
98
+ - Nuovo blueprint `pyarchinit_mini/i18n/lang_routes.py` con
99
+ `POST /set-language/<lang>` che salva session e fa redirect al referrer.
100
+ Lo switcher di lingua diventa `<form>` POST: preserva la query string
101
+ corrente (filtri/ricerca non si perdono più al cambio lingua).
102
+
103
+ ### Changed (IT)
104
+ - `templates/components/language_switcher.html`: `<a>` sostituiti con form POST.
105
+ - `PotteryService._FILTERABLE_INT` aggiunto con `id_number`, `anno`.
106
+ - `pottery_routes.FILTER_KEYS` esteso con `id_number`, `anno`.
107
+
108
+ ### Added (EN)
109
+ - Pottery list: inline media preview with CSS scroll-snap mini-carousel
110
+ (48x48 thumbs + GLightbox). Batch pre-load avoids N+1.
111
+ - Pottery filters: new `id_number` + `anno` exact-match inputs with
112
+ integer cast guard.
113
+ - Pottery detail: inline thumbnail gallery (120x120, GLightbox).
114
+ - New `pyarchinit_mini/i18n/lang_routes.py` blueprint: `POST /set-language/<lang>`
115
+ saves session + redirects to referrer, preserving the URL query string
116
+ (filters/search no longer lost on language switch).
117
+
118
+ ### Changed (EN)
119
+ - Language switcher templates: anchors replaced with POST forms.
120
+ - `PotteryService._FILTERABLE_INT` introduces `id_number`, `anno`.
121
+ - `pottery_routes.FILTER_KEYS` extended.
122
+
123
+ ## [2.5.0] - 2026-05-18
124
+
125
+ ### Added (IT)
126
+ - Editor swimlane: dropdown "Group by" con 9 valori (period_phase | struttura
127
+ | attivita | settore | area | ambient | saggio | quad_par | none).
128
+ Cambiando valore le lane si ricostruiscono e i nodi US si ridistribuiscono
129
+ con un layout Harris-classico server-side.
130
+ - Nuovo modulo `harris_swimlane/harris_layout.py` — ordinamento topologico
131
+ per dipendenze stratigrafiche (`overlies` / `is_after`), recent in alto.
132
+ - Nuovo `graphml_io/yed_importer.py` — parse + build_import_plan +
133
+ apply_import_plan per round-trip da Extended Matrix → DB. Idempotente,
134
+ preview 2-fasi, upsert by `node_uuid`.
135
+ - Nuova pagina `/import-graphml/` (upload + preview + apply). Sidebar entry
136
+ sia in navbar che laterale (sezione Tools).
137
+
138
+ ### Changed (IT)
139
+ - `graphml_io/yed_writer.py` riscritto: emette file Extended Matrix
140
+ byte-compat con pyarchinit QGIS (38 keys d0..d37, `y:TableNode
141
+ YED_TABLE_NODE`, `pyarchinit.epochs_meta`, `pyarchinit.*` per ogni nodo
142
+ US). Vecchio `write_yed_graphml` mantenuto come wrapper deprecato.
143
+ - API `/harris-creator/api/load/<site>` accetta `?group_by=...` query
144
+ param (default `period_phase`, retro-compat).
145
+ - API `/harris-creator/api/export/<site>/yed-graphml` accetta `?group_by=...`
146
+ e popola `epochs_meta` da `periodizzazione_table`.
147
+ - Path output cambia in `data/exports/harris_yed/<slug>-extmatrix.graphml`
148
+ (era `<slug>-harris-yed.graphml`).
149
+
150
+ ### Added (EN)
151
+ - Editor "Group by" dropdown with 9 values; lanes rebuild + Harris-classic
152
+ re-layout on change.
153
+ - New `harris_swimlane/harris_layout.py` — server-side topological
154
+ positioning.
155
+ - New `graphml_io/yed_importer.py` — round-trip yEd → DB.
156
+ - New `/import-graphml/` page (upload + preview + apply).
157
+
158
+ ### Changed (EN)
159
+ - `graphml_io/yed_writer.py` rewritten — emits 38-key Extended Matrix
160
+ byte-compat with pyarchinit.
161
+ - `/api/load` and `/api/export` accept `?group_by=...`.
162
+ - Export output path renamed `*-extmatrix.graphml`.
163
+
1
164
  ## [2.4.8] - 2026-05-18
2
165
 
3
166
  ### 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.8.0
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.8.0"
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
@@ -0,0 +1,11 @@
1
+ """EM (Extended Matrix) palette: style source of truth for US nodes and stratigraphic edges."""
2
+ from .loader import PaletteLoader, get_palette, install_sighup_reload
3
+ from .styles import NodeStyle, EdgeStyle
4
+
5
+ __all__ = [
6
+ "PaletteLoader",
7
+ "get_palette",
8
+ "install_sighup_reload",
9
+ "NodeStyle",
10
+ "EdgeStyle",
11
+ ]