topos-node 1.3.41__tar.gz → 1.3.43__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.
- {topos_node-1.3.41/topos_node.egg-info → topos_node-1.3.43}/PKG-INFO +1 -1
- {topos_node-1.3.41 → topos_node-1.3.43}/pyproject.toml +1 -1
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/__version__.py +2 -2
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/protocol/narrowing_vocabulary.json +3 -1
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/game_layer.py +69 -0
- topos_node-1.3.43/topos/query/graph_lane.py +152 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/narrowing.py +2 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/pipeline.py +22 -2
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/retrieval.py +56 -1
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_registry.json +129 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/bundled_canonical_triples.py +37 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/install_service.py +135 -4
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/upgrades/manifests.json +12 -0
- {topos_node-1.3.41 → topos_node-1.3.43/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.3.41 → topos_node-1.3.43}/topos_node.egg-info/SOURCES.txt +1 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/LICENSE +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/MANIFEST.in +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/README.md +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/setup.cfg +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/shared/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/shared/filtering.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/shared/schema_registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_extensions.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_profiles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/dataset_resolution.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/luck_surface.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/messenger_directed.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/person_graph.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/person_overlay.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/profiles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/relationship_reads.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/analytics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/app_registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/backup.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/compute_remote.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/connected_apps.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/conversation_context.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/data_commit.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/database_explorer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/db.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/device.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/disk_space_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/engine_run.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/enrichment.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/filter_lab.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/health.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/home_chat.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/llm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/local_mcp.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/query_api.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/shell.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/signal.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/source_install.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/source_scrub.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/sources.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/sources_overview.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/sync.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/tool_index.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/ui_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/uma_data.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/upgrades.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/usage.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/user_identity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/app.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/auth.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/declared_field_map.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/models.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/__main__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/commands.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/tray.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/facts_llm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/model_packs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/settings.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/contacts/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/contacts/identity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/control_plane_client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/api_models.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/db_health.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/device_helpers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/errors.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/events.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/common.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/device.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/graph_summary.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/mcp_client_elevations.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/mcp_clients.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/query.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/uma.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/logging.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/metrics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/routine_access.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/startup_banner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/state.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/table_layers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/types.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/defaults.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/tier.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/disk_space.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/engine.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/hosted_llm_wallet.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/intake.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/model_cache.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/model_manager.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/ollama_runtime.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/registration.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/router.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/tasks.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/transport.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/validator.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/processor.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/record_progress.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/evals/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/extensions.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/kernels.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/net_subject_policy.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/person_bridge.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/router.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/social_bench.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/social_kernels.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/surfaces.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/template.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/writer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/chatgpt_declared.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/edges.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/fact_materializer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/linking.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/owner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/reads.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/structured_fields.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/extract.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/reads.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/blackhole.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/blackhole_guard.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/derived_scrub.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/conversation_windows.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/derived_index.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/service.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/stats/engine.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/stats/fold.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/stats/insights.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/badges.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/daily.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/intents.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/service.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/home_chat/schema.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/home_chat/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/local_exports.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/manager.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/chatgpt_export.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/progress.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/lineage/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/lineage/provenance.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/lineage/tracker.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/mcp_clients.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/observability/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/observability/alerts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/observability/metrics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/observability/tracing.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/openai_client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/owner_key.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/audit.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/job_runner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/stages.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/principal.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/profiles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/projections/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/protocol/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/audit.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/closeness.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/cohort_resolvers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/collaborators.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/ddr.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/disclosure.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/entity_window.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/exclusion.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/facts_direct.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/fingerprint.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/grant_cache.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/inference.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/intent.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/manifest.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/minimizer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/negotiation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/planner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/runtime.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_head.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/session.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/session_utils.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/source_generation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/truth_facts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/types.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/verify.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/verify_modes.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/rate_limit.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/relay_stamp.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/routines/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/routines/schema.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/routines/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/runtime_update.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/scope_resolution.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/container.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/interfaces.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/llm/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/llm/openai.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/local.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/postgres.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/definitions.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/startup_banner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/backup_custody.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/paths.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/schema.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/derived_row_identity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/source_settings.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/user_identity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sync/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sync/client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/sync_handlers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/testing/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/testing/lifespan.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/uds.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/uma_filters.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/uma_resource_id.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/uma_rpt.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/upgrades/runner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/utils/base_object.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos/websocket_client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.3.41 → topos_node-1.3.43}/topos_node.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "topos-node"
|
|
7
|
-
version = "1.3.
|
|
7
|
+
version = "1.3.43"
|
|
8
8
|
description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -88,6 +88,7 @@
|
|
|
88
88
|
"expand_boundary",
|
|
89
89
|
"expand_boundary_downgrade",
|
|
90
90
|
"first_source_ref_only",
|
|
91
|
+
"graph_lane",
|
|
91
92
|
"gate_vetoed",
|
|
92
93
|
"grantee_scrub_facts",
|
|
93
94
|
"grantee_scrub_scores",
|
|
@@ -154,7 +155,8 @@
|
|
|
154
155
|
"topic_thread_single_store",
|
|
155
156
|
"unknown_scope",
|
|
156
157
|
"unmatched_route",
|
|
157
|
-
"unrecognized"
|
|
158
|
+
"unrecognized",
|
|
159
|
+
"world_knowledge_no_retrieval"
|
|
158
160
|
],
|
|
159
161
|
"empty_causes": [
|
|
160
162
|
"gate_vetoed",
|
|
@@ -106,6 +106,75 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
|
|
|
106
106
|
return labels[:10]
|
|
107
107
|
|
|
108
108
|
|
|
109
|
+
#: availability:read licenses free/busy ONLY. The three sets below are the
|
|
110
|
+
#: ENTIRE licensed vocabulary of an availability inference answer — a person
|
|
111
|
+
#: name or a meeting title has no slot in it, so enforcement is a closed-set
|
|
112
|
+
#: membership check, never a redaction pattern that has to recognize names.
|
|
113
|
+
_AVAILABILITY_ANSWERS = frozenset({"yes", "conditional", "no", "unknown"})
|
|
114
|
+
_AVAILABILITY_BANDS = frozenset(
|
|
115
|
+
{"overlap_found", "negotiable_overlap", "no_overlap", "unknown"}
|
|
116
|
+
)
|
|
117
|
+
#: Free text can only leave through a key, so unknown keys are dropped rather
|
|
118
|
+
#: than inspected. Everything listed is either closed-set or pipeline-stamped
|
|
119
|
+
#: metadata (exclusion/truncated/empty_cause carry slugs and integers only).
|
|
120
|
+
_AVAILABILITY_ALLOWED_KEYS = frozenset(
|
|
121
|
+
{
|
|
122
|
+
"access_mode",
|
|
123
|
+
"scope_id",
|
|
124
|
+
"answer_type",
|
|
125
|
+
"band",
|
|
126
|
+
"answer",
|
|
127
|
+
"confidence",
|
|
128
|
+
"items",
|
|
129
|
+
"deferred",
|
|
130
|
+
"redaction",
|
|
131
|
+
"exclusion",
|
|
132
|
+
"truncated",
|
|
133
|
+
"empty_cause",
|
|
134
|
+
"packet_resolution",
|
|
135
|
+
"packet_resolution_reason",
|
|
136
|
+
"principal_cls",
|
|
137
|
+
}
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def is_availability_scope(scope_id: str) -> bool:
|
|
142
|
+
return "availability" in (scope_id or "")
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def enforce_availability_inference_contract(payload: Dict[str, Any]) -> Dict[str, Any]:
|
|
146
|
+
"""Free/busy-only egress gate for availability inference payloads.
|
|
147
|
+
|
|
148
|
+
The branches in ``DefaultGameLayer.apply`` already emit only closed-set
|
|
149
|
+
values for this scope — but the pipeline lanes that run AFTER the game
|
|
150
|
+
layer ``update()`` the payload in place, and any of them can re-open what
|
|
151
|
+
the game layer refused. Live 2026-09-02 the LLM inference lane did exactly
|
|
152
|
+
that: the who-guard's ``answer: "unknown"`` left the engine as a contact's
|
|
153
|
+
full name at confidence 1. This function is the last owner of the payload
|
|
154
|
+
before it is serialized, so a violation here is scrubbed to "unknown"
|
|
155
|
+
rather than trusted, and the scrub is declared via ``redaction`` (a
|
|
156
|
+
closed-set slug) instead of happening silently.
|
|
157
|
+
"""
|
|
158
|
+
out = {k: v for k, v in payload.items() if k in _AVAILABILITY_ALLOWED_KEYS}
|
|
159
|
+
scrubbed = len(out) != len(payload)
|
|
160
|
+
if out.get("answer_type") not in ("band", "list"):
|
|
161
|
+
out["answer_type"] = "band"
|
|
162
|
+
scrubbed = True
|
|
163
|
+
if str(out.get("band") or "unknown") not in _AVAILABILITY_BANDS:
|
|
164
|
+
out.pop("band", None)
|
|
165
|
+
scrubbed = True
|
|
166
|
+
if str(out.get("answer")) not in _AVAILABILITY_ANSWERS:
|
|
167
|
+
out["answer"] = "unknown"
|
|
168
|
+
out["confidence"] = 0.0
|
|
169
|
+
scrubbed = True
|
|
170
|
+
if out.get("items"):
|
|
171
|
+
out["items"] = []
|
|
172
|
+
scrubbed = True
|
|
173
|
+
if scrubbed:
|
|
174
|
+
out["redaction"] = "availability_free_busy_only"
|
|
175
|
+
return out
|
|
176
|
+
|
|
177
|
+
|
|
109
178
|
class DefaultGameLayer:
|
|
110
179
|
reveal_strategy: RevealStrategy = RevealStrategy.DIRECT
|
|
111
180
|
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""The graph retrieval lane (S6, PLAN_QUERY_LOOP.md): edges as evidence.
|
|
2
|
+
|
|
3
|
+
Before this lane, 272 of 38,060 live edges were readable at query time — one
|
|
4
|
+
edge type, one cohort resolver. The relations the derivation layer builds
|
|
5
|
+
(``communicates_with``, ``co_occurrence``, ``pursues``, ``participates_in``,
|
|
6
|
+
``located_at``, ``semantic_affinity``) had no reader on the answer path: the
|
|
7
|
+
"Who works on this with me?" probe returned topic-cluster fragments while a
|
|
8
|
+
528-degree project hub sat unread one table away.
|
|
9
|
+
|
|
10
|
+
This lane contributes 1-hop neighborhoods of the query's linked entities as
|
|
11
|
+
ordinary fusion candidates — at canonical weight, never above (a lane reached
|
|
12
|
+
by a different key but carrying ordinary evidence fuses AT the canonical
|
|
13
|
+
weight; see the lane table in retrieval.py).
|
|
14
|
+
|
|
15
|
+
Privacy posture, deliberately minimal for v1:
|
|
16
|
+
|
|
17
|
+
* **Owner-only.** The lane runs only at ``disclosure_tier == "owner_raw"`` —
|
|
18
|
+
the same proxy the blackhole summary policy trusts, sound because
|
|
19
|
+
``resolve_disclosure_tier`` never elevates a grantee there. For any other
|
|
20
|
+
tier the lane returns nothing and writes NO ledger receipt: a receipt for a
|
|
21
|
+
withheld lane is itself an existence signal.
|
|
22
|
+
* **Blackhole rides the exit wire.** Items carry the neighbor as
|
|
23
|
+
``entity_id`` and the anchor as ``subject_entity_id`` — both members of
|
|
24
|
+
``_BLACKHOLE_ENTITY_ID_KEYS`` — so ``_blackhole_policy_for_summary`` can
|
|
25
|
+
match EITHER endpoint: a black-holed entity can neither appear as a
|
|
26
|
+
neighbor nor be reached through as an anchor. (Owner items are stamped
|
|
27
|
+
``blackhole_protected``, the taint feed Gate C needs; nothing is silently
|
|
28
|
+
dropped from the owner's own view.)
|
|
29
|
+
* **Anchor admission is the thread lane's.** Callers pass anchor ids that
|
|
30
|
+
already went through ``_entity_thread_entities`` — is_self dropped,
|
|
31
|
+
selector policy honored, fail-closed on an unreadable is_self.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from __future__ import annotations
|
|
35
|
+
|
|
36
|
+
import logging
|
|
37
|
+
from typing import Any, Dict, List, Optional
|
|
38
|
+
|
|
39
|
+
from ..features.entities.edges import top_edges
|
|
40
|
+
from . import narrowing as _N
|
|
41
|
+
|
|
42
|
+
logger = logging.getLogger(__name__)
|
|
43
|
+
|
|
44
|
+
#: Neighbors fetched per anchor before the global cap ranks by weight.
|
|
45
|
+
GRAPH_LANE_PER_ANCHOR_LIMIT = 10
|
|
46
|
+
#: Total items the lane may contribute to fusion (SUMMARY_ITEM_CAP is 25;
|
|
47
|
+
#: a graph that floods the packet would drown the content lanes).
|
|
48
|
+
GRAPH_LANE_MAX_ITEMS = 8
|
|
49
|
+
|
|
50
|
+
_EDGE_SENTENCES: Dict[str, str] = {
|
|
51
|
+
"communicates_with": "{a} communicates with {b}",
|
|
52
|
+
"co_occurrence": "{a} and {b} appear together",
|
|
53
|
+
"pursues": "{a} pursues {b}",
|
|
54
|
+
"participates_in": "{a} participates in {b}",
|
|
55
|
+
"located_at": "{a} is located at {b}",
|
|
56
|
+
"semantic_affinity": "{a} is closely related to {b}",
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _edge_sentence(anchor_name: str, neighbor_name: str, edge: Dict[str, Any]) -> str:
|
|
61
|
+
template = _EDGE_SENTENCES.get(
|
|
62
|
+
str(edge.get("edge_type") or ""), "{a} is linked to {b}"
|
|
63
|
+
)
|
|
64
|
+
sentence = template.format(a=anchor_name, b=neighbor_name)
|
|
65
|
+
evidence = edge.get("evidence_count")
|
|
66
|
+
if evidence:
|
|
67
|
+
sentence += f" ({evidence}×)"
|
|
68
|
+
return sentence
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def graph_neighborhood_items(
|
|
72
|
+
conn: Any,
|
|
73
|
+
*,
|
|
74
|
+
anchor_ids: List[str],
|
|
75
|
+
anchor_names: Dict[str, str],
|
|
76
|
+
scope_id: str,
|
|
77
|
+
manifest: Any,
|
|
78
|
+
disclosure_tier: str,
|
|
79
|
+
ledger: Optional[Any] = None,
|
|
80
|
+
) -> List[Dict[str, Any]]:
|
|
81
|
+
"""1-hop neighborhoods of the anchors, as fusion-ready summary items.
|
|
82
|
+
|
|
83
|
+
Returns [] — with no ledger receipt — unless the tier is owner_raw and
|
|
84
|
+
the scope warrants relationship structure.
|
|
85
|
+
"""
|
|
86
|
+
if str(disclosure_tier or "") != "owner_raw":
|
|
87
|
+
return []
|
|
88
|
+
tables = list(getattr(manifest, "canonical_tables", None) or [])
|
|
89
|
+
# relationship_context:read is the deliberate exception: its declared
|
|
90
|
+
# table is conversation_messages, but relationship STRUCTURE is exactly
|
|
91
|
+
# what the scope's own card advertises ("Who works on this with me?") —
|
|
92
|
+
# the same explicit-scope pattern the goals and emotions lanes use.
|
|
93
|
+
if "entity_edges" not in tables and str(scope_id) != "relationship_context:read":
|
|
94
|
+
return []
|
|
95
|
+
if conn is None or not anchor_ids:
|
|
96
|
+
return []
|
|
97
|
+
|
|
98
|
+
seen: set = set()
|
|
99
|
+
collected: List[Dict[str, Any]] = []
|
|
100
|
+
for anchor_id in anchor_ids:
|
|
101
|
+
anchor_name = anchor_names.get(anchor_id) or anchor_id
|
|
102
|
+
try:
|
|
103
|
+
edges = top_edges(conn, anchor_id, limit=GRAPH_LANE_PER_ANCHOR_LIMIT)
|
|
104
|
+
except Exception as exc: # noqa: BLE001 — one bad anchor must not kill the lane
|
|
105
|
+
logger.debug("graph lane: top_edges failed for %s: %s", anchor_id, exc)
|
|
106
|
+
continue
|
|
107
|
+
for edge in edges:
|
|
108
|
+
neighbor_id = str(edge.get("entity_id") or "")
|
|
109
|
+
edge_type = str(edge.get("edge_type") or "")
|
|
110
|
+
if not neighbor_id or not edge_type:
|
|
111
|
+
continue
|
|
112
|
+
key = (anchor_id, neighbor_id, edge_type)
|
|
113
|
+
if key in seen:
|
|
114
|
+
continue
|
|
115
|
+
seen.add(key)
|
|
116
|
+
neighbor_name = str(edge.get("entity_name") or neighbor_id)
|
|
117
|
+
event_at = edge.get("last_event_at") or edge.get("valid_from")
|
|
118
|
+
item: Dict[str, Any] = {
|
|
119
|
+
"topic": neighbor_name[:120],
|
|
120
|
+
"summary_text": _edge_sentence(anchor_name, neighbor_name, edge),
|
|
121
|
+
# Neighbor and anchor: both endpoints must be matchable by the
|
|
122
|
+
# blackhole exit wire (_BLACKHOLE_ENTITY_ID_KEYS).
|
|
123
|
+
"entity_id": neighbor_id,
|
|
124
|
+
"subject_entity_id": anchor_id,
|
|
125
|
+
"entity_type": edge.get("entity_type"),
|
|
126
|
+
"edge_type": edge_type,
|
|
127
|
+
"relevance_score": float(edge.get("weight") or 0.0),
|
|
128
|
+
"retrieval_source": f"graph:{edge_type}",
|
|
129
|
+
}
|
|
130
|
+
if event_at:
|
|
131
|
+
item["event_at"] = event_at
|
|
132
|
+
collected.append(item)
|
|
133
|
+
|
|
134
|
+
collected.sort(key=lambda i: i.get("relevance_score") or 0.0, reverse=True)
|
|
135
|
+
dropped = max(0, len(collected) - GRAPH_LANE_MAX_ITEMS)
|
|
136
|
+
items = collected[:GRAPH_LANE_MAX_ITEMS]
|
|
137
|
+
if items and ledger is not None:
|
|
138
|
+
try:
|
|
139
|
+
ledger.record(
|
|
140
|
+
_N.STAGE_RETRIEVAL,
|
|
141
|
+
"contributed",
|
|
142
|
+
"graph_lane",
|
|
143
|
+
dropped=dropped,
|
|
144
|
+
detail={
|
|
145
|
+
"anchors": len(anchor_ids),
|
|
146
|
+
"contributed": len(items),
|
|
147
|
+
"edge_types": sorted({i["edge_type"] for i in items}),
|
|
148
|
+
},
|
|
149
|
+
)
|
|
150
|
+
except Exception: # noqa: BLE001 — the ledger never breaks a turn
|
|
151
|
+
pass
|
|
152
|
+
return items
|
|
@@ -195,6 +195,7 @@ REASONS = frozenset(
|
|
|
195
195
|
"embedded_subject_not_instruction",
|
|
196
196
|
"entity_thread_is_self",
|
|
197
197
|
"entity_thread_lane",
|
|
198
|
+
"graph_lane",
|
|
198
199
|
"entity_thread_selector_not_accessible",
|
|
199
200
|
"entity_thread_self_check_unavailable",
|
|
200
201
|
"entity_thread_unresolved",
|
|
@@ -299,6 +300,7 @@ REASONS = frozenset(
|
|
|
299
300
|
"source_has_live_tools",
|
|
300
301
|
"source_ref",
|
|
301
302
|
"summary_enrichment",
|
|
303
|
+
"world_knowledge_no_retrieval",
|
|
302
304
|
# --- control plane: refusals that never reach the node. The human-readable
|
|
303
305
|
# sentence stays on the response's own `deny_reason`; the ledger carries the code.
|
|
304
306
|
"access_mode_above_ceiling",
|
|
@@ -16,7 +16,11 @@ from .ddr import StageTimings, build_disclosure_decision_record, now_ms
|
|
|
16
16
|
from .disclosure import DisclosureFilterPipeline
|
|
17
17
|
from .fingerprint import compute_retrieval_fingerprint
|
|
18
18
|
from .packet_resolution import effective_packet_resolution
|
|
19
|
-
from .game_layer import
|
|
19
|
+
from .game_layer import (
|
|
20
|
+
DefaultGameLayer,
|
|
21
|
+
enforce_availability_inference_contract,
|
|
22
|
+
is_availability_scope,
|
|
23
|
+
)
|
|
20
24
|
from .inference import run_query_inference
|
|
21
25
|
from .intent import compute_intent_hash
|
|
22
26
|
from .manifest import ScopeResolutionManifest
|
|
@@ -779,7 +783,17 @@ class QueryPipelineOrchestrator:
|
|
|
779
783
|
query_text=query_text,
|
|
780
784
|
)
|
|
781
785
|
timings.game_layer_ms = now_ms() - _t0
|
|
782
|
-
|
|
786
|
+
# availability:read licenses free/busy only, so the game layer's output
|
|
787
|
+
# (band, or the who-guard's refusal) is FINAL for this scope — same
|
|
788
|
+
# contract as `band`/`facts` below: deterministic answer_types are
|
|
789
|
+
# final. The lanes below `update()` the payload in place, and on
|
|
790
|
+
# 2026-09-02 the LLM lane overwrote the who-guard's "unknown" with a
|
|
791
|
+
# contact's full name at confidence 1 — the refusal has answer_type
|
|
792
|
+
# "list", which both lanes treated as an invitation.
|
|
793
|
+
availability_final = access_mode == "inference" and is_availability_scope(scope_id)
|
|
794
|
+
if (access_mode == "inference"
|
|
795
|
+
and not availability_final
|
|
796
|
+
and public.payload.get("answer_type") != "band"):
|
|
783
797
|
# C7 facts-direct (W3.1): a known-item ask with live facts gets its
|
|
784
798
|
# exact values, validity dates and evidence counts with ZERO LLM —
|
|
785
799
|
# same contract as `band`: deterministic answer_types are final.
|
|
@@ -820,6 +834,7 @@ class QueryPipelineOrchestrator:
|
|
|
820
834
|
if direct is not None:
|
|
821
835
|
public.payload.update(direct)
|
|
822
836
|
if (access_mode == "inference"
|
|
837
|
+
and not availability_final
|
|
823
838
|
and public.payload.get("answer_type") not in ("band", "facts")):
|
|
824
839
|
_t0 = now_ms()
|
|
825
840
|
inf = await asyncio.to_thread(
|
|
@@ -831,6 +846,11 @@ class QueryPipelineOrchestrator:
|
|
|
831
846
|
)
|
|
832
847
|
public.payload.update(inf)
|
|
833
848
|
timings.inference_ms = now_ms() - _t0
|
|
849
|
+
if availability_final:
|
|
850
|
+
# Closed-set egress scrub, applied even though the lanes above are
|
|
851
|
+
# gated off: the payload has one last owner before serialization,
|
|
852
|
+
# and a lane added later must hit this wall, not the wire.
|
|
853
|
+
public.payload = enforce_availability_inference_contract(public.payload)
|
|
834
854
|
|
|
835
855
|
public_dict = public.to_dict()
|
|
836
856
|
# Declared, never silent: every turn says what resolution actually applied and
|
|
@@ -4716,7 +4716,10 @@ _NO_DECAY_FUSION_SOURCES = frozenset(
|
|
|
4716
4716
|
# a RelationshipEdge or a dossier is a statement about how things ARE, not
|
|
4717
4717
|
# an event that happened at a time. Decaying it would rank the owner's
|
|
4718
4718
|
# mother below last night's chatter.
|
|
4719
|
-
|
|
4719
|
+
# S6 "graph": an edge is a statement about how things stand between two
|
|
4720
|
+
# entities, not an event — decayed by created_at, the owner's closest
|
|
4721
|
+
# collaborator would rank below last night's chatter.
|
|
4722
|
+
{"stat_insights", "facts_store", "entities", "briefs", "goals", "derived_objects", "graph"}
|
|
4720
4723
|
)
|
|
4721
4724
|
|
|
4722
4725
|
|
|
@@ -5634,6 +5637,7 @@ def _build_summary_items_unfiltered(
|
|
|
5634
5637
|
entity_items: List[Dict[str, Any]] = []
|
|
5635
5638
|
entity_thread_items: List[Dict[str, Any]] = []
|
|
5636
5639
|
fact_store_items: List[Dict[str, Any]] = []
|
|
5640
|
+
graph_items: List[Dict[str, Any]] = []
|
|
5637
5641
|
if query_text:
|
|
5638
5642
|
try:
|
|
5639
5643
|
from ..core.state import get_db_connection
|
|
@@ -5688,6 +5692,32 @@ def _build_summary_items_unfiltered(
|
|
|
5688
5692
|
ledger=ledger,
|
|
5689
5693
|
thread_sink=thread_sink,
|
|
5690
5694
|
)
|
|
5695
|
+
# S6: the graph lane — the same resolution, one join outward.
|
|
5696
|
+
# `entity_context_items` says what the graph KNOWS about the
|
|
5697
|
+
# entity; the thread lane fetches its RECORDS; this contributes
|
|
5698
|
+
# its RELATIONS — the edges no lane could previously read. Own
|
|
5699
|
+
# try/except: a graph failure must not also kill the thread
|
|
5700
|
+
# lane (this block's outer except swallows everything).
|
|
5701
|
+
try:
|
|
5702
|
+
from .graph_lane import graph_neighborhood_items
|
|
5703
|
+
|
|
5704
|
+
anchor_ids, _skipped = _entity_thread_entities(
|
|
5705
|
+
conn, linked, manifest=manifest
|
|
5706
|
+
)
|
|
5707
|
+
graph_items = graph_neighborhood_items(
|
|
5708
|
+
conn,
|
|
5709
|
+
anchor_ids=anchor_ids,
|
|
5710
|
+
anchor_names={
|
|
5711
|
+
str(e.get("entity_id")): str(e.get("canonical_name") or "")
|
|
5712
|
+
for e in linked
|
|
5713
|
+
},
|
|
5714
|
+
scope_id=str(getattr(manifest, "scope_id", "") or ""),
|
|
5715
|
+
manifest=manifest,
|
|
5716
|
+
disclosure_tier=disclosure_tier,
|
|
5717
|
+
ledger=ledger,
|
|
5718
|
+
)
|
|
5719
|
+
except Exception as graph_exc: # noqa: BLE001
|
|
5720
|
+
logger.debug("graph lane skipped: %s", graph_exc)
|
|
5691
5721
|
except Exception as exc:
|
|
5692
5722
|
logger.debug("entity linking skipped: %s", exc)
|
|
5693
5723
|
|
|
@@ -5803,6 +5833,15 @@ def _build_summary_items_unfiltered(
|
|
|
5803
5833
|
if ai_scope and canonical_items:
|
|
5804
5834
|
min_per = dict(min_per or {})
|
|
5805
5835
|
min_per["canonical"] = max(int(min_per.get("canonical") or 0), 3)
|
|
5836
|
+
# S6: the graph lane only produces items under the scopes that
|
|
5837
|
+
# advertise relationship STRUCTURE (relationship_context:read,
|
|
5838
|
+
# graph:read) — and on a rich corpus its RRF share at canonical
|
|
5839
|
+
# weight loses the top-25 to sixteen content lanes (measured on the
|
|
5840
|
+
# owner snapshot: 8 lane items, 0 survivors). Structure is the
|
|
5841
|
+
# product there, so it keeps a two-slot spine, same as goals.
|
|
5842
|
+
if graph_items:
|
|
5843
|
+
min_per = dict(min_per or {})
|
|
5844
|
+
min_per["graph"] = max(int(min_per.get("graph") or 0), 2)
|
|
5806
5845
|
# NOTE: cosine similarity must NOT waive the zero-df gate — a strong hit
|
|
5807
5846
|
# on the generic half of a query ("compiler rewrite") cannot evidence a
|
|
5808
5847
|
# name the corpus does not contain ("Threnody-7"). The N-lane found
|
|
@@ -5822,6 +5861,11 @@ def _build_summary_items_unfiltered(
|
|
|
5822
5861
|
# ordinary canonical evidence that arrived by a different key, so
|
|
5823
5862
|
# it fuses at the canonical lane's own weight.
|
|
5824
5863
|
("entity_thread", 1.0, entity_thread_items),
|
|
5864
|
+
# S6: edges are ordinary evidence that arrived by the entity
|
|
5865
|
+
# key instead of a content key — the same argument as the
|
|
5866
|
+
# thread lane, so the same weight: beside the scope routes,
|
|
5867
|
+
# never above them.
|
|
5868
|
+
("graph", 1.0, graph_items),
|
|
5825
5869
|
# Q1. Same argument, same weight: evidence for a stated goal is
|
|
5826
5870
|
# ordinary canonical evidence that arrived keyed to that goal's ids.
|
|
5827
5871
|
# It is a joined minority lane beside the scope routes, never above
|
|
@@ -5858,6 +5902,7 @@ def _build_summary_items_unfiltered(
|
|
|
5858
5902
|
+ entity_items
|
|
5859
5903
|
+ derived_items
|
|
5860
5904
|
+ entity_thread_items
|
|
5905
|
+
+ graph_items
|
|
5861
5906
|
+ commitment_items
|
|
5862
5907
|
+ goal_items
|
|
5863
5908
|
+ emotion_items
|
|
@@ -6638,6 +6683,16 @@ class DefaultSignalRetrievalAdapter:
|
|
|
6638
6683
|
)
|
|
6639
6684
|
if summaries:
|
|
6640
6685
|
touched.append("signal")
|
|
6686
|
+
# S6: the graph store is declared touched when the graph lane
|
|
6687
|
+
# actually contributed — the Shortfall probe's assertion target
|
|
6688
|
+
# ("Who works on this with me?" must consult the graph, not
|
|
6689
|
+
# topic-cluster noise). Checked on items rather than threaded
|
|
6690
|
+
# through a sink: the lane's provenance prefix IS the signal.
|
|
6691
|
+
if any(
|
|
6692
|
+
str(item.get("retrieval_source") or "").startswith("graph:")
|
|
6693
|
+
for item in summaries
|
|
6694
|
+
):
|
|
6695
|
+
touched.append("graph")
|
|
6641
6696
|
# Surface the planner's parsed window so synthesis can state
|
|
6642
6697
|
# which dates were searched ("nothing from 2026-07-16") instead
|
|
6643
6698
|
# of inferring it from per-item timestamps. Summary mode only:
|
|
@@ -186,6 +186,110 @@
|
|
|
186
186
|
"canonical_address_book"
|
|
187
187
|
]
|
|
188
188
|
},
|
|
189
|
+
{
|
|
190
|
+
"scope_id": "facts:read",
|
|
191
|
+
"description": "Derived facts about the owner from standard packs (work, interests, preferences, places, behavior): predicate/value pairs with validity windows. Excludes special-class packs \u2014 health, inner-state and finances live behind facts_sensitive:read.",
|
|
192
|
+
"example_questions": [
|
|
193
|
+
"What do the derivation packs know about my work?",
|
|
194
|
+
"Which projects am I recorded as pursuing?",
|
|
195
|
+
"What are my stated preferences?"
|
|
196
|
+
],
|
|
197
|
+
"primary_dimensions": [
|
|
198
|
+
"Profile"
|
|
199
|
+
],
|
|
200
|
+
"raw_tables": [],
|
|
201
|
+
"canonical_tables": [],
|
|
202
|
+
"signal_objects": [
|
|
203
|
+
"fact"
|
|
204
|
+
],
|
|
205
|
+
"summary_objects": [
|
|
206
|
+
"fact"
|
|
207
|
+
],
|
|
208
|
+
"inference_objects": [
|
|
209
|
+
"fact"
|
|
210
|
+
],
|
|
211
|
+
"default_mode_ceiling": "inference",
|
|
212
|
+
"implementation_status": "stub",
|
|
213
|
+
"fact_classes": [
|
|
214
|
+
"standard"
|
|
215
|
+
]
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"scope_id": "facts_sensitive:read",
|
|
219
|
+
"description": "Derived facts from special-class packs: health, inner state (mind.*), and finances (money.*). Split from facts:read so a grant can carry everyday facts without carrying these; mirrors the engine's facts vs facts_all packet distinction.",
|
|
220
|
+
"example_questions": [
|
|
221
|
+
"What medications am I recorded as taking?",
|
|
222
|
+
"What does the pack record about my reported state?"
|
|
223
|
+
],
|
|
224
|
+
"primary_dimensions": [
|
|
225
|
+
"Profile"
|
|
226
|
+
],
|
|
227
|
+
"raw_tables": [],
|
|
228
|
+
"canonical_tables": [],
|
|
229
|
+
"signal_objects": [
|
|
230
|
+
"fact"
|
|
231
|
+
],
|
|
232
|
+
"summary_objects": [
|
|
233
|
+
"fact"
|
|
234
|
+
],
|
|
235
|
+
"inference_objects": [
|
|
236
|
+
"fact"
|
|
237
|
+
],
|
|
238
|
+
"default_mode_ceiling": "inference",
|
|
239
|
+
"implementation_status": "stub",
|
|
240
|
+
"fact_classes": [
|
|
241
|
+
"special"
|
|
242
|
+
]
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"scope_id": "goals:read",
|
|
246
|
+
"description": "Stated and derived goals: the user_goals store and Goal signal objects, with their dates and status. Aspirations are sensitive; answers are summaries and bands, not raw dumps.",
|
|
247
|
+
"example_questions": [
|
|
248
|
+
"What goals have I set this quarter?",
|
|
249
|
+
"Which goals went quiet?"
|
|
250
|
+
],
|
|
251
|
+
"primary_dimensions": [
|
|
252
|
+
"Profile"
|
|
253
|
+
],
|
|
254
|
+
"raw_tables": [],
|
|
255
|
+
"canonical_tables": [
|
|
256
|
+
"user_goals"
|
|
257
|
+
],
|
|
258
|
+
"signal_objects": [
|
|
259
|
+
"Goal",
|
|
260
|
+
"user_goals"
|
|
261
|
+
],
|
|
262
|
+
"summary_objects": [
|
|
263
|
+
"Goal"
|
|
264
|
+
],
|
|
265
|
+
"inference_objects": [
|
|
266
|
+
"Goal"
|
|
267
|
+
],
|
|
268
|
+
"default_mode_ceiling": "inference",
|
|
269
|
+
"implementation_status": "stub"
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"scope_id": "graph:read",
|
|
273
|
+
"description": "The entity graph: people, projects, places and topics as nodes, and the derived relations between them (communicates_with, co_occurrence, pursues, participates_in, located_at). Structure and strength, resolved through aliases; not message text.",
|
|
274
|
+
"example_questions": [
|
|
275
|
+
"Who is connected to this project?",
|
|
276
|
+
"What links me to this person?",
|
|
277
|
+
"Which people bridge my communities?"
|
|
278
|
+
],
|
|
279
|
+
"primary_dimensions": [
|
|
280
|
+
"Relationships"
|
|
281
|
+
],
|
|
282
|
+
"raw_tables": [
|
|
283
|
+
"entities",
|
|
284
|
+
"entity_edges"
|
|
285
|
+
],
|
|
286
|
+
"canonical_tables": [],
|
|
287
|
+
"signal_objects": [],
|
|
288
|
+
"summary_objects": [],
|
|
289
|
+
"inference_objects": [],
|
|
290
|
+
"default_mode_ceiling": "raw",
|
|
291
|
+
"implementation_status": "live"
|
|
292
|
+
},
|
|
189
293
|
{
|
|
190
294
|
"scope_id": "health:read",
|
|
191
295
|
"description": "Wellbeing signals from journal entries and role-filtered message emotions: moods, wellness summaries, and wellness scores.",
|
|
@@ -381,6 +485,31 @@
|
|
|
381
485
|
"calendar_stub"
|
|
382
486
|
]
|
|
383
487
|
},
|
|
488
|
+
{
|
|
489
|
+
"scope_id": "topics:read",
|
|
490
|
+
"description": "Derived topic clusters and their membership: what themes the owner's activity organizes into, by dimension. Labels and counts; member pointers stay on the node.",
|
|
491
|
+
"example_questions": [
|
|
492
|
+
"What themes does my work cluster into?",
|
|
493
|
+
"How big is each interest cluster?"
|
|
494
|
+
],
|
|
495
|
+
"primary_dimensions": [
|
|
496
|
+
"Interests"
|
|
497
|
+
],
|
|
498
|
+
"raw_tables": [],
|
|
499
|
+
"canonical_tables": [
|
|
500
|
+
"topic_clusters",
|
|
501
|
+
"topic_cluster_members"
|
|
502
|
+
],
|
|
503
|
+
"signal_objects": [
|
|
504
|
+
"message_topics"
|
|
505
|
+
],
|
|
506
|
+
"summary_objects": [
|
|
507
|
+
"message_topics"
|
|
508
|
+
],
|
|
509
|
+
"inference_objects": [],
|
|
510
|
+
"default_mode_ceiling": "summary",
|
|
511
|
+
"implementation_status": "stub"
|
|
512
|
+
},
|
|
384
513
|
{
|
|
385
514
|
"scope_id": "work_context:read",
|
|
386
515
|
"description": "Work goals and context: roles, skills and employment history from profile records, plus goals extracted from AI conversations and owner journals.",
|
|
@@ -32,6 +32,17 @@ BUNDLED_CANONICAL_TRIPLES: Dict[str, Tuple[str, str]] = {
|
|
|
32
32
|
"gcal.events.v1": ("google_calendar", "schedule"),
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
# Known drift variants of bundled schema ids, seen in the wild: a 2026-07
|
|
36
|
+
# operator install template invented "gdrive.files.v1" (the bundled id is
|
|
37
|
+
# "gdrive.file.v1"). Deliberately NOT keys of BUNDLED_CANONICAL_TRIPLES: an
|
|
38
|
+
# exact key makes normalize_canonical_source_payload raise and rehydrate
|
|
39
|
+
# demote, and the live drive_files install carries this schema with no bundled
|
|
40
|
+
# replacement to fall back to — enforcement would orphan a working connector.
|
|
41
|
+
# Callers use bundled_schema_drift() and decide per source_id.
|
|
42
|
+
BUNDLED_SCHEMA_ALIASES: Dict[str, str] = {
|
|
43
|
+
"gdrive.files.v1": "gdrive.file.v1",
|
|
44
|
+
}
|
|
45
|
+
|
|
35
46
|
VALID_CANONICAL_GROUP_IDS = frozenset(
|
|
36
47
|
{
|
|
37
48
|
"ai_messages",
|
|
@@ -97,6 +108,32 @@ def bundled_lane_conflict(payload: Dict[str, Any]) -> Optional[str]:
|
|
|
97
108
|
)
|
|
98
109
|
|
|
99
110
|
|
|
111
|
+
def bundled_schema_drift(payload: Dict[str, Any]) -> Optional[str]:
|
|
112
|
+
"""Reason when the payload's schema is a drift variant of a bundled id and
|
|
113
|
+
its declared lane contradicts the bundled triple, else None.
|
|
114
|
+
|
|
115
|
+
Advisory, unlike bundled_lane_conflict: the caller decides whether the row
|
|
116
|
+
can be retired (its source_id has a bundled replacement) or only reported.
|
|
117
|
+
"""
|
|
118
|
+
group_id = str(payload.get("canonical_group_id") or "").strip()
|
|
119
|
+
if not group_id:
|
|
120
|
+
return None
|
|
121
|
+
for key in (
|
|
122
|
+
str(payload.get("schema_id") or "").strip(),
|
|
123
|
+
str(payload.get("parser_id") or "").strip(),
|
|
124
|
+
):
|
|
125
|
+
bundled_key = BUNDLED_SCHEMA_ALIASES.get(key)
|
|
126
|
+
if not bundled_key:
|
|
127
|
+
continue
|
|
128
|
+
_, bundled_lane = BUNDLED_CANONICAL_TRIPLES[bundled_key]
|
|
129
|
+
if group_id != bundled_lane:
|
|
130
|
+
return (
|
|
131
|
+
f"schema {key!r} is a drift variant of bundled {bundled_key!r} and "
|
|
132
|
+
f"canonical_group_id {group_id!r} contradicts bundled lane {bundled_lane!r}"
|
|
133
|
+
)
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
|
|
100
137
|
def normalize_canonical_source_payload(payload: Dict[str, Any]) -> Dict[str, Any]:
|
|
101
138
|
"""
|
|
102
139
|
Fill bundled canonical_mapper_id from schema/parser; drop deprecated connected flag.
|