omninode-memory 0.6.0__tar.gz → 0.6.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/required-checks.yaml +8 -1
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/workflows/pre-commit.yml +1 -1
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/workflows/test.yml +27 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.pre-commit-config.yaml +7 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/CHANGELOG.md +16 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/PKG-INFO +4 -4
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/environment_variables.md +4 -4
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/pyproject.toml +5 -10
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validate_ci_precommit_alignment.py +2 -0
- omninode_memory-0.6.1/scripts/validation/check_ai_slop.py +492 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/__init__.py +1 -1
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/handler_kreuzberg_parse.py +6 -27
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/handler_memory_archive.py +9 -9
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_contract_topics.py +112 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_validate_ci_precommit_alignment.py +1 -1
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/uv.lock +14 -19
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.claude/architecture-handshake.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.env.example +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.flake8 +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/dependabot.yml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/workflows/auto-tag-on-merge.yml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/workflows/release-dry-run.yml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/workflows/release.yml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.gitignore +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.secrets.baseline +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.serena/memories/project_overview.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.serena/memories/suggested_commands.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.serena/project.yml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.yamlfmt +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/CLAUDE.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/CODE_OF_CONDUCT.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/CONTRIBUTING.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/LICENSE +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/README.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/SECURITY.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations/001_create_subscription_tables.sql +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations/002_create_memories_table.sql +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations/003_create_crawl_state_table.sql +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations/004_create_navigation_sessions_table.sql +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations_pending/004_create_navigation_paths_collection.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations_pending/004_create_navigation_sessions_table.sql +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/pending/003_create_crawl_state_table.sql +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docker-compose.prod.yml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docker-compose.yml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/INDEX.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/PERFORMANCE_TESTING.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/architecture/ARCH_002_KAFKA_ABSTRACTION.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/architecture/ONEX_FOUR_NODE_ARCHITECTURE.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/ci/CI_MONITORING_GUIDE.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/db-split/fk-audit-omn-2069.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/handler_reuse_matrix.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/pii_handling.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/runtime/RUNTIME_PLUGINS.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/stub_protocols.md +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/examples/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/examples/advanced_architecture_demo.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/pyrightconfig.json +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/check_migration_freeze.sh +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validate_no_transport_imports.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_enum_casing.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_http_imports.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_kafka_imports.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_model_locations.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_naming.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_no_backward_compatibility.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_pydantic_patterns.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_secrets.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_single_class_per_file.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/_compat_imports.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/audit/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/audit/__main__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/audit/io_audit.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/bootstrap.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/crawl/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/crawl/enum_context_source_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/crawl/enum_crawler_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/crawl/enum_detected_doc_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_attribution_signal_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_context_item_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_data_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_entity_extraction_mode.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_error_code.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_intelligence_operation_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_lifecycle_state.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_memory_operation_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_memory_storage_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_migration_status.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_node_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_operation_status.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_priority_level.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_promotion_tier.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_semantic_entity_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_severity.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_subscription_status.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_trust_level.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/errors/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/errors/embedding_errors.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/adapter_embedding_http.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/adapter_graph_memory.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/adapter_intent_graph.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/adapter_rate_limiter.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/adapter_valkey.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/models/model_adapter_intent_graph_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/models/model_intent_domain.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/models/model_intent_graph_health.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/handler_intent.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/handler_subscription.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/models/model_handler_intent_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_connections_result.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_filesystem_adapter_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_graph_memory_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_graph_memory_health.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_memory_connection.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_related_memory.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_related_memory_result.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_doc_source_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_embedding_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_filesystem_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_handler_semantic_compute_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_linear_scope_mapping.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_memory_service_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_path_scope_mapping.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_postgres_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_promotion_threshold_set.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_qdrant_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_rate_limiter_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_scope_mapping_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_semantic_compute_policy_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/container/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/mixin_handler_routing.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/model_contract_compute_extended.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/model_contract_effect_extended.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/model_contract_orchestrator_extended.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/model_contract_reducer_extended.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_memory_context.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_memory_metadata.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_memory_parameters.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_memory_request.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_memory_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_operation_metadata.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_processing_metrics.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_provenance.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_crawl_state_record.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_crawl_tick_command.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_changed_event.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_discovered_event.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_indexed_event.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_indexed_kreuzberg_event.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_parse_failed_event.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_removed_event.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/types.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/events/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/events/model_crawl_tick_command.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/events/model_intent_classified_event.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_audit_metadata.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_configuration.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_connection_metadata.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_error_details.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_health_metadata.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_health_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_memory_data.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_metrics_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_migration_progress.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_notes.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_priority.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_progress_summary.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_semver.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_success_metrics.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_system_health.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_tags.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_trust_score.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_typed_collections.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_user.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/model_intelligence_analysis.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/model_pattern_recognition_result.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/model_semantic_analysis_result.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/model_semantic_entity.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/model_semantic_entity_list.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/model_memory_item.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/model_memory_query.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/model_memory_search_result.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/model_memory_storage_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/model_similarity_result.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/scoring/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/scoring/model_context_item_stats.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/scoring/model_context_policy_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/scoring/model_promotion_decision.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/service/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/service/model_service_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/service/model_service_health.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/service/model_service_registry.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/subscription/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/subscription/constants.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/subscription/model_notification_event.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/subscription/model_notification_event_payload.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/subscription/model_subscription.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_audit.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_circuit_breaker_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_circuit_breaker_stats_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_concurrency.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_correlation_context.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_health_check_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_health_check_details.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_health_check_result.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_health_status.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_pii_detection_result.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_pii_detector_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_pii_match.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_pii_pattern_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_pii_type.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_resource_health_check.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_retry_attempt_info.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_retry_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_retry_statistics.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_structured_log_entry.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_system_health.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/agent_coordinator_orchestrator/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/agent_coordinator_orchestrator/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/agent_coordinator_orchestrator/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/agent_coordinator_orchestrator/models/model_request.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/agent_coordinator_orchestrator/models/model_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/base.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/handler_filesystem_crawler.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/models/model_filesystem_crawl_result.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/models/model_filesystem_crawler_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/handler_intent_event_consumer.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/models/model_consumer_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/models/model_consumer_health.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/utils/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/utils/util_event_mapper.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/handlers/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/handlers/handler_intent_query.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/models/model_handler_intent_query_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/registry/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/registry/registry_intent_query_effect.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/utils/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/utils/util_intent_mapping.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/adapters/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/adapters/adapter_intent_storage.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/models/model_intent_storage_request.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/models/model_intent_storage_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/clients/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/clients/client_kreuzberg.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/models/model_kreuzberg_parse_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/models/model_kreuzberg_parse_result.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_consolidator_reducer/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/adapters/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/adapters/adapter_postgres_deactivate_memory.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/adapters/adapter_runtime_tick_memory.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/handler_memory_expire.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/handler_memory_tick.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/validators/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/validators/validator_lifecycle_transition.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/clients/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/clients/embedding_client.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/handlers/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_db_mock.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_graph_mock.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_memory_retrieval.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_qdrant_mock.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_embedding_client_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_db_mock_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_graph_mock_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_memory_retrieval_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_qdrant_mock_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_memory_retrieval_request.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_memory_retrieval_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/adapters/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/adapters/adapter_filesystem.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/models/model_memory_storage_request.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/models/model_memory_storage_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/handlers/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/handlers/handler_navigation_history_reducer.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/models/model_navigation_history_request.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/models/model_navigation_history_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/models/model_navigation_session.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/node_navigation_history_reducer.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/handlers/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/handlers/handler_semantic_compute.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/models/model_semantic_analyzer_compute_request.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/models/model_semantic_analyzer_compute_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/node_semantic_analyzer_compute.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/contract.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/handlers/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/handlers/handler_similarity_compute.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/models/model_handler_similarity_compute_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/models/model_similarity_compute_request.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/models/model_similarity_compute_response.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/node_similarity_compute.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/statistics_reducer/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/base_protocols.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/data_models.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/error_models.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_crawl_state_repository.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_embedding.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_embedding_provider.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_handler_intent.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_intent_graph_adapter.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_secrets_provider.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/adapters.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/contract_topics.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/dispatch_handlers.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/introspection.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/message_type_registration.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/plugin.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/wiring.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/secrets.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/settings.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/tools/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/tools/contract_linter.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/tools/stubs/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/tools/stubs/contract_validator.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/audit_logger.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/concurrency.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/db_url.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/error_sanitizer.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/handler_constants.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/health_manager.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/observability.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/pii_detector.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/resource_manager.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/retry_utils.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/audit/io_audit_whitelist.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/audit/transport_import_whitelist.yaml +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/conftest.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_embedding_http.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_embedding_http_integration.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_graph_memory.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_graph_memory_integration.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_intent_graph.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_rate_limiter.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/test_handler_intent.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/test_handler_semantic_compute.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/conftest.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/nodes/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/nodes/test_kreuzberg_parse_effect.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/nodes/test_memory_lifecycle_orchestrator_integration.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/nodes/test_navigation_history_reducer_integration.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/test_entry_point_discovery.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/test_handler_lifecycle_pattern.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/test_handler_subscription.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/test_node_agent_coordinator.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/contracts/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/contracts/test_extended_contracts.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/events/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/events/test_model_intent_classified_event.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/test_frozen_boundary_models.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/filesystem_crawler_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/filesystem_crawler_effect/test_handler_filesystem_crawler.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_event_consumer_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_event_consumer_effect/test_handler_intent_event_consumer.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_event_consumer_effect/test_model_consumer_health.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_event_consumer_effect/test_util_event_mapper.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_query_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_query_effect/conftest.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_query_effect/test_handler_intent_query_integration.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_storage_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_storage_effect/test_handler_intent_storage_adapter_integration.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/memory_retrieval_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/memory_retrieval_effect/test_memory_retrieval_effect.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/memory_storage_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/memory_storage_effect/test_memory_storage_effect.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/navigation_history_reducer/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/navigation_history_reducer/test_navigation_history_reducer_unit.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/similarity_compute/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/similarity_compute/test_similarity_compute.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_bootstrap.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_concurrency.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_config_models.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_contract_validation.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_contract_version.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_db_url.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_foundation.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_health_manager.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_migration_progress.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_node_enforcement.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_node_imports.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_observability_metrics.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_performance.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_resource_manager.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_secrets_provider.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_semantic_compute_policy_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_settings.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_validation_scripts.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/handlers/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/handlers/adapters/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/handlers/adapters/test_graph_adapter_typing.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/handlers/test_subscription_typing.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_kreuzberg_parse_effect/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_kreuzberg_parse_effect/test_handler_kreuzberg_parse.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_adapter_postgres_deactivate_memory.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_adapter_runtime_tick_memory.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_handler_memory_archive.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_handler_memory_expire.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_handler_memory_tick.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_validator_lifecycle_transition.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/__init__.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/conftest.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_adapters.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_dispatch_handlers.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_introspection.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_message_type_registration.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_plugin.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_wiring.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_contract_linter.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_handler_subscription_notify_strict.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_ingestion_models.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_io_audit.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_scope_mapping_config.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_sql_placeholders.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_validate_kafka_imports.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_validate_no_transport_imports.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/validate_architecture_improvements.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/validate_foundation.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/validate_foundation_isolated.py +0 -0
- {omninode_memory-0.6.0 → omninode_memory-0.6.1}/validate_foundation_minimal.py +0 -0
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
#
|
|
15
15
|
# Applied via: gh api repos/OmniNode-ai/omnimemory/branches/main/protection -X PUT
|
|
16
16
|
# Mode: strict (branch must be up-to-date before merging)
|
|
17
|
-
# Total required checks:
|
|
17
|
+
# Total required checks: 11
|
|
18
18
|
|
|
19
19
|
required_checks:
|
|
20
20
|
# -- Phase 1: Quick Validation (parallel, ~2-5 min) -------------------------
|
|
@@ -68,6 +68,13 @@ required_checks:
|
|
|
68
68
|
condition: "Skipped on fork PRs (forks may not have access to cross-repo checkout)"
|
|
69
69
|
rationale: "Cross-repo architecture handshake with omnibase_core is current"
|
|
70
70
|
|
|
71
|
+
- name: "AI-Slop Pattern Check (strict, PR diff)"
|
|
72
|
+
workflow: test.yml
|
|
73
|
+
job_id: ai-slop-check
|
|
74
|
+
conditional: true
|
|
75
|
+
condition: "Skipped when no Python/Markdown files changed in the PR diff"
|
|
76
|
+
rationale: "Prevents AI-generated slop patterns from entering the codebase (OMN-2972)"
|
|
77
|
+
|
|
71
78
|
# -- Phase 2: Full Test Suite ------------------------------------------------
|
|
72
79
|
|
|
73
80
|
- name: "Tests"
|
|
@@ -433,3 +433,30 @@ jobs:
|
|
|
433
433
|
echo "Tests: $test"
|
|
434
434
|
exit 1
|
|
435
435
|
fi
|
|
436
|
+
|
|
437
|
+
ai-slop-check:
|
|
438
|
+
name: AI-Slop Pattern Check (strict, PR diff)
|
|
439
|
+
runs-on: ubuntu-latest
|
|
440
|
+
steps:
|
|
441
|
+
- uses: actions/checkout@v4
|
|
442
|
+
with:
|
|
443
|
+
fetch-depth: 0
|
|
444
|
+
- name: Set up Python
|
|
445
|
+
uses: actions/setup-python@v5
|
|
446
|
+
with:
|
|
447
|
+
python-version: '3.12'
|
|
448
|
+
- name: Compute changed Python/Markdown files vs PR base
|
|
449
|
+
id: changed
|
|
450
|
+
run: |
|
|
451
|
+
if [ -n "${{ github.base_ref }}" ]; then
|
|
452
|
+
git fetch origin "${{ github.base_ref }}" --no-tags --depth=1
|
|
453
|
+
FILES=$(git diff --name-only "origin/${{ github.base_ref }}"...HEAD -- '*.py' '*.md' | tr '\n' ' ')
|
|
454
|
+
else
|
|
455
|
+
FILES=$(git diff --name-only HEAD~1 -- '*.py' '*.md' 2>/dev/null | tr '\n' ' ')
|
|
456
|
+
fi
|
|
457
|
+
echo "files=$FILES" >> "$GITHUB_OUTPUT"
|
|
458
|
+
- name: Check changed files for AI-slop patterns (strict)
|
|
459
|
+
run: |
|
|
460
|
+
FILES="${{ steps.changed.outputs.files }}"
|
|
461
|
+
if [ -z "$FILES" ]; then exit 0; fi
|
|
462
|
+
python scripts/validation/check_ai_slop.py --strict $FILES
|
|
@@ -375,6 +375,13 @@ repos:
|
|
|
375
375
|
found (add # onex-allow-internal-ip to suppress)" && exit 1 || exit 0'
|
|
376
376
|
pass_filenames: false
|
|
377
377
|
stages: [pre-commit]
|
|
378
|
+
- id: check-ai-slop
|
|
379
|
+
name: Check for AI-slop patterns
|
|
380
|
+
language: system
|
|
381
|
+
entry: uv run python scripts/validation/check_ai_slop.py
|
|
382
|
+
types_or: [python, markdown]
|
|
383
|
+
pass_filenames: true
|
|
384
|
+
stages: [pre-commit]
|
|
378
385
|
|
|
379
386
|
# Configuration
|
|
380
387
|
default_install_hook_types: [pre-commit, pre-push]
|
|
@@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.6.1] - 2026-02-28
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Contract topic validation tests for `intent_query_effect` (OMN-1538, #95)
|
|
12
|
+
- AI-slop checker Phase 2 rollout (#97)
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- Replace omninode_bridge db references with omnimemory in docs (#96)
|
|
16
|
+
- Replace Step N narration with intent comments in handler docs (#98)
|
|
17
|
+
|
|
18
|
+
### Dependencies
|
|
19
|
+
- `omnibase-core` bumped to >=0.22.0,<0.23.0 (was ==0.21.0)
|
|
20
|
+
- `omnibase-spi` bumped to >=0.15.0,<0.16.0 (was ==0.14.0)
|
|
21
|
+
- `omnibase-infra` bumped to >=0.13.0,<0.14.0 (was >=0.11.0,<0.12.0)
|
|
22
|
+
- Removed `[tool.uv] override-dependencies` (no longer needed with omnibase-infra>=0.13.0)
|
|
23
|
+
|
|
8
24
|
## [0.6.0] - 2026-02-27
|
|
9
25
|
|
|
10
26
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: omninode-memory
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.1
|
|
4
4
|
Summary: OmniNode document ingestion and semantic retrieval
|
|
5
5
|
Project-URL: Homepage, https://github.com/OmniNode-ai/omnimemory
|
|
6
6
|
Project-URL: Repository, https://github.com/OmniNode-ai/omnimemory
|
|
@@ -20,9 +20,9 @@ Requires-Dist: cachetools<8.0.0,>=6.2.4
|
|
|
20
20
|
Requires-Dist: fastapi<1.0.0,>=0.120.1
|
|
21
21
|
Requires-Dist: httpx<1.0.0,>=0.28.0
|
|
22
22
|
Requires-Dist: mcp<2.0.0,>=1.8.0
|
|
23
|
-
Requires-Dist: omnibase-core
|
|
24
|
-
Requires-Dist: omnibase-infra<0.
|
|
25
|
-
Requires-Dist: omnibase-spi
|
|
23
|
+
Requires-Dist: omnibase-core<0.23.0,>=0.22.0
|
|
24
|
+
Requires-Dist: omnibase-infra<0.14.0,>=0.13.0
|
|
25
|
+
Requires-Dist: omnibase-spi<0.16.0,>=0.15.0
|
|
26
26
|
Requires-Dist: pinecone-client<7.0.0,>=4.1.0
|
|
27
27
|
Requires-Dist: psutil<8.0.0,>=7.0.0
|
|
28
28
|
Requires-Dist: psycopg2-binary<3.0.0,>=2.9.10
|
|
@@ -137,7 +137,7 @@ When using the `asyncpg` driver (used internally for health checks and lifecycle
|
|
|
137
137
|
OMNIMEMORY_DB_URL=postgresql://omnimemory:dev_password@localhost:5432/omnimemory_dev
|
|
138
138
|
|
|
139
139
|
# Remote shared infrastructure (OmniNode standard)
|
|
140
|
-
OMNIMEMORY_DB_URL=postgresql://postgres:secret@<db-host>:<db-port>/
|
|
140
|
+
OMNIMEMORY_DB_URL=postgresql://postgres:secret@<db-host>:<db-port>/omnimemory
|
|
141
141
|
```
|
|
142
142
|
|
|
143
143
|
> **Breaking change (0.2.0 → 0.3.0)**: The database connection URL is now read **exclusively** from `OMNIMEMORY_DB_URL`. Any previous mechanism for supplying the database URL no longer applies. Update your `.env` file to include this variable before upgrading.
|
|
@@ -301,9 +301,9 @@ def safe_db_url_display(url: str) -> str: ...
|
|
|
301
301
|
```python
|
|
302
302
|
from omnimemory.utils import safe_db_url_display
|
|
303
303
|
|
|
304
|
-
url = "postgresql://omnimemory:super_secret@<db-host>:5436/
|
|
304
|
+
url = "postgresql://omnimemory:super_secret@<db-host>:5436/omnimemory"
|
|
305
305
|
print(safe_db_url_display(url))
|
|
306
|
-
# Output: <db-host>:5436/
|
|
306
|
+
# Output: <db-host>:5436/omnimemory
|
|
307
307
|
```
|
|
308
308
|
|
|
309
309
|
**Edge cases**:
|
|
@@ -311,7 +311,7 @@ print(safe_db_url_display(url))
|
|
|
311
311
|
| Input | Output |
|
|
312
312
|
|-------|--------|
|
|
313
313
|
| `postgresql://user:pass@localhost:5432/mydb` | `localhost:5432/mydb` |
|
|
314
|
-
| `postgresql://user:pass@<db-host>:5436/
|
|
314
|
+
| `postgresql://user:pass@<db-host>:5436/omnimemory` | `<db-host>:5436/omnimemory` |
|
|
315
315
|
| `postgresql://user:pass@[::1]:5432/mydb` (IPv6) | `[::1]:5432/mydb` |
|
|
316
316
|
| `postgresql://host_only/mydb` (no port) | `host_only/mydb` |
|
|
317
317
|
| `https://not-a-db-url` (wrong scheme) | `(unparseable URL)` |
|
|
@@ -7,7 +7,7 @@ build-backend = "hatchling.build"
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "omninode-memory"
|
|
10
|
-
version = "0.6.
|
|
10
|
+
version = "0.6.1"
|
|
11
11
|
description = "OmniNode document ingestion and semantic retrieval"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
requires-python = ">=3.12,<4.0"
|
|
@@ -59,9 +59,9 @@ dependencies = [
|
|
|
59
59
|
"pyyaml>=6.0.2,<7.0.0",
|
|
60
60
|
|
|
61
61
|
# ONEX dependencies - versioned releases from PyPI
|
|
62
|
-
"omnibase-core
|
|
63
|
-
"omnibase-spi
|
|
64
|
-
"omnibase-infra>=0.
|
|
62
|
+
"omnibase-core>=0.22.0,<0.23.0",
|
|
63
|
+
"omnibase-spi>=0.15.0,<0.16.0",
|
|
64
|
+
"omnibase-infra>=0.13.0,<0.14.0",
|
|
65
65
|
|
|
66
66
|
# Logging and monitoring
|
|
67
67
|
# Version ^23.3.0 required for compatibility with omnibase-infra (requires ^23.2.0)
|
|
@@ -347,9 +347,4 @@ markers = [
|
|
|
347
347
|
]
|
|
348
348
|
|
|
349
349
|
[tool.uv]
|
|
350
|
-
override-dependencies
|
|
351
|
-
# omnibase-infra==0.11.0 caps these at <0.14.0 / <0.21.0; override to allow
|
|
352
|
-
# the pinned versions required by coordinated platform release release-20260227-eceed7
|
|
353
|
-
"omnibase-spi==0.14.0",
|
|
354
|
-
"omnibase-core==0.21.0",
|
|
355
|
-
]
|
|
350
|
+
# No override-dependencies needed — omnibase-infra>=0.13.0 now allows omnibase-core>=0.22.0 and omnibase-spi>=0.15.0.
|
|
@@ -71,6 +71,8 @@ EXPECTED_ALIGNMENTS: list[tuple[str, str, str]] = [
|
|
|
71
71
|
),
|
|
72
72
|
("contract-linter", "contract-validation", "contract_linter"),
|
|
73
73
|
("io-audit", "io-audit", "io_audit"),
|
|
74
|
+
# AI-slop pattern checker
|
|
75
|
+
("check-ai-slop", "ai-slop-check", "check_ai_slop.py"),
|
|
74
76
|
]
|
|
75
77
|
|
|
76
78
|
|
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-FileCopyrightText: 2025 OmniNode.ai Inc.
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
ONEX AI-Slop Pattern Checker
|
|
7
|
+
|
|
8
|
+
This pre-commit hook and CI gate detects AI-generated boilerplate ("slop") patterns
|
|
9
|
+
in Python and Markdown files. Uses AST analysis for docstring patterns and line-based
|
|
10
|
+
regex for non-docstring patterns.
|
|
11
|
+
|
|
12
|
+
Checks performed:
|
|
13
|
+
- ERROR: sycophancy (sycophantic docstring openers: "Excellent", "Great", "Sure")
|
|
14
|
+
- ERROR: rest_docstring (reST-style :param:, :type:, :returns:, :rtype:)
|
|
15
|
+
- WARNING: boilerplate_docstring ("This module/class/function provides/implements/contains")
|
|
16
|
+
- WARNING: step_narration ("# Step N:" comments)
|
|
17
|
+
- WARNING: md_separator (four-or-more = signs used as markdown separators in docstrings)
|
|
18
|
+
- INFO: obvious_comment (self-evident inline comments, report mode only)
|
|
19
|
+
|
|
20
|
+
Suppression:
|
|
21
|
+
Add `# ai-slop-ok: reason` on:
|
|
22
|
+
- The def/class line
|
|
23
|
+
- The docstring's opening triple-quote line
|
|
24
|
+
- The line immediately preceding the def/class line
|
|
25
|
+
|
|
26
|
+
Exit codes:
|
|
27
|
+
0 - No violations (or only INFO/WARNING in non-strict mode)
|
|
28
|
+
1 - ERROR violations found
|
|
29
|
+
2 - WARNING violations found (--strict mode only)
|
|
30
|
+
|
|
31
|
+
Usage:
|
|
32
|
+
python scripts/validation/check_ai_slop.py [files...]
|
|
33
|
+
python scripts/validation/check_ai_slop.py --strict [files...]
|
|
34
|
+
python scripts/validation/check_ai_slop.py --report src/
|
|
35
|
+
|
|
36
|
+
Linear ticket: OMN-2971
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
from __future__ import annotations
|
|
40
|
+
|
|
41
|
+
import ast
|
|
42
|
+
import re
|
|
43
|
+
import sys
|
|
44
|
+
from pathlib import Path
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# ---------------------------------------------------------------------------
|
|
48
|
+
# Data models
|
|
49
|
+
# ---------------------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
SEVERITY_ERROR = "ERROR"
|
|
52
|
+
SEVERITY_WARNING = "WARNING"
|
|
53
|
+
SEVERITY_INFO = "INFO"
|
|
54
|
+
|
|
55
|
+
CHECK_SYCOPHANCY = "sycophancy"
|
|
56
|
+
CHECK_REST_DOCSTRING = "rest_docstring"
|
|
57
|
+
CHECK_BOILERPLATE_DOCSTRING = "boilerplate_docstring"
|
|
58
|
+
CHECK_STEP_NARRATION = "step_narration"
|
|
59
|
+
CHECK_MD_SEPARATOR = "md_separator"
|
|
60
|
+
CHECK_OBVIOUS_COMMENT = "obvious_comment"
|
|
61
|
+
|
|
62
|
+
SUPPRESSION_MARKER = "ai-slop-ok"
|
|
63
|
+
|
|
64
|
+
# Sycophantic openers (case-insensitive, must be at start of docstring content)
|
|
65
|
+
_SYCOPHANCY_RE = re.compile(
|
|
66
|
+
r"^\s*(Excellent|Great|Sure|Certainly|Absolutely|Of course|Happy to|"
|
|
67
|
+
r"I would be|Gladly|Wonderful|Perfect|Fantastic|Awesome)[!,. ]",
|
|
68
|
+
re.IGNORECASE,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# reST docstring markers
|
|
72
|
+
_REST_RE = re.compile(r"^\s*:(param|type|returns?|rtype|raises?|var|ivar|cvar)\b")
|
|
73
|
+
|
|
74
|
+
# Boilerplate "This <thing> provides/implements/contains/is responsible for"
|
|
75
|
+
_BOILERPLATE_RE = re.compile(
|
|
76
|
+
r"^\s*This\s+(module|class|function|method|file|script|node|handler|service)"
|
|
77
|
+
r"\s+(provides?|implements?|contains?|is responsible for|handles?|manages?|offers?)",
|
|
78
|
+
re.IGNORECASE,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
# Step narration: "# Step N:" or "# Step N -"
|
|
82
|
+
_STEP_NARRATION_RE = re.compile(r"#\s*Step\s+\d+\s*[:\-]", re.IGNORECASE)
|
|
83
|
+
|
|
84
|
+
# Markdown separator: 4+ = characters in a docstring line
|
|
85
|
+
_MD_SEPARATOR_RE = re.compile(r"={4,}")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class SlopViolation:
|
|
89
|
+
"""A single AI-slop violation found in a file."""
|
|
90
|
+
|
|
91
|
+
def __init__(
|
|
92
|
+
self,
|
|
93
|
+
filename: str,
|
|
94
|
+
line: int,
|
|
95
|
+
check: str,
|
|
96
|
+
severity: str,
|
|
97
|
+
message: str,
|
|
98
|
+
source_line: str = "",
|
|
99
|
+
) -> None:
|
|
100
|
+
self.filename = filename
|
|
101
|
+
self.line = line
|
|
102
|
+
self.check = check
|
|
103
|
+
self.severity = severity
|
|
104
|
+
self.message = message
|
|
105
|
+
self.source_line = source_line
|
|
106
|
+
|
|
107
|
+
def __repr__(self) -> str:
|
|
108
|
+
return (
|
|
109
|
+
f"SlopViolation({self.filename}:{self.line} [{self.severity}] "
|
|
110
|
+
f"{self.check}: {self.message})"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
def format_line(self) -> str:
|
|
114
|
+
return (
|
|
115
|
+
f"{self.filename}:{self.line}: [{self.severity}] "
|
|
116
|
+
f"{self.check}: {self.message}"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# ---------------------------------------------------------------------------
|
|
121
|
+
# AST visitor — handles docstring patterns
|
|
122
|
+
# ---------------------------------------------------------------------------
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class _DocstringVisitor(ast.NodeVisitor):
|
|
126
|
+
"""
|
|
127
|
+
AST-based visitor that extracts docstrings from functions, classes, and
|
|
128
|
+
modules and checks them for AI-slop patterns.
|
|
129
|
+
|
|
130
|
+
Uses AST so that the opener line is correctly resolved even when the
|
|
131
|
+
triple-quote and the first content line are on different lines.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
def __init__(self, filename: str, source_lines: list[str]) -> None:
|
|
135
|
+
self.filename = filename
|
|
136
|
+
self.source_lines = source_lines
|
|
137
|
+
self.violations: list[SlopViolation] = []
|
|
138
|
+
|
|
139
|
+
# ------------------------------------------------------------------
|
|
140
|
+
# Suppression helpers
|
|
141
|
+
# ------------------------------------------------------------------
|
|
142
|
+
|
|
143
|
+
def _has_suppression(self, def_lineno: int, docstring_lineno: int) -> bool:
|
|
144
|
+
"""
|
|
145
|
+
Return True if any of the three suppression locations contain the
|
|
146
|
+
suppression marker:
|
|
147
|
+
1. The def/class line itself (1-indexed)
|
|
148
|
+
2. The docstring's opening triple-quote line
|
|
149
|
+
3. The line immediately preceding the def/class line
|
|
150
|
+
"""
|
|
151
|
+
lines = self.source_lines
|
|
152
|
+
n = len(lines)
|
|
153
|
+
|
|
154
|
+
def _check(lineno: int) -> bool:
|
|
155
|
+
if 1 <= lineno <= n:
|
|
156
|
+
return SUPPRESSION_MARKER in lines[lineno - 1]
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
return _check(def_lineno) or _check(docstring_lineno) or _check(def_lineno - 1)
|
|
160
|
+
|
|
161
|
+
# ------------------------------------------------------------------
|
|
162
|
+
# Docstring checker
|
|
163
|
+
# ------------------------------------------------------------------
|
|
164
|
+
|
|
165
|
+
def _check_docstring(
|
|
166
|
+
self,
|
|
167
|
+
node: ast.FunctionDef | ast.AsyncFunctionDef | ast.ClassDef | ast.Module,
|
|
168
|
+
def_lineno: int,
|
|
169
|
+
) -> None:
|
|
170
|
+
"""Extract and check the docstring of a node."""
|
|
171
|
+
docstring = ast.get_docstring(node, clean=False)
|
|
172
|
+
if not docstring:
|
|
173
|
+
return
|
|
174
|
+
|
|
175
|
+
# Find the AST Constant node that IS the docstring
|
|
176
|
+
if not node.body:
|
|
177
|
+
return
|
|
178
|
+
first_stmt = node.body[0]
|
|
179
|
+
if not isinstance(first_stmt, ast.Expr):
|
|
180
|
+
return
|
|
181
|
+
if not isinstance(first_stmt.value, ast.Constant):
|
|
182
|
+
return
|
|
183
|
+
if not isinstance(first_stmt.value.value, str):
|
|
184
|
+
return
|
|
185
|
+
|
|
186
|
+
docstring_lineno: int = first_stmt.value.lineno # opening triple-quote line
|
|
187
|
+
|
|
188
|
+
if self._has_suppression(def_lineno, docstring_lineno):
|
|
189
|
+
return
|
|
190
|
+
|
|
191
|
+
# Check each line of the docstring for patterns
|
|
192
|
+
doc_lines = docstring.splitlines()
|
|
193
|
+
for offset, doc_line in enumerate(doc_lines):
|
|
194
|
+
actual_lineno = docstring_lineno + offset
|
|
195
|
+
|
|
196
|
+
# Sycophancy (ERROR)
|
|
197
|
+
if _SYCOPHANCY_RE.match(doc_line):
|
|
198
|
+
self.violations.append(
|
|
199
|
+
SlopViolation(
|
|
200
|
+
filename=self.filename,
|
|
201
|
+
line=actual_lineno,
|
|
202
|
+
check=CHECK_SYCOPHANCY,
|
|
203
|
+
severity=SEVERITY_ERROR,
|
|
204
|
+
message=f"Sycophantic opener: {doc_line.strip()!r}",
|
|
205
|
+
source_line=doc_line,
|
|
206
|
+
)
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
# reST docstring (ERROR)
|
|
210
|
+
if _REST_RE.match(doc_line):
|
|
211
|
+
self.violations.append(
|
|
212
|
+
SlopViolation(
|
|
213
|
+
filename=self.filename,
|
|
214
|
+
line=actual_lineno,
|
|
215
|
+
check=CHECK_REST_DOCSTRING,
|
|
216
|
+
severity=SEVERITY_ERROR,
|
|
217
|
+
message=f"reST-style docstring marker: {doc_line.strip()!r}",
|
|
218
|
+
source_line=doc_line,
|
|
219
|
+
)
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
# Boilerplate opener (WARNING)
|
|
223
|
+
if _BOILERPLATE_RE.match(doc_line):
|
|
224
|
+
self.violations.append(
|
|
225
|
+
SlopViolation(
|
|
226
|
+
filename=self.filename,
|
|
227
|
+
line=actual_lineno,
|
|
228
|
+
check=CHECK_BOILERPLATE_DOCSTRING,
|
|
229
|
+
severity=SEVERITY_WARNING,
|
|
230
|
+
message=f"Boilerplate docstring opener: {doc_line.strip()!r}",
|
|
231
|
+
source_line=doc_line,
|
|
232
|
+
)
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
# Markdown separator (WARNING)
|
|
236
|
+
if _MD_SEPARATOR_RE.search(doc_line):
|
|
237
|
+
self.violations.append(
|
|
238
|
+
SlopViolation(
|
|
239
|
+
filename=self.filename,
|
|
240
|
+
line=actual_lineno,
|
|
241
|
+
check=CHECK_MD_SEPARATOR,
|
|
242
|
+
severity=SEVERITY_WARNING,
|
|
243
|
+
message=f"Markdown-style separator in docstring: {doc_line.strip()!r}",
|
|
244
|
+
source_line=doc_line,
|
|
245
|
+
)
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
# ------------------------------------------------------------------
|
|
249
|
+
# AST visit methods
|
|
250
|
+
# ------------------------------------------------------------------
|
|
251
|
+
|
|
252
|
+
def visit_Module(self, node: ast.Module) -> None:
|
|
253
|
+
self._check_docstring(node, 1)
|
|
254
|
+
self.generic_visit(node)
|
|
255
|
+
|
|
256
|
+
def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
|
|
257
|
+
self._check_docstring(node, node.lineno)
|
|
258
|
+
self.generic_visit(node)
|
|
259
|
+
|
|
260
|
+
def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef) -> None:
|
|
261
|
+
self._check_docstring(node, node.lineno)
|
|
262
|
+
self.generic_visit(node)
|
|
263
|
+
|
|
264
|
+
def visit_ClassDef(self, node: ast.ClassDef) -> None:
|
|
265
|
+
self._check_docstring(node, node.lineno)
|
|
266
|
+
self.generic_visit(node)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
# ---------------------------------------------------------------------------
|
|
270
|
+
# Line-based checks (non-docstring patterns)
|
|
271
|
+
# ---------------------------------------------------------------------------
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def _check_lines(filename: str, source_lines: list[str]) -> list[SlopViolation]:
|
|
275
|
+
"""
|
|
276
|
+
Line-based regex checks for patterns that don't require AST analysis.
|
|
277
|
+
Only applies outside of docstrings (we use a simple heuristic: skip
|
|
278
|
+
lines inside triple-quoted strings by tracking quote depth).
|
|
279
|
+
"""
|
|
280
|
+
violations: list[SlopViolation] = []
|
|
281
|
+
|
|
282
|
+
in_triple_quote = False
|
|
283
|
+
triple_char = ""
|
|
284
|
+
|
|
285
|
+
for lineno, line in enumerate(source_lines, start=1):
|
|
286
|
+
stripped = line.rstrip()
|
|
287
|
+
|
|
288
|
+
# Toggle triple-quote tracking (simple heuristic)
|
|
289
|
+
# Count occurrences of """ and '''
|
|
290
|
+
for tq in ('"""', "'''"):
|
|
291
|
+
count = stripped.count(tq)
|
|
292
|
+
if count:
|
|
293
|
+
if not in_triple_quote:
|
|
294
|
+
if count % 2 == 1:
|
|
295
|
+
in_triple_quote = True
|
|
296
|
+
triple_char = tq
|
|
297
|
+
elif tq == triple_char:
|
|
298
|
+
if count % 2 == 1:
|
|
299
|
+
in_triple_quote = False
|
|
300
|
+
triple_char = ""
|
|
301
|
+
|
|
302
|
+
if in_triple_quote:
|
|
303
|
+
continue
|
|
304
|
+
|
|
305
|
+
# Step narration: "# Step N:" outside docstrings
|
|
306
|
+
comment_match = re.search(r"#(.+)", stripped)
|
|
307
|
+
if comment_match:
|
|
308
|
+
comment_text = comment_match.group(0)
|
|
309
|
+
if _STEP_NARRATION_RE.search(comment_text):
|
|
310
|
+
# Check for suppression on this line
|
|
311
|
+
if SUPPRESSION_MARKER not in stripped:
|
|
312
|
+
violations.append(
|
|
313
|
+
SlopViolation(
|
|
314
|
+
filename=filename,
|
|
315
|
+
line=lineno,
|
|
316
|
+
check=CHECK_STEP_NARRATION,
|
|
317
|
+
severity=SEVERITY_WARNING,
|
|
318
|
+
message=f"Step narration comment: {comment_text.strip()!r}",
|
|
319
|
+
source_line=stripped,
|
|
320
|
+
)
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
return violations
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
# ---------------------------------------------------------------------------
|
|
327
|
+
# File-level checker
|
|
328
|
+
# ---------------------------------------------------------------------------
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def check_file(filepath: str | Path) -> list[SlopViolation]:
|
|
332
|
+
"""
|
|
333
|
+
Check a single Python file for AI-slop patterns.
|
|
334
|
+
|
|
335
|
+
Returns a list of SlopViolation instances (may be empty).
|
|
336
|
+
"""
|
|
337
|
+
path = Path(filepath)
|
|
338
|
+
violations: list[SlopViolation] = []
|
|
339
|
+
|
|
340
|
+
try:
|
|
341
|
+
source = path.read_text(encoding="utf-8")
|
|
342
|
+
except OSError as exc:
|
|
343
|
+
return [
|
|
344
|
+
SlopViolation(
|
|
345
|
+
filename=str(filepath),
|
|
346
|
+
line=0,
|
|
347
|
+
check="file_read",
|
|
348
|
+
severity=SEVERITY_ERROR,
|
|
349
|
+
message=f"Cannot read file: {exc}",
|
|
350
|
+
)
|
|
351
|
+
]
|
|
352
|
+
|
|
353
|
+
try:
|
|
354
|
+
tree = ast.parse(source, filename=str(filepath))
|
|
355
|
+
except SyntaxError as exc:
|
|
356
|
+
return [
|
|
357
|
+
SlopViolation(
|
|
358
|
+
filename=str(filepath),
|
|
359
|
+
line=exc.lineno or 0,
|
|
360
|
+
check="syntax_error",
|
|
361
|
+
severity=SEVERITY_ERROR,
|
|
362
|
+
message=f"Syntax error: {exc.msg}",
|
|
363
|
+
)
|
|
364
|
+
]
|
|
365
|
+
|
|
366
|
+
source_lines = source.splitlines()
|
|
367
|
+
|
|
368
|
+
# AST-based docstring checks
|
|
369
|
+
visitor = _DocstringVisitor(filename=str(filepath), source_lines=source_lines)
|
|
370
|
+
visitor.visit(tree)
|
|
371
|
+
violations.extend(visitor.violations)
|
|
372
|
+
|
|
373
|
+
# Line-based checks (step narration, etc.)
|
|
374
|
+
violations.extend(_check_lines(str(filepath), source_lines))
|
|
375
|
+
|
|
376
|
+
# Sort by line number
|
|
377
|
+
violations.sort(key=lambda v: v.line)
|
|
378
|
+
return violations
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
# ---------------------------------------------------------------------------
|
|
382
|
+
# Entry point
|
|
383
|
+
# ---------------------------------------------------------------------------
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def main(argv: list[str] | None = None) -> int:
|
|
387
|
+
"""
|
|
388
|
+
Main entry point for the AI-slop checker.
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
0 - No violations (or only WARNING/INFO in non-strict mode)
|
|
392
|
+
1 - ERROR violations found
|
|
393
|
+
2 - WARNING violations found (--strict mode only)
|
|
394
|
+
"""
|
|
395
|
+
import argparse
|
|
396
|
+
|
|
397
|
+
parser = argparse.ArgumentParser(
|
|
398
|
+
description="Check Python/Markdown files for AI-slop patterns."
|
|
399
|
+
)
|
|
400
|
+
parser.add_argument(
|
|
401
|
+
"files",
|
|
402
|
+
nargs="*",
|
|
403
|
+
help="Files or directories to check. When no files are given, exits 0.",
|
|
404
|
+
)
|
|
405
|
+
parser.add_argument(
|
|
406
|
+
"--strict",
|
|
407
|
+
action="store_true",
|
|
408
|
+
help="Treat WARNING violations as blocking (exit code 2).",
|
|
409
|
+
)
|
|
410
|
+
parser.add_argument(
|
|
411
|
+
"--report",
|
|
412
|
+
action="store_true",
|
|
413
|
+
help="Report mode: include INFO violations, scan directories recursively.",
|
|
414
|
+
)
|
|
415
|
+
parser.add_argument(
|
|
416
|
+
"--json",
|
|
417
|
+
action="store_true",
|
|
418
|
+
dest="json_output",
|
|
419
|
+
help="Output results as JSON.",
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
args = parser.parse_args(argv)
|
|
423
|
+
|
|
424
|
+
# Collect files
|
|
425
|
+
files: list[Path] = []
|
|
426
|
+
for f in args.files:
|
|
427
|
+
p = Path(f)
|
|
428
|
+
if p.is_dir():
|
|
429
|
+
files.extend(p.rglob("*.py"))
|
|
430
|
+
if args.report:
|
|
431
|
+
files.extend(p.rglob("*.md"))
|
|
432
|
+
elif p.exists():
|
|
433
|
+
files.append(p)
|
|
434
|
+
|
|
435
|
+
all_violations: list[SlopViolation] = []
|
|
436
|
+
for filepath in files:
|
|
437
|
+
if filepath.suffix == ".py":
|
|
438
|
+
all_violations.extend(check_file(filepath))
|
|
439
|
+
# Markdown files: no AST checks, only line-based (step_narration)
|
|
440
|
+
elif filepath.suffix == ".md":
|
|
441
|
+
try:
|
|
442
|
+
source_lines = filepath.read_text(encoding="utf-8").splitlines()
|
|
443
|
+
all_violations.extend(_check_lines(str(filepath), source_lines))
|
|
444
|
+
except OSError as exc:
|
|
445
|
+
all_violations.append(
|
|
446
|
+
SlopViolation(
|
|
447
|
+
filename=str(filepath),
|
|
448
|
+
line=0,
|
|
449
|
+
check="file_read",
|
|
450
|
+
severity=SEVERITY_ERROR,
|
|
451
|
+
message=f"Cannot read file: {exc}",
|
|
452
|
+
)
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
# Filter by severity
|
|
456
|
+
if not args.report:
|
|
457
|
+
all_violations = [
|
|
458
|
+
v
|
|
459
|
+
for v in all_violations
|
|
460
|
+
if v.severity in (SEVERITY_ERROR, SEVERITY_WARNING)
|
|
461
|
+
]
|
|
462
|
+
|
|
463
|
+
if args.json_output:
|
|
464
|
+
import json
|
|
465
|
+
|
|
466
|
+
output: list[dict[str, str | int]] = [
|
|
467
|
+
{
|
|
468
|
+
"filename": v.filename,
|
|
469
|
+
"line": v.line,
|
|
470
|
+
"check": v.check,
|
|
471
|
+
"severity": v.severity,
|
|
472
|
+
"message": v.message,
|
|
473
|
+
}
|
|
474
|
+
for v in all_violations
|
|
475
|
+
]
|
|
476
|
+
print(json.dumps(output, indent=2))
|
|
477
|
+
else:
|
|
478
|
+
for v in all_violations:
|
|
479
|
+
print(v.format_line(), file=sys.stderr)
|
|
480
|
+
|
|
481
|
+
has_errors = any(v.severity == SEVERITY_ERROR for v in all_violations)
|
|
482
|
+
has_warnings = any(v.severity == SEVERITY_WARNING for v in all_violations)
|
|
483
|
+
|
|
484
|
+
if has_errors:
|
|
485
|
+
return 1
|
|
486
|
+
if args.strict and has_warnings:
|
|
487
|
+
return 2
|
|
488
|
+
return 0
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
if __name__ == "__main__":
|
|
492
|
+
sys.exit(main())
|