omninode-memory 0.6.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 (478) hide show
  1. omninode_memory-0.6.0/.claude/architecture-handshake.md +81 -0
  2. omninode_memory-0.6.0/.env.example +192 -0
  3. omninode_memory-0.6.0/.flake8 +4 -0
  4. omninode_memory-0.6.0/.github/ISSUE_TEMPLATE/bug_report.md +13 -0
  5. omninode_memory-0.6.0/.github/ISSUE_TEMPLATE/feature_request.md +9 -0
  6. omninode_memory-0.6.0/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  7. omninode_memory-0.6.0/.github/dependabot.yml +12 -0
  8. omninode_memory-0.6.0/.github/required-checks.yaml +90 -0
  9. omninode_memory-0.6.0/.github/workflows/auto-tag-on-merge.yml +12 -0
  10. omninode_memory-0.6.0/.github/workflows/pre-commit.yml +28 -0
  11. omninode_memory-0.6.0/.github/workflows/release-dry-run.yml +27 -0
  12. omninode_memory-0.6.0/.github/workflows/release.yml +101 -0
  13. omninode_memory-0.6.0/.github/workflows/test.yml +435 -0
  14. omninode_memory-0.6.0/.gitignore +257 -0
  15. omninode_memory-0.6.0/.pre-commit-config.yaml +417 -0
  16. omninode_memory-0.6.0/.secrets.baseline +196 -0
  17. omninode_memory-0.6.0/.serena/memories/project_overview.md +24 -0
  18. omninode_memory-0.6.0/.serena/memories/suggested_commands.md +45 -0
  19. omninode_memory-0.6.0/.serena/project.yml +71 -0
  20. omninode_memory-0.6.0/.yamlfmt +11 -0
  21. omninode_memory-0.6.0/CHANGELOG.md +117 -0
  22. omninode_memory-0.6.0/CLAUDE.md +238 -0
  23. omninode_memory-0.6.0/CODE_OF_CONDUCT.md +5 -0
  24. omninode_memory-0.6.0/CONTRIBUTING.md +43 -0
  25. omninode_memory-0.6.0/LICENSE +21 -0
  26. omninode_memory-0.6.0/PKG-INFO +202 -0
  27. omninode_memory-0.6.0/README.md +162 -0
  28. omninode_memory-0.6.0/SECURITY.md +12 -0
  29. omninode_memory-0.6.0/contract.yaml +160 -0
  30. omninode_memory-0.6.0/deployment/database/migrations/001_create_subscription_tables.sql +99 -0
  31. omninode_memory-0.6.0/deployment/database/migrations/002_create_memories_table.sql +156 -0
  32. omninode_memory-0.6.0/deployment/database/migrations/003_create_crawl_state_table.sql +87 -0
  33. omninode_memory-0.6.0/deployment/database/migrations/004_create_navigation_sessions_table.sql +140 -0
  34. omninode_memory-0.6.0/deployment/database/migrations_pending/004_create_navigation_paths_collection.py +116 -0
  35. omninode_memory-0.6.0/deployment/database/migrations_pending/004_create_navigation_sessions_table.sql +140 -0
  36. omninode_memory-0.6.0/deployment/database/pending/003_create_crawl_state_table.sql +87 -0
  37. omninode_memory-0.6.0/docker-compose.prod.yml +172 -0
  38. omninode_memory-0.6.0/docker-compose.yml +173 -0
  39. omninode_memory-0.6.0/docs/INDEX.md +101 -0
  40. omninode_memory-0.6.0/docs/PERFORMANCE_TESTING.md +335 -0
  41. omninode_memory-0.6.0/docs/architecture/ARCH_002_KAFKA_ABSTRACTION.md +287 -0
  42. omninode_memory-0.6.0/docs/architecture/ONEX_FOUR_NODE_ARCHITECTURE.md +271 -0
  43. omninode_memory-0.6.0/docs/ci/CI_MONITORING_GUIDE.md +302 -0
  44. omninode_memory-0.6.0/docs/db-split/fk-audit-omn-2069.md +39 -0
  45. omninode_memory-0.6.0/docs/environment_variables.md +595 -0
  46. omninode_memory-0.6.0/docs/handler_reuse_matrix.md +784 -0
  47. omninode_memory-0.6.0/docs/pii_handling.md +794 -0
  48. omninode_memory-0.6.0/docs/runtime/RUNTIME_PLUGINS.md +412 -0
  49. omninode_memory-0.6.0/docs/stub_protocols.md +192 -0
  50. omninode_memory-0.6.0/examples/__init__.py +5 -0
  51. omninode_memory-0.6.0/examples/advanced_architecture_demo.py +328 -0
  52. omninode_memory-0.6.0/pyproject.toml +355 -0
  53. omninode_memory-0.6.0/pyrightconfig.json +54 -0
  54. omninode_memory-0.6.0/scripts/check_migration_freeze.sh +71 -0
  55. omninode_memory-0.6.0/scripts/validate_ci_precommit_alignment.py +187 -0
  56. omninode_memory-0.6.0/scripts/validate_no_transport_imports.py +608 -0
  57. omninode_memory-0.6.0/scripts/validation/validate_enum_casing.py +154 -0
  58. omninode_memory-0.6.0/scripts/validation/validate_http_imports.py +248 -0
  59. omninode_memory-0.6.0/scripts/validation/validate_kafka_imports.py +244 -0
  60. omninode_memory-0.6.0/scripts/validation/validate_model_locations.py +303 -0
  61. omninode_memory-0.6.0/scripts/validation/validate_naming.py +499 -0
  62. omninode_memory-0.6.0/scripts/validation/validate_no_backward_compatibility.py +161 -0
  63. omninode_memory-0.6.0/scripts/validation/validate_pydantic_patterns.py +620 -0
  64. omninode_memory-0.6.0/scripts/validation/validate_secrets.py +535 -0
  65. omninode_memory-0.6.0/scripts/validation/validate_single_class_per_file.py +201 -0
  66. omninode_memory-0.6.0/src/omnimemory/__init__.py +114 -0
  67. omninode_memory-0.6.0/src/omnimemory/_compat_imports.py +21 -0
  68. omninode_memory-0.6.0/src/omnimemory/audit/__init__.py +4 -0
  69. omninode_memory-0.6.0/src/omnimemory/audit/__main__.py +184 -0
  70. omninode_memory-0.6.0/src/omnimemory/audit/io_audit.py +678 -0
  71. omninode_memory-0.6.0/src/omnimemory/bootstrap.py +443 -0
  72. omninode_memory-0.6.0/src/omnimemory/enums/__init__.py +51 -0
  73. omninode_memory-0.6.0/src/omnimemory/enums/crawl/__init__.py +15 -0
  74. omninode_memory-0.6.0/src/omnimemory/enums/crawl/enum_context_source_type.py +34 -0
  75. omninode_memory-0.6.0/src/omnimemory/enums/crawl/enum_crawler_type.py +31 -0
  76. omninode_memory-0.6.0/src/omnimemory/enums/crawl/enum_detected_doc_type.py +43 -0
  77. omninode_memory-0.6.0/src/omnimemory/enums/enum_attribution_signal_type.py +81 -0
  78. omninode_memory-0.6.0/src/omnimemory/enums/enum_context_item_type.py +47 -0
  79. omninode_memory-0.6.0/src/omnimemory/enums/enum_data_type.py +28 -0
  80. omninode_memory-0.6.0/src/omnimemory/enums/enum_entity_extraction_mode.py +70 -0
  81. omninode_memory-0.6.0/src/omnimemory/enums/enum_error_code.py +111 -0
  82. omninode_memory-0.6.0/src/omnimemory/enums/enum_intelligence_operation_type.py +23 -0
  83. omninode_memory-0.6.0/src/omnimemory/enums/enum_lifecycle_state.py +35 -0
  84. omninode_memory-0.6.0/src/omnimemory/enums/enum_memory_operation_type.py +37 -0
  85. omninode_memory-0.6.0/src/omnimemory/enums/enum_memory_storage_type.py +21 -0
  86. omninode_memory-0.6.0/src/omnimemory/enums/enum_migration_status.py +54 -0
  87. omninode_memory-0.6.0/src/omnimemory/enums/enum_node_type.py +17 -0
  88. omninode_memory-0.6.0/src/omnimemory/enums/enum_operation_status.py +31 -0
  89. omninode_memory-0.6.0/src/omnimemory/enums/enum_priority_level.py +20 -0
  90. omninode_memory-0.6.0/src/omnimemory/enums/enum_promotion_tier.py +43 -0
  91. omninode_memory-0.6.0/src/omnimemory/enums/enum_semantic_entity_type.py +125 -0
  92. omninode_memory-0.6.0/src/omnimemory/enums/enum_severity.py +13 -0
  93. omninode_memory-0.6.0/src/omnimemory/enums/enum_subscription_status.py +29 -0
  94. omninode_memory-0.6.0/src/omnimemory/enums/enum_trust_level.py +48 -0
  95. omninode_memory-0.6.0/src/omnimemory/errors/__init__.py +46 -0
  96. omninode_memory-0.6.0/src/omnimemory/errors/embedding_errors.py +65 -0
  97. omninode_memory-0.6.0/src/omnimemory/handlers/__init__.py +128 -0
  98. omninode_memory-0.6.0/src/omnimemory/handlers/adapters/__init__.py +138 -0
  99. omninode_memory-0.6.0/src/omnimemory/handlers/adapters/adapter_embedding_http.py +638 -0
  100. omninode_memory-0.6.0/src/omnimemory/handlers/adapters/adapter_graph_memory.py +1100 -0
  101. omninode_memory-0.6.0/src/omnimemory/handlers/adapters/adapter_intent_graph.py +1445 -0
  102. omninode_memory-0.6.0/src/omnimemory/handlers/adapters/adapter_rate_limiter.py +615 -0
  103. omninode_memory-0.6.0/src/omnimemory/handlers/adapters/adapter_valkey.py +962 -0
  104. omninode_memory-0.6.0/src/omnimemory/handlers/adapters/models/__init__.py +44 -0
  105. omninode_memory-0.6.0/src/omnimemory/handlers/adapters/models/model_adapter_intent_graph_config.py +138 -0
  106. omninode_memory-0.6.0/src/omnimemory/handlers/adapters/models/model_intent_domain.py +342 -0
  107. omninode_memory-0.6.0/src/omnimemory/handlers/adapters/models/model_intent_graph_health.py +70 -0
  108. omninode_memory-0.6.0/src/omnimemory/handlers/handler_intent.py +940 -0
  109. omninode_memory-0.6.0/src/omnimemory/handlers/handler_subscription.py +1975 -0
  110. omninode_memory-0.6.0/src/omnimemory/handlers/models/__init__.py +20 -0
  111. omninode_memory-0.6.0/src/omnimemory/handlers/models/model_handler_intent_config.py +241 -0
  112. omninode_memory-0.6.0/src/omnimemory/models/__init__.py +70 -0
  113. omninode_memory-0.6.0/src/omnimemory/models/adapters/__init__.py +49 -0
  114. omninode_memory-0.6.0/src/omnimemory/models/adapters/model_connections_result.py +61 -0
  115. omninode_memory-0.6.0/src/omnimemory/models/adapters/model_filesystem_adapter_config.py +51 -0
  116. omninode_memory-0.6.0/src/omnimemory/models/adapters/model_graph_memory_config.py +194 -0
  117. omninode_memory-0.6.0/src/omnimemory/models/adapters/model_graph_memory_health.py +53 -0
  118. omninode_memory-0.6.0/src/omnimemory/models/adapters/model_memory_connection.py +65 -0
  119. omninode_memory-0.6.0/src/omnimemory/models/adapters/model_related_memory.py +94 -0
  120. omninode_memory-0.6.0/src/omnimemory/models/adapters/model_related_memory_result.py +83 -0
  121. omninode_memory-0.6.0/src/omnimemory/models/config/__init__.py +91 -0
  122. omninode_memory-0.6.0/src/omnimemory/models/config/model_doc_source_config.py +106 -0
  123. omninode_memory-0.6.0/src/omnimemory/models/config/model_embedding_config.py +238 -0
  124. omninode_memory-0.6.0/src/omnimemory/models/config/model_filesystem_config.py +76 -0
  125. omninode_memory-0.6.0/src/omnimemory/models/config/model_handler_semantic_compute_config.py +68 -0
  126. omninode_memory-0.6.0/src/omnimemory/models/config/model_linear_scope_mapping.py +42 -0
  127. omninode_memory-0.6.0/src/omnimemory/models/config/model_memory_service_config.py +67 -0
  128. omninode_memory-0.6.0/src/omnimemory/models/config/model_path_scope_mapping.py +42 -0
  129. omninode_memory-0.6.0/src/omnimemory/models/config/model_postgres_config.py +173 -0
  130. omninode_memory-0.6.0/src/omnimemory/models/config/model_promotion_threshold_set.py +139 -0
  131. omninode_memory-0.6.0/src/omnimemory/models/config/model_qdrant_config.py +128 -0
  132. omninode_memory-0.6.0/src/omnimemory/models/config/model_rate_limiter_config.py +129 -0
  133. omninode_memory-0.6.0/src/omnimemory/models/config/model_scope_mapping_config.py +274 -0
  134. omninode_memory-0.6.0/src/omnimemory/models/config/model_semantic_compute_policy_config.py +292 -0
  135. omninode_memory-0.6.0/src/omnimemory/models/container/__init__.py +10 -0
  136. omninode_memory-0.6.0/src/omnimemory/models/contracts/__init__.py +43 -0
  137. omninode_memory-0.6.0/src/omnimemory/models/contracts/mixin_handler_routing.py +26 -0
  138. omninode_memory-0.6.0/src/omnimemory/models/contracts/model_contract_compute_extended.py +33 -0
  139. omninode_memory-0.6.0/src/omnimemory/models/contracts/model_contract_effect_extended.py +33 -0
  140. omninode_memory-0.6.0/src/omnimemory/models/contracts/model_contract_orchestrator_extended.py +37 -0
  141. omninode_memory-0.6.0/src/omnimemory/models/contracts/model_contract_reducer_extended.py +33 -0
  142. omninode_memory-0.6.0/src/omnimemory/models/core/__init__.py +31 -0
  143. omninode_memory-0.6.0/src/omnimemory/models/core/model_memory_context.py +190 -0
  144. omninode_memory-0.6.0/src/omnimemory/models/core/model_memory_metadata.py +85 -0
  145. omninode_memory-0.6.0/src/omnimemory/models/core/model_memory_parameters.py +126 -0
  146. omninode_memory-0.6.0/src/omnimemory/models/core/model_memory_request.py +59 -0
  147. omninode_memory-0.6.0/src/omnimemory/models/core/model_memory_response.py +101 -0
  148. omninode_memory-0.6.0/src/omnimemory/models/core/model_operation_metadata.py +91 -0
  149. omninode_memory-0.6.0/src/omnimemory/models/core/model_processing_metrics.py +148 -0
  150. omninode_memory-0.6.0/src/omnimemory/models/core/model_provenance.py +134 -0
  151. omninode_memory-0.6.0/src/omnimemory/models/crawl/__init__.py +33 -0
  152. omninode_memory-0.6.0/src/omnimemory/models/crawl/model_crawl_state_record.py +97 -0
  153. omninode_memory-0.6.0/src/omnimemory/models/crawl/model_crawl_tick_command.py +58 -0
  154. omninode_memory-0.6.0/src/omnimemory/models/crawl/model_document_changed_event.py +139 -0
  155. omninode_memory-0.6.0/src/omnimemory/models/crawl/model_document_discovered_event.py +135 -0
  156. omninode_memory-0.6.0/src/omnimemory/models/crawl/model_document_indexed_event.py +112 -0
  157. omninode_memory-0.6.0/src/omnimemory/models/crawl/model_document_indexed_kreuzberg_event.py +104 -0
  158. omninode_memory-0.6.0/src/omnimemory/models/crawl/model_document_parse_failed_event.py +86 -0
  159. omninode_memory-0.6.0/src/omnimemory/models/crawl/model_document_removed_event.py +94 -0
  160. omninode_memory-0.6.0/src/omnimemory/models/crawl/types.py +13 -0
  161. omninode_memory-0.6.0/src/omnimemory/models/events/__init__.py +24 -0
  162. omninode_memory-0.6.0/src/omnimemory/models/events/model_crawl_tick_command.py +77 -0
  163. omninode_memory-0.6.0/src/omnimemory/models/events/model_intent_classified_event.py +48 -0
  164. omninode_memory-0.6.0/src/omnimemory/models/foundation/__init__.py +169 -0
  165. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_audit_metadata.py +176 -0
  166. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_configuration.py +98 -0
  167. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_connection_metadata.py +146 -0
  168. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_error_details.py +155 -0
  169. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_health_metadata.py +110 -0
  170. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_health_response.py +144 -0
  171. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_memory_data.py +363 -0
  172. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_metrics_response.py +108 -0
  173. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_migration_progress.py +511 -0
  174. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_notes.py +219 -0
  175. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_priority.py +160 -0
  176. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_progress_summary.py +86 -0
  177. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_semver.py +8 -0
  178. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_success_metrics.py +210 -0
  179. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_system_health.py +198 -0
  180. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_tags.py +166 -0
  181. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_trust_score.py +293 -0
  182. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_typed_collections.py +570 -0
  183. omninode_memory-0.6.0/src/omnimemory/models/foundation/model_user.py +114 -0
  184. omninode_memory-0.6.0/src/omnimemory/models/intelligence/__init__.py +29 -0
  185. omninode_memory-0.6.0/src/omnimemory/models/intelligence/model_intelligence_analysis.py +132 -0
  186. omninode_memory-0.6.0/src/omnimemory/models/intelligence/model_pattern_recognition_result.py +123 -0
  187. omninode_memory-0.6.0/src/omnimemory/models/intelligence/model_semantic_analysis_result.py +148 -0
  188. omninode_memory-0.6.0/src/omnimemory/models/intelligence/model_semantic_entity.py +113 -0
  189. omninode_memory-0.6.0/src/omnimemory/models/intelligence/model_semantic_entity_list.py +67 -0
  190. omninode_memory-0.6.0/src/omnimemory/models/memory/__init__.py +25 -0
  191. omninode_memory-0.6.0/src/omnimemory/models/memory/model_memory_item.py +189 -0
  192. omninode_memory-0.6.0/src/omnimemory/models/memory/model_memory_query.py +128 -0
  193. omninode_memory-0.6.0/src/omnimemory/models/memory/model_memory_search_result.py +86 -0
  194. omninode_memory-0.6.0/src/omnimemory/models/memory/model_memory_storage_config.py +139 -0
  195. omninode_memory-0.6.0/src/omnimemory/models/memory/model_similarity_result.py +52 -0
  196. omninode_memory-0.6.0/src/omnimemory/models/scoring/__init__.py +24 -0
  197. omninode_memory-0.6.0/src/omnimemory/models/scoring/model_context_item_stats.py +172 -0
  198. omninode_memory-0.6.0/src/omnimemory/models/scoring/model_context_policy_config.py +115 -0
  199. omninode_memory-0.6.0/src/omnimemory/models/scoring/model_promotion_decision.py +122 -0
  200. omninode_memory-0.6.0/src/omnimemory/models/service/__init__.py +43 -0
  201. omninode_memory-0.6.0/src/omnimemory/models/service/model_service_config.py +150 -0
  202. omninode_memory-0.6.0/src/omnimemory/models/service/model_service_health.py +145 -0
  203. omninode_memory-0.6.0/src/omnimemory/models/service/model_service_registry.py +143 -0
  204. omninode_memory-0.6.0/src/omnimemory/models/subscription/__init__.py +42 -0
  205. omninode_memory-0.6.0/src/omnimemory/models/subscription/constants.py +48 -0
  206. omninode_memory-0.6.0/src/omnimemory/models/subscription/model_notification_event.py +75 -0
  207. omninode_memory-0.6.0/src/omnimemory/models/subscription/model_notification_event_payload.py +43 -0
  208. omninode_memory-0.6.0/src/omnimemory/models/subscription/model_subscription.py +87 -0
  209. omninode_memory-0.6.0/src/omnimemory/models/utils/__init__.py +114 -0
  210. omninode_memory-0.6.0/src/omnimemory/models/utils/model_audit.py +102 -0
  211. omninode_memory-0.6.0/src/omnimemory/models/utils/model_circuit_breaker_config.py +41 -0
  212. omninode_memory-0.6.0/src/omnimemory/models/utils/model_circuit_breaker_stats_response.py +35 -0
  213. omninode_memory-0.6.0/src/omnimemory/models/utils/model_concurrency.py +52 -0
  214. omninode_memory-0.6.0/src/omnimemory/models/utils/model_correlation_context.py +65 -0
  215. omninode_memory-0.6.0/src/omnimemory/models/utils/model_health_check_config.py +65 -0
  216. omninode_memory-0.6.0/src/omnimemory/models/utils/model_health_check_details.py +64 -0
  217. omninode_memory-0.6.0/src/omnimemory/models/utils/model_health_check_result.py +78 -0
  218. omninode_memory-0.6.0/src/omnimemory/models/utils/model_health_status.py +28 -0
  219. omninode_memory-0.6.0/src/omnimemory/models/utils/model_pii_detection_result.py +47 -0
  220. omninode_memory-0.6.0/src/omnimemory/models/utils/model_pii_detector_config.py +58 -0
  221. omninode_memory-0.6.0/src/omnimemory/models/utils/model_pii_match.py +31 -0
  222. omninode_memory-0.6.0/src/omnimemory/models/utils/model_pii_pattern_config.py +28 -0
  223. omninode_memory-0.6.0/src/omnimemory/models/utils/model_pii_type.py +49 -0
  224. omninode_memory-0.6.0/src/omnimemory/models/utils/model_resource_health_check.py +36 -0
  225. omninode_memory-0.6.0/src/omnimemory/models/utils/model_retry_attempt_info.py +38 -0
  226. omninode_memory-0.6.0/src/omnimemory/models/utils/model_retry_config.py +53 -0
  227. omninode_memory-0.6.0/src/omnimemory/models/utils/model_retry_statistics.py +42 -0
  228. omninode_memory-0.6.0/src/omnimemory/models/utils/model_structured_log_entry.py +126 -0
  229. omninode_memory-0.6.0/src/omnimemory/models/utils/model_system_health.py +37 -0
  230. omninode_memory-0.6.0/src/omnimemory/nodes/__init__.py +88 -0
  231. omninode_memory-0.6.0/src/omnimemory/nodes/agent_coordinator_orchestrator/__init__.py +80 -0
  232. omninode_memory-0.6.0/src/omnimemory/nodes/agent_coordinator_orchestrator/contract.yaml +140 -0
  233. omninode_memory-0.6.0/src/omnimemory/nodes/agent_coordinator_orchestrator/models/__init__.py +17 -0
  234. omninode_memory-0.6.0/src/omnimemory/nodes/agent_coordinator_orchestrator/models/model_request.py +206 -0
  235. omninode_memory-0.6.0/src/omnimemory/nodes/agent_coordinator_orchestrator/models/model_response.py +143 -0
  236. omninode_memory-0.6.0/src/omnimemory/nodes/base.py +126 -0
  237. omninode_memory-0.6.0/src/omnimemory/nodes/filesystem_crawler_effect/__init__.py +21 -0
  238. omninode_memory-0.6.0/src/omnimemory/nodes/filesystem_crawler_effect/contract.yaml +139 -0
  239. omninode_memory-0.6.0/src/omnimemory/nodes/filesystem_crawler_effect/handler_filesystem_crawler.py +944 -0
  240. omninode_memory-0.6.0/src/omnimemory/nodes/filesystem_crawler_effect/models/__init__.py +17 -0
  241. omninode_memory-0.6.0/src/omnimemory/nodes/filesystem_crawler_effect/models/model_filesystem_crawl_result.py +93 -0
  242. omninode_memory-0.6.0/src/omnimemory/nodes/filesystem_crawler_effect/models/model_filesystem_crawler_config.py +89 -0
  243. omninode_memory-0.6.0/src/omnimemory/nodes/intent_event_consumer_effect/__init__.py +22 -0
  244. omninode_memory-0.6.0/src/omnimemory/nodes/intent_event_consumer_effect/contract.yaml +153 -0
  245. omninode_memory-0.6.0/src/omnimemory/nodes/intent_event_consumer_effect/handler_intent_event_consumer.py +803 -0
  246. omninode_memory-0.6.0/src/omnimemory/nodes/intent_event_consumer_effect/models/__init__.py +16 -0
  247. omninode_memory-0.6.0/src/omnimemory/nodes/intent_event_consumer_effect/models/model_consumer_config.py +77 -0
  248. omninode_memory-0.6.0/src/omnimemory/nodes/intent_event_consumer_effect/models/model_consumer_health.py +88 -0
  249. omninode_memory-0.6.0/src/omnimemory/nodes/intent_event_consumer_effect/utils/__init__.py +12 -0
  250. omninode_memory-0.6.0/src/omnimemory/nodes/intent_event_consumer_effect/utils/util_event_mapper.py +48 -0
  251. omninode_memory-0.6.0/src/omnimemory/nodes/intent_query_effect/__init__.py +67 -0
  252. omninode_memory-0.6.0/src/omnimemory/nodes/intent_query_effect/contract.yaml +233 -0
  253. omninode_memory-0.6.0/src/omnimemory/nodes/intent_query_effect/handlers/__init__.py +43 -0
  254. omninode_memory-0.6.0/src/omnimemory/nodes/intent_query_effect/handlers/handler_intent_query.py +728 -0
  255. omninode_memory-0.6.0/src/omnimemory/nodes/intent_query_effect/models/__init__.py +37 -0
  256. omninode_memory-0.6.0/src/omnimemory/nodes/intent_query_effect/models/model_handler_intent_query_config.py +83 -0
  257. omninode_memory-0.6.0/src/omnimemory/nodes/intent_query_effect/registry/__init__.py +39 -0
  258. omninode_memory-0.6.0/src/omnimemory/nodes/intent_query_effect/registry/registry_intent_query_effect.py +276 -0
  259. omninode_memory-0.6.0/src/omnimemory/nodes/intent_query_effect/utils/__init__.py +15 -0
  260. omninode_memory-0.6.0/src/omnimemory/nodes/intent_query_effect/utils/util_intent_mapping.py +120 -0
  261. omninode_memory-0.6.0/src/omnimemory/nodes/intent_storage_effect/__init__.py +27 -0
  262. omninode_memory-0.6.0/src/omnimemory/nodes/intent_storage_effect/adapters/__init__.py +11 -0
  263. omninode_memory-0.6.0/src/omnimemory/nodes/intent_storage_effect/adapters/adapter_intent_storage.py +424 -0
  264. omninode_memory-0.6.0/src/omnimemory/nodes/intent_storage_effect/contract.yaml +214 -0
  265. omninode_memory-0.6.0/src/omnimemory/nodes/intent_storage_effect/models/__init__.py +17 -0
  266. omninode_memory-0.6.0/src/omnimemory/nodes/intent_storage_effect/models/model_intent_storage_request.py +145 -0
  267. omninode_memory-0.6.0/src/omnimemory/nodes/intent_storage_effect/models/model_intent_storage_response.py +129 -0
  268. omninode_memory-0.6.0/src/omnimemory/nodes/kreuzberg_parse_effect/__init__.py +12 -0
  269. omninode_memory-0.6.0/src/omnimemory/nodes/kreuzberg_parse_effect/clients/__init__.py +3 -0
  270. omninode_memory-0.6.0/src/omnimemory/nodes/kreuzberg_parse_effect/clients/client_kreuzberg.py +181 -0
  271. omninode_memory-0.6.0/src/omnimemory/nodes/kreuzberg_parse_effect/contract.yaml +143 -0
  272. omninode_memory-0.6.0/src/omnimemory/nodes/kreuzberg_parse_effect/handler_kreuzberg_parse.py +474 -0
  273. omninode_memory-0.6.0/src/omnimemory/nodes/kreuzberg_parse_effect/models/__init__.py +17 -0
  274. omninode_memory-0.6.0/src/omnimemory/nodes/kreuzberg_parse_effect/models/model_kreuzberg_parse_config.py +78 -0
  275. omninode_memory-0.6.0/src/omnimemory/nodes/kreuzberg_parse_effect/models/model_kreuzberg_parse_result.py +46 -0
  276. omninode_memory-0.6.0/src/omnimemory/nodes/memory_consolidator_reducer/__init__.py +12 -0
  277. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/__init__.py +102 -0
  278. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/adapters/__init__.py +50 -0
  279. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/adapters/adapter_postgres_deactivate_memory.py +334 -0
  280. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/adapters/adapter_runtime_tick_memory.py +264 -0
  281. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/contract.yaml +250 -0
  282. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/__init__.py +60 -0
  283. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/handler_memory_archive.py +1540 -0
  284. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/handler_memory_expire.py +998 -0
  285. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/handler_memory_tick.py +974 -0
  286. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/models/__init__.py +37 -0
  287. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/validators/__init__.py +51 -0
  288. omninode_memory-0.6.0/src/omnimemory/nodes/memory_lifecycle_orchestrator/validators/validator_lifecycle_transition.py +262 -0
  289. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/__init__.py +72 -0
  290. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/clients/__init__.py +44 -0
  291. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/clients/embedding_client.py +412 -0
  292. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/contract.yaml +238 -0
  293. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/handlers/__init__.py +49 -0
  294. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_db_mock.py +393 -0
  295. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_graph_mock.py +401 -0
  296. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_memory_retrieval.py +326 -0
  297. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_qdrant_mock.py +467 -0
  298. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/models/__init__.py +36 -0
  299. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/models/model_embedding_client_config.py +65 -0
  300. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_db_mock_config.py +42 -0
  301. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_graph_mock_config.py +49 -0
  302. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_memory_retrieval_config.py +55 -0
  303. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_qdrant_mock_config.py +104 -0
  304. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/models/model_memory_retrieval_request.py +179 -0
  305. omninode_memory-0.6.0/src/omnimemory/nodes/memory_retrieval_effect/models/model_memory_retrieval_response.py +144 -0
  306. omninode_memory-0.6.0/src/omnimemory/nodes/memory_storage_effect/__init__.py +28 -0
  307. omninode_memory-0.6.0/src/omnimemory/nodes/memory_storage_effect/adapters/__init__.py +47 -0
  308. omninode_memory-0.6.0/src/omnimemory/nodes/memory_storage_effect/adapters/adapter_filesystem.py +1077 -0
  309. omninode_memory-0.6.0/src/omnimemory/nodes/memory_storage_effect/contract.yaml +244 -0
  310. omninode_memory-0.6.0/src/omnimemory/nodes/memory_storage_effect/models/__init__.py +20 -0
  311. omninode_memory-0.6.0/src/omnimemory/nodes/memory_storage_effect/models/model_memory_storage_request.py +143 -0
  312. omninode_memory-0.6.0/src/omnimemory/nodes/memory_storage_effect/models/model_memory_storage_response.py +65 -0
  313. omninode_memory-0.6.0/src/omnimemory/nodes/navigation_history_reducer/__init__.py +61 -0
  314. omninode_memory-0.6.0/src/omnimemory/nodes/navigation_history_reducer/handlers/__init__.py +10 -0
  315. omninode_memory-0.6.0/src/omnimemory/nodes/navigation_history_reducer/handlers/handler_navigation_history_reducer.py +585 -0
  316. omninode_memory-0.6.0/src/omnimemory/nodes/navigation_history_reducer/models/__init__.py +25 -0
  317. omninode_memory-0.6.0/src/omnimemory/nodes/navigation_history_reducer/models/model_navigation_history_request.py +31 -0
  318. omninode_memory-0.6.0/src/omnimemory/nodes/navigation_history_reducer/models/model_navigation_history_response.py +56 -0
  319. omninode_memory-0.6.0/src/omnimemory/nodes/navigation_history_reducer/models/model_navigation_session.py +157 -0
  320. omninode_memory-0.6.0/src/omnimemory/nodes/navigation_history_reducer/node_navigation_history_reducer.py +62 -0
  321. omninode_memory-0.6.0/src/omnimemory/nodes/semantic_analyzer_compute/__init__.py +68 -0
  322. omninode_memory-0.6.0/src/omnimemory/nodes/semantic_analyzer_compute/contract.yaml +109 -0
  323. omninode_memory-0.6.0/src/omnimemory/nodes/semantic_analyzer_compute/handlers/__init__.py +26 -0
  324. omninode_memory-0.6.0/src/omnimemory/nodes/semantic_analyzer_compute/handlers/handler_semantic_compute.py +1677 -0
  325. omninode_memory-0.6.0/src/omnimemory/nodes/semantic_analyzer_compute/models/__init__.py +21 -0
  326. omninode_memory-0.6.0/src/omnimemory/nodes/semantic_analyzer_compute/models/model_semantic_analyzer_compute_request.py +84 -0
  327. omninode_memory-0.6.0/src/omnimemory/nodes/semantic_analyzer_compute/models/model_semantic_analyzer_compute_response.py +125 -0
  328. omninode_memory-0.6.0/src/omnimemory/nodes/semantic_analyzer_compute/node_semantic_analyzer_compute.py +239 -0
  329. omninode_memory-0.6.0/src/omnimemory/nodes/similarity_compute/__init__.py +63 -0
  330. omninode_memory-0.6.0/src/omnimemory/nodes/similarity_compute/contract.yaml +104 -0
  331. omninode_memory-0.6.0/src/omnimemory/nodes/similarity_compute/handlers/__init__.py +48 -0
  332. omninode_memory-0.6.0/src/omnimemory/nodes/similarity_compute/handlers/handler_similarity_compute.py +606 -0
  333. omninode_memory-0.6.0/src/omnimemory/nodes/similarity_compute/models/__init__.py +24 -0
  334. omninode_memory-0.6.0/src/omnimemory/nodes/similarity_compute/models/model_handler_similarity_compute_config.py +40 -0
  335. omninode_memory-0.6.0/src/omnimemory/nodes/similarity_compute/models/model_similarity_compute_request.py +133 -0
  336. omninode_memory-0.6.0/src/omnimemory/nodes/similarity_compute/models/model_similarity_compute_response.py +120 -0
  337. omninode_memory-0.6.0/src/omnimemory/nodes/similarity_compute/node_similarity_compute.py +287 -0
  338. omninode_memory-0.6.0/src/omnimemory/nodes/statistics_reducer/__init__.py +12 -0
  339. omninode_memory-0.6.0/src/omnimemory/protocols/__init__.py +135 -0
  340. omninode_memory-0.6.0/src/omnimemory/protocols/base_protocols.py +1081 -0
  341. omninode_memory-0.6.0/src/omnimemory/protocols/data_models.py +1178 -0
  342. omninode_memory-0.6.0/src/omnimemory/protocols/error_models.py +720 -0
  343. omninode_memory-0.6.0/src/omnimemory/protocols/protocol_crawl_state_repository.py +93 -0
  344. omninode_memory-0.6.0/src/omnimemory/protocols/protocol_embedding.py +200 -0
  345. omninode_memory-0.6.0/src/omnimemory/protocols/protocol_embedding_provider.py +229 -0
  346. omninode_memory-0.6.0/src/omnimemory/protocols/protocol_handler_intent.py +300 -0
  347. omninode_memory-0.6.0/src/omnimemory/protocols/protocol_intent_graph_adapter.py +286 -0
  348. omninode_memory-0.6.0/src/omnimemory/protocols/protocol_secrets_provider.py +97 -0
  349. omninode_memory-0.6.0/src/omnimemory/runtime/__init__.py +167 -0
  350. omninode_memory-0.6.0/src/omnimemory/runtime/adapters.py +244 -0
  351. omninode_memory-0.6.0/src/omnimemory/runtime/contract_topics.py +361 -0
  352. omninode_memory-0.6.0/src/omnimemory/runtime/dispatch_handlers.py +835 -0
  353. omninode_memory-0.6.0/src/omnimemory/runtime/introspection.py +428 -0
  354. omninode_memory-0.6.0/src/omnimemory/runtime/message_type_registration.py +352 -0
  355. omninode_memory-0.6.0/src/omnimemory/runtime/plugin.py +816 -0
  356. omninode_memory-0.6.0/src/omnimemory/runtime/wiring.py +129 -0
  357. omninode_memory-0.6.0/src/omnimemory/secrets.py +115 -0
  358. omninode_memory-0.6.0/src/omnimemory/settings.py +465 -0
  359. omninode_memory-0.6.0/src/omnimemory/tools/__init__.py +4 -0
  360. omninode_memory-0.6.0/src/omnimemory/tools/contract_linter.py +312 -0
  361. omninode_memory-0.6.0/src/omnimemory/tools/stubs/__init__.py +4 -0
  362. omninode_memory-0.6.0/src/omnimemory/tools/stubs/contract_validator.py +257 -0
  363. omninode_memory-0.6.0/src/omnimemory/utils/__init__.py +189 -0
  364. omninode_memory-0.6.0/src/omnimemory/utils/audit_logger.py +389 -0
  365. omninode_memory-0.6.0/src/omnimemory/utils/concurrency.py +1478 -0
  366. omninode_memory-0.6.0/src/omnimemory/utils/db_url.py +72 -0
  367. omninode_memory-0.6.0/src/omnimemory/utils/error_sanitizer.py +322 -0
  368. omninode_memory-0.6.0/src/omnimemory/utils/handler_constants.py +385 -0
  369. omninode_memory-0.6.0/src/omnimemory/utils/health_manager.py +1267 -0
  370. omninode_memory-0.6.0/src/omnimemory/utils/observability.py +2169 -0
  371. omninode_memory-0.6.0/src/omnimemory/utils/pii_detector.py +365 -0
  372. omninode_memory-0.6.0/src/omnimemory/utils/resource_manager.py +941 -0
  373. omninode_memory-0.6.0/src/omnimemory/utils/retry_utils.py +361 -0
  374. omninode_memory-0.6.0/tests/__init__.py +4 -0
  375. omninode_memory-0.6.0/tests/audit/io_audit_whitelist.yaml +52 -0
  376. omninode_memory-0.6.0/tests/audit/transport_import_whitelist.yaml +65 -0
  377. omninode_memory-0.6.0/tests/conftest.py +413 -0
  378. omninode_memory-0.6.0/tests/handlers/__init__.py +5 -0
  379. omninode_memory-0.6.0/tests/handlers/adapters/__init__.py +5 -0
  380. omninode_memory-0.6.0/tests/handlers/adapters/test_adapter_embedding_http.py +1410 -0
  381. omninode_memory-0.6.0/tests/handlers/adapters/test_adapter_embedding_http_integration.py +738 -0
  382. omninode_memory-0.6.0/tests/handlers/adapters/test_adapter_graph_memory.py +1980 -0
  383. omninode_memory-0.6.0/tests/handlers/adapters/test_adapter_graph_memory_integration.py +754 -0
  384. omninode_memory-0.6.0/tests/handlers/adapters/test_adapter_intent_graph.py +1776 -0
  385. omninode_memory-0.6.0/tests/handlers/adapters/test_adapter_rate_limiter.py +1297 -0
  386. omninode_memory-0.6.0/tests/handlers/test_handler_intent.py +1059 -0
  387. omninode_memory-0.6.0/tests/handlers/test_handler_semantic_compute.py +1650 -0
  388. omninode_memory-0.6.0/tests/integration/__init__.py +37 -0
  389. omninode_memory-0.6.0/tests/integration/conftest.py +39 -0
  390. omninode_memory-0.6.0/tests/integration/nodes/__init__.py +33 -0
  391. omninode_memory-0.6.0/tests/integration/nodes/test_kreuzberg_parse_effect.py +319 -0
  392. omninode_memory-0.6.0/tests/integration/nodes/test_memory_lifecycle_orchestrator_integration.py +720 -0
  393. omninode_memory-0.6.0/tests/integration/nodes/test_navigation_history_reducer_integration.py +320 -0
  394. omninode_memory-0.6.0/tests/integration/test_entry_point_discovery.py +55 -0
  395. omninode_memory-0.6.0/tests/integration/test_handler_lifecycle_pattern.py +404 -0
  396. omninode_memory-0.6.0/tests/integration/test_handler_subscription.py +1367 -0
  397. omninode_memory-0.6.0/tests/integration/test_node_agent_coordinator.py +773 -0
  398. omninode_memory-0.6.0/tests/models/__init__.py +5 -0
  399. omninode_memory-0.6.0/tests/models/contracts/__init__.py +5 -0
  400. omninode_memory-0.6.0/tests/models/contracts/test_extended_contracts.py +506 -0
  401. omninode_memory-0.6.0/tests/models/events/__init__.py +4 -0
  402. omninode_memory-0.6.0/tests/models/events/test_model_intent_classified_event.py +194 -0
  403. omninode_memory-0.6.0/tests/models/test_frozen_boundary_models.py +847 -0
  404. omninode_memory-0.6.0/tests/nodes/__init__.py +5 -0
  405. omninode_memory-0.6.0/tests/nodes/filesystem_crawler_effect/__init__.py +2 -0
  406. omninode_memory-0.6.0/tests/nodes/filesystem_crawler_effect/test_handler_filesystem_crawler.py +1333 -0
  407. omninode_memory-0.6.0/tests/nodes/intent_event_consumer_effect/__init__.py +4 -0
  408. omninode_memory-0.6.0/tests/nodes/intent_event_consumer_effect/test_handler_intent_event_consumer.py +925 -0
  409. omninode_memory-0.6.0/tests/nodes/intent_event_consumer_effect/test_model_consumer_health.py +229 -0
  410. omninode_memory-0.6.0/tests/nodes/intent_event_consumer_effect/test_util_event_mapper.py +197 -0
  411. omninode_memory-0.6.0/tests/nodes/intent_query_effect/__init__.py +5 -0
  412. omninode_memory-0.6.0/tests/nodes/intent_query_effect/conftest.py +20 -0
  413. omninode_memory-0.6.0/tests/nodes/intent_query_effect/test_handler_intent_query_integration.py +841 -0
  414. omninode_memory-0.6.0/tests/nodes/intent_storage_effect/__init__.py +5 -0
  415. omninode_memory-0.6.0/tests/nodes/intent_storage_effect/test_handler_intent_storage_adapter_integration.py +890 -0
  416. omninode_memory-0.6.0/tests/nodes/memory_retrieval_effect/__init__.py +5 -0
  417. omninode_memory-0.6.0/tests/nodes/memory_retrieval_effect/test_memory_retrieval_effect.py +1090 -0
  418. omninode_memory-0.6.0/tests/nodes/memory_storage_effect/__init__.py +5 -0
  419. omninode_memory-0.6.0/tests/nodes/memory_storage_effect/test_memory_storage_effect.py +1777 -0
  420. omninode_memory-0.6.0/tests/nodes/navigation_history_reducer/__init__.py +0 -0
  421. omninode_memory-0.6.0/tests/nodes/navigation_history_reducer/test_navigation_history_reducer_unit.py +430 -0
  422. omninode_memory-0.6.0/tests/nodes/similarity_compute/__init__.py +5 -0
  423. omninode_memory-0.6.0/tests/nodes/similarity_compute/test_similarity_compute.py +1637 -0
  424. omninode_memory-0.6.0/tests/test_bootstrap.py +632 -0
  425. omninode_memory-0.6.0/tests/test_concurrency.py +342 -0
  426. omninode_memory-0.6.0/tests/test_config_models.py +489 -0
  427. omninode_memory-0.6.0/tests/test_contract_validation.py +600 -0
  428. omninode_memory-0.6.0/tests/test_contract_version.py +470 -0
  429. omninode_memory-0.6.0/tests/test_db_url.py +166 -0
  430. omninode_memory-0.6.0/tests/test_foundation.py +422 -0
  431. omninode_memory-0.6.0/tests/test_health_manager.py +385 -0
  432. omninode_memory-0.6.0/tests/test_migration_progress.py +177 -0
  433. omninode_memory-0.6.0/tests/test_node_enforcement.py +558 -0
  434. omninode_memory-0.6.0/tests/test_node_imports.py +166 -0
  435. omninode_memory-0.6.0/tests/test_observability_metrics.py +1068 -0
  436. omninode_memory-0.6.0/tests/test_performance.py +1760 -0
  437. omninode_memory-0.6.0/tests/test_resource_manager.py +521 -0
  438. omninode_memory-0.6.0/tests/test_secrets_provider.py +335 -0
  439. omninode_memory-0.6.0/tests/test_semantic_compute_policy_config.py +259 -0
  440. omninode_memory-0.6.0/tests/test_settings.py +340 -0
  441. omninode_memory-0.6.0/tests/test_validation_scripts.py +2755 -0
  442. omninode_memory-0.6.0/tests/unit/__init__.py +5 -0
  443. omninode_memory-0.6.0/tests/unit/handlers/__init__.py +0 -0
  444. omninode_memory-0.6.0/tests/unit/handlers/adapters/__init__.py +0 -0
  445. omninode_memory-0.6.0/tests/unit/handlers/adapters/test_graph_adapter_typing.py +159 -0
  446. omninode_memory-0.6.0/tests/unit/handlers/test_subscription_typing.py +139 -0
  447. omninode_memory-0.6.0/tests/unit/nodes/test_kreuzberg_parse_effect/__init__.py +5 -0
  448. omninode_memory-0.6.0/tests/unit/nodes/test_kreuzberg_parse_effect/test_handler_kreuzberg_parse.py +583 -0
  449. omninode_memory-0.6.0/tests/unit/nodes/test_memory_lifecycle_orchestrator/__init__.py +14 -0
  450. omninode_memory-0.6.0/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_adapter_postgres_deactivate_memory.py +695 -0
  451. omninode_memory-0.6.0/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_adapter_runtime_tick_memory.py +326 -0
  452. omninode_memory-0.6.0/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_handler_memory_archive.py +1867 -0
  453. omninode_memory-0.6.0/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_handler_memory_expire.py +833 -0
  454. omninode_memory-0.6.0/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_handler_memory_tick.py +1124 -0
  455. omninode_memory-0.6.0/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_validator_lifecycle_transition.py +464 -0
  456. omninode_memory-0.6.0/tests/unit/runtime/__init__.py +2 -0
  457. omninode_memory-0.6.0/tests/unit/runtime/conftest.py +107 -0
  458. omninode_memory-0.6.0/tests/unit/runtime/test_adapters.py +396 -0
  459. omninode_memory-0.6.0/tests/unit/runtime/test_contract_topics.py +494 -0
  460. omninode_memory-0.6.0/tests/unit/runtime/test_dispatch_handlers.py +946 -0
  461. omninode_memory-0.6.0/tests/unit/runtime/test_introspection.py +636 -0
  462. omninode_memory-0.6.0/tests/unit/runtime/test_message_type_registration.py +382 -0
  463. omninode_memory-0.6.0/tests/unit/runtime/test_plugin.py +550 -0
  464. omninode_memory-0.6.0/tests/unit/runtime/test_wiring.py +78 -0
  465. omninode_memory-0.6.0/tests/unit/test_contract_linter.py +791 -0
  466. omninode_memory-0.6.0/tests/unit/test_handler_subscription_notify_strict.py +212 -0
  467. omninode_memory-0.6.0/tests/unit/test_ingestion_models.py +516 -0
  468. omninode_memory-0.6.0/tests/unit/test_io_audit.py +1009 -0
  469. omninode_memory-0.6.0/tests/unit/test_scope_mapping_config.py +346 -0
  470. omninode_memory-0.6.0/tests/unit/test_sql_placeholders.py +227 -0
  471. omninode_memory-0.6.0/tests/unit/test_validate_ci_precommit_alignment.py +578 -0
  472. omninode_memory-0.6.0/tests/unit/test_validate_kafka_imports.py +209 -0
  473. omninode_memory-0.6.0/tests/unit/test_validate_no_transport_imports.py +616 -0
  474. omninode_memory-0.6.0/uv.lock +3767 -0
  475. omninode_memory-0.6.0/validate_architecture_improvements.py +200 -0
  476. omninode_memory-0.6.0/validate_foundation.py +290 -0
  477. omninode_memory-0.6.0/validate_foundation_isolated.py +295 -0
  478. omninode_memory-0.6.0/validate_foundation_minimal.py +316 -0
@@ -0,0 +1,81 @@
1
+ <!-- HANDSHAKE_METADATA
2
+ source: omnibase_core/architecture-handshakes/repos/omnimemory.md
3
+ source_version: 0.16.0
4
+ source_sha256: f8f997a43e97d3b2c83972d1fec94ff9e0429ad76c10477979fe70db57443811
5
+ installed_at: 2026-02-10T16:35:34Z
6
+ installed_by: jonah
7
+ -->
8
+
9
+ # OmniNode Architecture – Constraint Map (omnimemory)
10
+
11
+ > **Role**: Memory system – persistence, recall, embeddings, vector storage
12
+ > **Handshake Version**: 0.1.0 <!-- contract format version; source_version in metadata tracks the template -->
13
+
14
+ ## Platform-Wide Rules
15
+
16
+ 1. **No backwards compatibility** - Breaking changes always acceptable. No deprecation periods, shims, or migration paths.
17
+ 2. **Delete old code immediately** - Never leave deprecated code "for reference." If unused, delete it.
18
+ 3. **No speculative refactors** - Only make changes that are directly requested or clearly necessary.
19
+ 4. **No silent schema changes** - All schema changes must be explicit and deliberate.
20
+ 5. **Frozen event schemas** - All models crossing boundaries (events, intents, actions, envelopes, projections) must use `frozen=True`. Internal mutable state is fine.
21
+ 6. **Explicit timestamps** - Never use `datetime.now()` defaults. Inject timestamps explicitly.
22
+ 7. **No hardcoded configuration** - All config via `.env` or Pydantic Settings. No localhost defaults.
23
+ 8. **Kafka is required infrastructure** - Use async/non-blocking patterns. Never block the calling thread waiting for Kafka acks.
24
+ 9. **No `# type: ignore` without justification** - Requires explanation comment and ticket reference.
25
+
26
+ ## Core Principles
27
+
28
+ - Sub-100ms memory operations
29
+ - ONEX 4.0 compliance
30
+ - Strong typing (zero `Any` types)
31
+
32
+ ## This Repo Contains
33
+
34
+ - Qdrant vector storage integration
35
+ - Memgraph graph operations
36
+ - Memory retrieval and management
37
+ - Pattern storage and recall
38
+ - 26+ Pydantic models (zero `Any` types)
39
+
40
+ ## Rules the Agent Must Obey
41
+
42
+ 1. **ALL version fields MUST use `ModelSemVer` directly** - No `str` fallbacks, no union types
43
+ 2. **Zero `Any` types** - Strong typing throughout
44
+ 3. **All models must have Field descriptions** - `Field(..., description="...")`
45
+ 4. **Models in `models/` directory** - Not `core/`
46
+ 5. **Follow model exemption pattern** when placing models with handlers
47
+
48
+ ## Non-Goals (DO NOT)
49
+
50
+ - ❌ No `version: ModelSemVer | str` union types
51
+ - ❌ No string-to-semver convenience validators
52
+
53
+ ## Forbidden Patterns
54
+
55
+ ```python
56
+ # WRONG - Union types for backwards compatibility
57
+ version: ModelSemVer | str # NEVER
58
+
59
+ # WRONG - Convenience validators accepting strings
60
+ @field_validator("version", mode="before")
61
+ def convert_string(cls, v):
62
+ if isinstance(v, str):
63
+ return ModelSemVer.from_str(v)
64
+ return v
65
+ ```
66
+
67
+ ## Required Pattern
68
+
69
+ ```python
70
+ # CORRECT - ModelSemVer only, callers convert
71
+ version: ModelSemVer = Field(..., description="Semantic version")
72
+
73
+ # Callers convert BEFORE calling
74
+ config = MyConfig(version=ModelSemVer.from_str("1.0.0"))
75
+ ```
76
+
77
+ ## When You See Old Code
78
+
79
+ 1. **DELETE IT** - Do not refactor, do not deprecate
80
+ 2. No migration path - Callers update or they break
81
+ 3. No compatibility layer - Clean break every time
@@ -0,0 +1,192 @@
1
+ # ============================================================================
2
+ # OmniMemory - Environment Configuration
3
+ # ============================================================================
4
+ # Copy this file to .env and customize values as needed.
5
+ # All variables have sensible defaults - only override what you need.
6
+ #
7
+ # Usage:
8
+ # cp .env.example .env
9
+ # docker compose up -d
10
+ #
11
+ # For production:
12
+ # docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
13
+ # ============================================================================
14
+
15
+ # ----------------------------------------------------------------------------
16
+ # PostgreSQL Connection (REQUIRED when postgres backend is enabled)
17
+ # ----------------------------------------------------------------------------
18
+ # Full connection URL for omnimemory's own PostgreSQL database.
19
+ # This is omnimemory's dedicated database -- no shared/legacy databases.
20
+ # The service will fail fast on startup if this is not set when postgres
21
+ # is enabled (OMNIMEMORY__POSTGRES_ENABLED=true).
22
+ #
23
+ # Format: postgresql://user:password@host:port/dbname
24
+ # OMNIMEMORY_DB_URL=postgresql://omnimemory:password@localhost:5432/omnimemory
25
+
26
+ # ----------------------------------------------------------------------------
27
+ # Docker Image Versions
28
+ # ----------------------------------------------------------------------------
29
+ # These control which versions of the database images are used.
30
+ # Update these to upgrade or pin specific versions.
31
+
32
+ # Qdrant Vector Database
33
+ # Latest versions: https://hub.docker.com/r/qdrant/qdrant/tags
34
+ QDRANT_VERSION=v1.16.3
35
+
36
+ # Memgraph Graph Database
37
+ # Latest versions: https://hub.docker.com/r/memgraph/memgraph/tags
38
+ MEMGRAPH_VERSION=2.18.1
39
+
40
+ # Valkey (Redis-compatible) Cache
41
+ # Latest versions: https://hub.docker.com/r/valkey/valkey/tags
42
+ VALKEY_VERSION=8
43
+
44
+ # ----------------------------------------------------------------------------
45
+ # Qdrant Configuration
46
+ # ----------------------------------------------------------------------------
47
+ # Vector database for semantic memory storage
48
+
49
+ # MIGRATION NOTE: Renamed from QDRANT_PORT to QDRANT_HTTP_PORT
50
+ # If you have an existing .env with QDRANT_PORT, rename it to QDRANT_HTTP_PORT
51
+
52
+ # REST API port (default: 6333)
53
+ # Used for HTTP API access and health checks
54
+ QDRANT_HTTP_PORT=6333
55
+
56
+ # gRPC port for high-performance operations (default: 6334)
57
+ # Used for bulk operations and streaming
58
+ QDRANT_GRPC_PORT=6334
59
+
60
+ # ----------------------------------------------------------------------------
61
+ # Memgraph Configuration
62
+ # ----------------------------------------------------------------------------
63
+ # Graph database for relationship queries
64
+
65
+ # Bolt protocol port for client connections (default: 7687)
66
+ # Used by Neo4j drivers and mgconsole
67
+ MEMGRAPH_BOLT_PORT=7687
68
+
69
+ # HTTP port for web interface (default: 7444)
70
+ # Used for Memgraph Lab web UI
71
+ MEMGRAPH_HTTP_PORT=7444
72
+
73
+ # Internal memory limit in MB for Memgraph (development)
74
+ # This controls Memgraph's internal memory allocation
75
+ MEMGRAPH_MEMORY_LIMIT_MB=4096
76
+
77
+ # Query execution timeout in seconds (production only)
78
+ MEMGRAPH_QUERY_TIMEOUT_SEC=600
79
+
80
+ # ----------------------------------------------------------------------------
81
+ # Valkey Configuration
82
+ # ----------------------------------------------------------------------------
83
+ # High-performance cache (Redis-compatible)
84
+
85
+ # Client connection port (default: 6379)
86
+ VALKEY_PORT=6379
87
+
88
+ # ----------------------------------------------------------------------------
89
+ # Resource Limits - Development
90
+ # ----------------------------------------------------------------------------
91
+ # These control container resource allocation for development (docker-compose.yml)
92
+ # Adjust based on your machine's available resources
93
+
94
+ # Qdrant Resources (Development)
95
+ QDRANT_CPU_LIMIT=2.0
96
+ QDRANT_MEMORY_LIMIT=2G
97
+ QDRANT_CPU_RESERVATION=0.25
98
+ QDRANT_MEMORY_RESERVATION=512M
99
+
100
+ # Memgraph Resources (Development)
101
+ MEMGRAPH_CPU_LIMIT=2.0
102
+ MEMGRAPH_CONTAINER_MEMORY=4G
103
+ MEMGRAPH_CPU_RESERVATION=0.25
104
+ MEMGRAPH_MEMORY_RESERVATION=512M
105
+
106
+ # Valkey Resources (Development)
107
+ VALKEY_CPU_LIMIT=1.0
108
+ VALKEY_MEMORY_LIMIT=1G
109
+ VALKEY_CPU_RESERVATION=0.1
110
+ VALKEY_MEMORY_RESERVATION=128M
111
+
112
+ # ----------------------------------------------------------------------------
113
+ # Resource Limits - Production
114
+ # ----------------------------------------------------------------------------
115
+ # These control container resource allocation for production (docker-compose.prod.yml)
116
+ # Production defaults are more generous than development
117
+
118
+ # Qdrant Resources (Production)
119
+ QDRANT_PROD_CPU_LIMIT=4.0
120
+ QDRANT_PROD_MEMORY_LIMIT=4G
121
+ QDRANT_PROD_CPU_RESERVATION=0.5
122
+ QDRANT_PROD_MEMORY_RESERVATION=1G
123
+
124
+ # Memgraph Resources (Production)
125
+ MEMGRAPH_PROD_CPU_LIMIT=4.0
126
+ MEMGRAPH_PROD_CONTAINER_MEMORY=8G
127
+ MEMGRAPH_PROD_CPU_RESERVATION=0.5
128
+ MEMGRAPH_PROD_MEMORY_RESERVATION=1G
129
+ # Internal memory limit in MB (production - higher than dev)
130
+ MEMGRAPH_PROD_MEMORY_LIMIT_MB=8192
131
+
132
+ # Valkey Resources (Production)
133
+ VALKEY_PROD_CPU_LIMIT=2.0
134
+ VALKEY_PROD_MEMORY_LIMIT=2G
135
+ VALKEY_PROD_CPU_RESERVATION=0.25
136
+ VALKEY_PROD_MEMORY_RESERVATION=256M
137
+
138
+ # ----------------------------------------------------------------------------
139
+ # Authentication (Optional for Development, Required for Production)
140
+ # ----------------------------------------------------------------------------
141
+ # Leave empty/unset for local development (no auth)
142
+ # Set values for production deployments
143
+ #
144
+ # IMPORTANT: For production, these MUST be set or services will fail to start
145
+ #
146
+ # PASSWORD COMPLEXITY RECOMMENDATIONS:
147
+ # - Minimum length: 32 characters recommended
148
+ # - Generate secure passwords with: openssl rand -base64 32
149
+ # - Avoid special characters that need escaping in shell/YAML: $ ` \ " ' ! & | ; < > ( ) { } [ ]
150
+ # - Safe special characters: - _ . @ # % ^ + =
151
+
152
+ # Qdrant API Key
153
+ # When set, all Qdrant API requests require this key in Authorization header
154
+ # Recommended: Use a strong, randomly generated key (min 32 characters)
155
+ # QDRANT_API_KEY=your-secure-api-key-here
156
+
157
+ # Memgraph Credentials
158
+ # When both are set, Memgraph requires authentication for all connections
159
+ # Note: Memgraph fails on empty credentials, unlike Qdrant/Valkey
160
+ # MEMGRAPH_USER=admin
161
+ # MEMGRAPH_PASSWORD=your-secure-password-here
162
+
163
+ # Valkey Password
164
+ # When set, Valkey requires AUTH command before accepting other commands
165
+ # VALKEY_PASSWORD=your-secure-password-here
166
+
167
+ # ----------------------------------------------------------------------------
168
+ # Quick Reference - Port Conflict Resolution
169
+ # ----------------------------------------------------------------------------
170
+ # If you have port conflicts, override the conflicting port(s):
171
+ #
172
+ # Example: Another service using port 6333
173
+ # QDRANT_HTTP_PORT=16333
174
+ #
175
+ # Example: Another service using port 7687
176
+ # MEMGRAPH_BOLT_PORT=17687
177
+ #
178
+ # Example: Another Redis/Valkey using port 6379
179
+ # VALKEY_PORT=16379
180
+
181
+ # ----------------------------------------------------------------------------
182
+ # Quick Reference - Resource Tuning
183
+ # ----------------------------------------------------------------------------
184
+ # For machines with limited resources (e.g., 8GB RAM laptop):
185
+ # QDRANT_MEMORY_LIMIT=1G
186
+ # MEMGRAPH_CONTAINER_MEMORY=2G
187
+ # VALKEY_MEMORY_LIMIT=512M
188
+ #
189
+ # For high-memory machines (e.g., 64GB+ workstation):
190
+ # QDRANT_MEMORY_LIMIT=8G
191
+ # MEMGRAPH_CONTAINER_MEMORY=16G
192
+ # VALKEY_MEMORY_LIMIT=4G
@@ -0,0 +1,4 @@
1
+ [flake8]
2
+ max-line-length = 88
3
+ extend-ignore = E203
4
+ exclude = .git,__pycache__,.venv,venv,build,dist,.eggs
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Report a reproducible bug
4
+ title: '[Bug] '
5
+ labels: bug
6
+ ---
7
+ ## Describe the bug
8
+ ## To Reproduce
9
+ ## Expected behavior
10
+ ## Environment
11
+ - OS:
12
+ - Python:
13
+ - Package version:
@@ -0,0 +1,9 @@
1
+ ---
2
+ name: Feature Request
3
+ about: Suggest an enhancement
4
+ title: '[Feature] '
5
+ labels: enhancement
6
+ ---
7
+ ## Problem
8
+ ## Proposed solution
9
+ ## Alternatives considered
@@ -0,0 +1,12 @@
1
+ ## Summary
2
+
3
+ ## Changes
4
+ -
5
+
6
+ ## Test plan
7
+ - [ ] `uv run pytest tests/ -m unit`
8
+ - [ ] `uv run pre-commit run --all-files`
9
+ - [ ] `uv run mypy src/ --strict`
10
+
11
+ ## Related issues
12
+ Closes #
@@ -0,0 +1,12 @@
1
+ # SPDX-FileCopyrightText: 2025 OmniNode.ai Inc.
2
+ # SPDX-License-Identifier: MIT
3
+ version: 2
4
+ updates:
5
+ - package-ecosystem: "pip"
6
+ directory: "/"
7
+ schedule:
8
+ interval: "weekly"
9
+ - package-ecosystem: "github-actions"
10
+ directory: "/"
11
+ schedule:
12
+ interval: "weekly"
@@ -0,0 +1,90 @@
1
+ # SPDX-FileCopyrightText: 2025 OmniNode.ai Inc.
2
+ # SPDX-License-Identifier: MIT
3
+ ---
4
+ # Required Status Checks for `main` Branch Protection
5
+ #
6
+ # This manifest documents the canonical list of required checks.
7
+ # If you rename a CI job, you MUST update both this file and the
8
+ # branch protection settings (Settings > Branches > main).
9
+ #
10
+ # Manifest added: OMN-2218
11
+ # Branch protection applied: OMN-2186
12
+ # Last verified: 2026-02-15
13
+ # Pattern: OMN-1876 (omniclaude PR #137)
14
+ #
15
+ # Applied via: gh api repos/OmniNode-ai/omnimemory/branches/main/protection -X PUT
16
+ # Mode: strict (branch must be up-to-date before merging)
17
+ # Total required checks: 10
18
+
19
+ required_checks:
20
+ # -- Phase 1: Quick Validation (parallel, ~2-5 min) -------------------------
21
+
22
+ - name: "Migration Freeze Check"
23
+ workflow: test.yml
24
+ job_id: migration-freeze
25
+ conditional: false
26
+ rationale: "Blocks new migrations during DB-per-repo refactor (OMN-2055)"
27
+
28
+ - name: "Code Quality"
29
+ workflow: test.yml
30
+ job_id: lint
31
+ conditional: false
32
+ rationale: "Comprehensive code quality validation (ruff format, ruff check, mypy strict)"
33
+
34
+ - name: "Pyright Type Checking"
35
+ workflow: test.yml
36
+ job_id: pyright
37
+ conditional: false
38
+ rationale: "Complementary type checking to mypy (basic mode)"
39
+
40
+ - name: "ONEX Validation"
41
+ workflow: test.yml
42
+ job_id: onex-validation
43
+ conditional: false
44
+ rationale: "ONEX pattern validation (pydantic, naming, enums, secrets, imports, model locations)"
45
+
46
+ - name: "Contract Validation"
47
+ workflow: test.yml
48
+ job_id: contract-validation
49
+ conditional: false
50
+ rationale: "Validates ONEX contract YAML files - structural correctness of node contracts"
51
+
52
+ - name: "I/O Audit"
53
+ workflow: test.yml
54
+ job_id: io-audit
55
+ conditional: false
56
+ rationale: "ONEX node purity enforcement - compute nodes must not contain forbidden I/O patterns"
57
+
58
+ - name: "Transport Import Guard"
59
+ workflow: test.yml
60
+ job_id: transport-import-guard
61
+ conditional: false
62
+ rationale: "ARCH-002: no direct transport/I/O imports in nodes/ (must use Protocol abstractions)"
63
+
64
+ - name: "Verify Architecture Handshake"
65
+ workflow: test.yml
66
+ job_id: check-handshake
67
+ conditional: true
68
+ condition: "Skipped on fork PRs (forks may not have access to cross-repo checkout)"
69
+ rationale: "Cross-repo architecture handshake with omnibase_core is current"
70
+
71
+ # -- Phase 2: Full Test Suite ------------------------------------------------
72
+
73
+ - name: "Tests"
74
+ workflow: test.yml
75
+ job_id: test
76
+ conditional: false
77
+ rationale: "Full test suite (depends on lint, pyright, onex-validation)"
78
+
79
+ # -- Phase 3: Aggregation ----------------------------------------------------
80
+
81
+ - name: "Test Summary"
82
+ workflow: test.yml
83
+ job_id: test-summary
84
+ conditional: false # uses if: always() so it always runs
85
+ rationale: "Aggregator for all CI jobs. Treats check-handshake skipped as acceptable for fork PRs."
86
+
87
+ # -- Explicitly excluded from required checks --------------------------------
88
+ excluded_checks:
89
+ - name: "pre-commit"
90
+ reason: "pre-commit.ci runs independently. Local pre-commit hooks mirror CI jobs."
@@ -0,0 +1,12 @@
1
+ name: Auto-Tag on Merge
2
+
3
+ on:
4
+ pull_request:
5
+ types: [closed]
6
+
7
+ jobs:
8
+ auto-tag:
9
+ if: github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'release')
10
+ uses: OmniNode-ai/omnibase_core/.github/workflows/auto-tag-reusable.yml@main
11
+ permissions:
12
+ contents: write
@@ -0,0 +1,28 @@
1
+ # SPDX-FileCopyrightText: 2025 OmniNode.ai Inc.
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ name: Pre-commit
5
+
6
+ on:
7
+ pull_request:
8
+ push:
9
+ branches: [main]
10
+
11
+ jobs:
12
+ pre-commit:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v6
16
+
17
+ - uses: actions/setup-python@v6
18
+ with:
19
+ python-version: '3.12'
20
+
21
+ # SKIP hooks that require the full project installed (uv + omnimemory).
22
+ # These hooks have dedicated CI jobs in .github/workflows/test.yml:
23
+ # - contract-linter -> contract-validation job
24
+ # - io-audit -> io-audit job
25
+ # - mypy -> lint job (pre-push stage, not triggered here anyway)
26
+ - uses: pre-commit/action@v3.0.1
27
+ env:
28
+ SKIP: contract-linter,io-audit
@@ -0,0 +1,27 @@
1
+ # SPDX-FileCopyrightText: 2025 OmniNode.ai Inc.
2
+ # SPDX-License-Identifier: MIT
3
+ name: Release Dry Run
4
+
5
+ on:
6
+ workflow_dispatch:
7
+ inputs:
8
+ tag:
9
+ description: 'Version tag to simulate (e.g. v0.4.0)'
10
+ required: true
11
+
12
+ jobs:
13
+ dry-run:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v6
17
+ with:
18
+ fetch-depth: 0
19
+ - uses: astral-sh/setup-uv@v7
20
+ with:
21
+ python-version: '3.12'
22
+ - name: Build only (no publish)
23
+ run: uv build
24
+ - name: Verify artifacts
25
+ run: |
26
+ ls dist/*.whl dist/*.tar.gz
27
+ sha256sum dist/*.whl dist/*.tar.gz
@@ -0,0 +1,101 @@
1
+ # SPDX-FileCopyrightText: 2025 OmniNode.ai Inc.
2
+ # SPDX-License-Identifier: MIT
3
+ name: Release
4
+
5
+ on:
6
+ push:
7
+ tags: ['v[0-9]*.[0-9]*.[0-9]*']
8
+ workflow_dispatch:
9
+ inputs:
10
+ tag:
11
+ description: 'Version tag to release (e.g. v0.4.0)'
12
+ required: true
13
+
14
+ permissions:
15
+ contents: write
16
+
17
+ concurrency:
18
+ group: release-${{ github.repository }}-${{ github.ref_name }}
19
+ cancel-in-progress: false
20
+
21
+ jobs:
22
+ release:
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v6
26
+ with:
27
+ fetch-depth: 0
28
+ ref: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref }}
29
+
30
+ - name: Assert clean working tree
31
+ run: |
32
+ git diff --exit-code
33
+ git diff --cached --exit-code
34
+ test -z "$(git ls-files --others --exclude-standard)"
35
+
36
+ - name: Validate tag matches pyproject.toml version
37
+ run: |
38
+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
39
+ TAG="${{ inputs.tag }}"
40
+ else
41
+ TAG="${GITHUB_REF_NAME}"
42
+ fi
43
+ TAG="${TAG#v}"
44
+ PKG_VERSION=$(python3 -c "
45
+ import tomllib, sys
46
+ with open('pyproject.toml', 'rb') as f:
47
+ d = tomllib.load(f)
48
+ v = d.get('project', {}).get('version')
49
+ if not v:
50
+ raise SystemExit('ERROR: missing [project].version in pyproject.toml')
51
+ print(v)
52
+ ")
53
+ if [ "$TAG" != "$PKG_VERSION" ]; then
54
+ echo "ERROR: tag v${TAG} does not match pyproject.toml version $PKG_VERSION"
55
+ exit 1
56
+ fi
57
+ echo "Version validated: $PKG_VERSION"
58
+
59
+ - uses: astral-sh/setup-uv@v7
60
+ with:
61
+ python-version: '3.12'
62
+
63
+ - name: Build wheel + sdist
64
+ run: uv build
65
+
66
+ - name: Verify dist artifacts exist
67
+ run: |
68
+ ls -la dist/
69
+ ls dist/*.whl dist/*.tar.gz >/dev/null 2>&1 || {
70
+ echo "ERROR: expected wheel + sdist in dist/"
71
+ exit 1
72
+ }
73
+
74
+ - name: Publish to PyPI
75
+ run: |
76
+ uv publish --token "$UV_PUBLISH_TOKEN" dist/*.whl dist/*.tar.gz
77
+ env:
78
+ UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }}
79
+
80
+ - name: Generate checksums
81
+ run: sha256sum dist/*.whl dist/*.tar.gz > dist/SHA256SUMS.txt
82
+
83
+ - name: Set release tag
84
+ id: tag
85
+ run: |
86
+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
87
+ echo "tag=${{ inputs.tag }}" >> $GITHUB_OUTPUT
88
+ else
89
+ echo "tag=${GITHUB_REF_NAME}" >> $GITHUB_OUTPUT
90
+ fi
91
+
92
+ - name: Create GitHub Release
93
+ uses: softprops/action-gh-release@v2
94
+ with:
95
+ tag_name: ${{ steps.tag.outputs.tag }}
96
+ files: |
97
+ dist/*.whl
98
+ dist/*.tar.gz
99
+ dist/SHA256SUMS.txt
100
+ generate_release_notes: true
101
+ prerelease: ${{ contains(github.ref_name, 'rc') }}