topos-node 1.3.40__tar.gz → 1.3.42__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.40/topos_node.egg-info → topos_node-1.3.42}/PKG-INFO +1 -1
- {topos_node-1.3.40 → topos_node-1.3.42}/pyproject.toml +1 -1
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/__version__.py +2 -2
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/graph_summary.py +5 -1
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/projection.py +9 -1
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/edges.py +12 -2
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/graph_refresh.py +55 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/canonical_pipeline.py +26 -24
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/protocol/narrowing_vocabulary.json +2 -1
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/game_layer.py +69 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/narrowing.py +1 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/pipeline.py +22 -2
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_registry.json +129 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/bundled_canonical_triples.py +37 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/install_service.py +86 -4
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/upgrades/manifests.json +12 -0
- {topos_node-1.3.40 → topos_node-1.3.42/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.3.40 → topos_node-1.3.42}/LICENSE +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/MANIFEST.in +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/README.md +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/setup.cfg +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/shared/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/shared/filtering.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/shared/schema_registry.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_extensions.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_profiles.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/dataset_resolution.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/luck_surface.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/messenger_directed.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/person_graph.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/person_overlay.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/profiles.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/relationship_reads.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/analytics.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/app_registry.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/backup.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/compute_remote.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/connected_apps.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/conversation_context.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/data_commit.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/database_explorer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/db.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/device.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/disk_space_config.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/engine_run.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/enrichment.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/filter_lab.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/health.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/home_chat.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/llm.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/local_mcp.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/query_api.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/shell.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/signal.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/source_install.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/source_scrub.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/sources.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/sources_overview.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/sync.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/tool_index.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/ui_config.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/uma_data.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/upgrades.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/usage.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/user_identity.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/app.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/auth.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/declared_field_map.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/models.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/__main__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/commands.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/tray.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/facts_llm.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/model_packs.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/settings.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/contacts/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/contacts/identity.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/control_plane_client.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/api_models.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/db_health.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/device_helpers.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/errors.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/events.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/common.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/config.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/device.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/mcp_client_elevations.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/mcp_clients.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/query.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/uma.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/logging.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/metrics.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/routine_access.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/startup_banner.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/state.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/table_layers.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/types.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/defaults.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/tier.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/base.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/client.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/disk_space.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/engine.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/hosted_llm_wallet.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/intake.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/model_cache.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/model_manager.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/ollama_runtime.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/registration.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/router.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/tasks.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/transport.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/validator.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/processor.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/record_progress.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/evals/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/extensions.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/kernels.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/net_subject_policy.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/person_bridge.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/router.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/social_bench.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/social_kernels.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/surfaces.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/template.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/writer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/chatgpt_declared.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/fact_materializer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/linking.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/owner.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/reads.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/structured_fields.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/extract.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/reads.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/blackhole.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_guard.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/derived_scrub.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/conversation_windows.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/derived_index.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/service.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/stats/engine.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/stats/fold.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/stats/insights.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/badges.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/daily.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/intents.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/service.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/home_chat/schema.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/home_chat/store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/local_exports.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/manager.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_export.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/progress.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/lineage/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/lineage/provenance.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/lineage/tracker.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/mcp_clients.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/observability/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/observability/alerts.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/observability/metrics.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/observability/tracing.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/openai_client.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/owner_key.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/audit.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/job_runner.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/stages.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/principal.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/profiles.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/projections/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/protocol/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/audit.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/closeness.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/cohort_resolvers.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/collaborators.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/ddr.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/disclosure.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/entity_window.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/exclusion.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/facts_direct.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/fingerprint.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/grant_cache.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/inference.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/intent.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/manifest.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/minimizer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/negotiation.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/planner.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/retrieval.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/runtime.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_head.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/session.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/session_utils.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/source_generation.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/truth_facts.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/types.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/verify.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/verify_modes.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/rate_limit.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/relay_stamp.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/routines/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/routines/schema.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/routines/store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/runtime_update.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/scope_resolution.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/container.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/interfaces.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/llm/base.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/llm/openai.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/local.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/postgres.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/definitions.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/registry.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/startup_banner.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/client.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/backup_custody.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/registry.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/paths.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/schema.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/derived_row_identity.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/source_settings.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/user_identity.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sync/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sync/client.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/sync_handlers.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/testing/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/testing/lifespan.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/uds.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/uma_filters.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/uma_resource_id.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/uma_rpt.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/upgrades/runner.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/utils/base_object.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos/websocket_client.py +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos_node.egg-info/SOURCES.txt +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.3.40 → topos_node-1.3.42}/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.42"
|
|
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"
|
|
@@ -44,8 +44,12 @@ def _counts() -> Dict[str, Any]:
|
|
|
44
44
|
except Exception: # noqa: BLE001
|
|
45
45
|
out[key] = None
|
|
46
46
|
try:
|
|
47
|
+
# The column is `last_run_at` -- what _mark_materialized writes. This read
|
|
48
|
+
# `materialized_at`, which does not exist, and the per-field try/except
|
|
49
|
+
# turned that into a permanent null rather than an error: shipped in
|
|
50
|
+
# 1.3.40 and noticed only because the live reply carried the null.
|
|
47
51
|
row = conn.execute(
|
|
48
|
-
"SELECT MAX(
|
|
52
|
+
"SELECT MAX(last_run_at) FROM graph_materialization_state"
|
|
49
53
|
).fetchone()
|
|
50
54
|
out["materialized_at"] = row[0] if row else None
|
|
51
55
|
except Exception: # noqa: BLE001
|
|
@@ -401,7 +401,15 @@ class EvidenceCache:
|
|
|
401
401
|
for row in conn.execute(
|
|
402
402
|
f"""
|
|
403
403
|
SELECT src_entity_id, dst_entity_id, edge_type, weight, evidence_count,
|
|
404
|
-
|
|
404
|
+
-- last_event_at ONLY. valid_from is when the node started
|
|
405
|
+
-- believing the relation (a recompute's clock for part_of
|
|
406
|
+
-- and other structural edges) and created_at is the row's
|
|
407
|
+
-- own birth; neither is an event. The fallback made an
|
|
408
|
+
-- undated edge report activity at rebuild time, which is
|
|
409
|
+
-- the defect fixed for the graph window in edges.py.
|
|
410
|
+
-- EvidenceCache.add tolerates None: weight still counts,
|
|
411
|
+
-- no date is invented.
|
|
412
|
+
last_event_at AS event_at
|
|
405
413
|
FROM entity_edges
|
|
406
414
|
WHERE valid_to IS NULL
|
|
407
415
|
AND LOWER(TRIM(edge_type)) IN ({placeholders})
|
|
@@ -562,11 +562,21 @@ def graph_snapshot(
|
|
|
562
562
|
clause = ""
|
|
563
563
|
else:
|
|
564
564
|
clause = " AND valid_to IS NULL"
|
|
565
|
+
# A TIME window asks "did anything happen between these dates". Only
|
|
566
|
+
# last_event_at answers that. valid_from is when the node started BELIEVING
|
|
567
|
+
# the relation -- for a structural edge written by a recompute (semantic
|
|
568
|
+
# affinity, part_of) that is the recompute's clock, and it carries no event
|
|
569
|
+
# at all. The old COALESCE fallback read that clock as activity, so every
|
|
570
|
+
# entity touched by a rebuild appeared in "the last 11 days" no matter when
|
|
571
|
+
# it was last mentioned: 69 of 4,602 dormant entities on the reference node,
|
|
572
|
+
# 60 of them through exactly these undated edges. An undated edge is no
|
|
573
|
+
# evidence of activity in any window; it stays in the unwindowed views,
|
|
574
|
+
# where valid_from remains the right recency key for ORDER BY.
|
|
565
575
|
if after:
|
|
566
|
-
clause += " AND
|
|
576
|
+
clause += " AND last_event_at IS NOT NULL AND last_event_at >= ?"
|
|
567
577
|
where_params.append(after)
|
|
568
578
|
if before:
|
|
569
|
-
clause += " AND
|
|
579
|
+
clause += " AND last_event_at IS NOT NULL AND last_event_at <= ?"
|
|
570
580
|
where_params.append(before)
|
|
571
581
|
|
|
572
582
|
where_sql = (
|
|
@@ -28,6 +28,7 @@ import asyncio
|
|
|
28
28
|
import logging
|
|
29
29
|
import os
|
|
30
30
|
import threading
|
|
31
|
+
from typing import Any, Dict
|
|
31
32
|
from datetime import datetime, timezone
|
|
32
33
|
from typing import Any, Callable, Dict, Optional
|
|
33
34
|
|
|
@@ -253,6 +254,60 @@ def gc_status() -> Dict[str, Any]:
|
|
|
253
254
|
return {"enabled": _gc_enabled(), "pending": _GC_TIMER is not None, **_GC_LAST}
|
|
254
255
|
|
|
255
256
|
|
|
257
|
+
def refresh_now_if_dirty() -> Dict[str, Any]:
|
|
258
|
+
"""Rebuild the graph inline, right now, if it is dirty and nothing is deriving.
|
|
259
|
+
|
|
260
|
+
Written for one caller: the post-canonical pipeline, at the point between
|
|
261
|
+
canonical enrichment and signal derivation. The debounced mark cannot do
|
|
262
|
+
this job there -- its timer fires ~90s later, by which time signal
|
|
263
|
+
derivation has raised the in-flight counter and _fire re-arms the timer
|
|
264
|
+
instead of rebuilding (DEBUG-logged). It keeps re-arming until derivation
|
|
265
|
+
ends, so the mid-import refresh collapses into the end-of-pipeline one. On
|
|
266
|
+
a file import that phase runs for hours, so "the graph fills before the
|
|
267
|
+
long phase" never happened. Measured on a 20-stage import: zero mid-import
|
|
268
|
+
rebuilds.
|
|
269
|
+
|
|
270
|
+
Costs a rebuild (~7-9 minutes on a 17k-edge node) inside the import, which
|
|
271
|
+
is the point. Skipped when the graph is not dirty, so a re-import that
|
|
272
|
+
changed nothing pays nothing.
|
|
273
|
+
"""
|
|
274
|
+
from ...core.state import get_db_connection
|
|
275
|
+
from ...enrichment.pipeline_activity import is_derivation_in_flight
|
|
276
|
+
|
|
277
|
+
if not _enabled():
|
|
278
|
+
return {"skipped": "disabled"}
|
|
279
|
+
if is_derivation_in_flight():
|
|
280
|
+
return {"skipped": "derivation in flight"}
|
|
281
|
+
conn = get_db_connection()
|
|
282
|
+
if conn is None:
|
|
283
|
+
return {"skipped": "no database"}
|
|
284
|
+
try:
|
|
285
|
+
row = conn.execute(
|
|
286
|
+
"SELECT dirty_generation, materialized_generation FROM graph_materialization_state WHERE id=1"
|
|
287
|
+
).fetchone()
|
|
288
|
+
except Exception as exc: # noqa: BLE001
|
|
289
|
+
return {"skipped": f"state unreadable: {exc}"}
|
|
290
|
+
if not row or int(row[0]) <= int(row[1]):
|
|
291
|
+
return {"skipped": "not dirty"}
|
|
292
|
+
logger.info("graph refresh: inline, before signal derivation")
|
|
293
|
+
try:
|
|
294
|
+
_refresher._rebuild_fn()
|
|
295
|
+
return {"ran": True}
|
|
296
|
+
except WriteGateDeferred as exc:
|
|
297
|
+
_refresher.mark()
|
|
298
|
+
return {"skipped": f"deferred: {exc}"}
|
|
299
|
+
finally:
|
|
300
|
+
# This runs on an asyncio.to_thread worker. Pooled threads are reused;
|
|
301
|
+
# the rebuild route closes its thread-local connection for the same
|
|
302
|
+
# reason, or every call leaks one.
|
|
303
|
+
try:
|
|
304
|
+
from ...core.state import close_thread_db_connection
|
|
305
|
+
|
|
306
|
+
close_thread_db_connection()
|
|
307
|
+
except Exception: # noqa: BLE001 — cleanup must not mask the result
|
|
308
|
+
pass
|
|
309
|
+
|
|
310
|
+
|
|
256
311
|
def mark_graph_dirty() -> None:
|
|
257
312
|
"""Enrichment completed for a source — schedule a debounced graph rebuild."""
|
|
258
313
|
try:
|
|
@@ -893,30 +893,6 @@ async def run_post_canonical_pipeline(
|
|
|
893
893
|
logger.error("[PIPELINE:ENRICHMENT] post-canonical failed: %s", exc, exc_info=True)
|
|
894
894
|
outcome["canonical_enrichment"] = {"errors": [str(exc)]}
|
|
895
895
|
|
|
896
|
-
# Materialise the graph HERE, not only at the end of the pipeline.
|
|
897
|
-
#
|
|
898
|
-
# The entity data lands early -- the entities job writes entities,
|
|
899
|
-
# message_entities and entity_mentions batch by batch -- but the graph
|
|
900
|
-
# a person actually looks at is derived by rebuild_entity_graph, and
|
|
901
|
-
# the only mark was after signal derivation. On a file import that is
|
|
902
|
-
# 13 more stages and hours of model work, so everything landed in the
|
|
903
|
-
# database with no visible change to the graph until the very end.
|
|
904
|
-
#
|
|
905
|
-
# One mark here, one at the end: two rebuilds per import. Deliberately
|
|
906
|
-
# NOT one per job. graph_refresh is single-flight and a mark landing
|
|
907
|
-
# mid-rebuild schedules exactly one follow-up, so marking per job would
|
|
908
|
-
# chain rebuilds back to back for the whole import and take CPU from
|
|
909
|
-
# the model work that is already the slow part.
|
|
910
|
-
try:
|
|
911
|
-
from ..features.entities.graph_refresh import mark_graph_dirty
|
|
912
|
-
|
|
913
|
-
mark_graph_dirty()
|
|
914
|
-
logger.info(
|
|
915
|
-
"[PIPELINE:ENRICHMENT] graph marked dirty after canonical enrichment "
|
|
916
|
-
"so the graph fills before signal derivation runs"
|
|
917
|
-
)
|
|
918
|
-
except Exception as exc: # noqa: BLE001 — refresh must never break ingest
|
|
919
|
-
logger.debug("mid-import graph refresh mark skipped: %s", exc)
|
|
920
896
|
elif canonical_jobs and enrichment_trigger == "manual":
|
|
921
897
|
logger.debug(
|
|
922
898
|
"[PIPELINE:ENRICHMENT] Skipping canonical enrichment (manual trigger): source_id=%s records=%d",
|
|
@@ -930,6 +906,32 @@ async def run_post_canonical_pipeline(
|
|
|
930
906
|
signal_gate_open = (
|
|
931
907
|
enrichment_trigger == "automatic" or force_signal or job_names is not None
|
|
932
908
|
)
|
|
909
|
+
# Fill the graph HERE, before the long phase -- and actually do it.
|
|
910
|
+
#
|
|
911
|
+
# The entity data lands early; the graph a person looks at is derived by
|
|
912
|
+
# rebuild_entity_graph. The first version of this marked the graph dirty
|
|
913
|
+
# after canonical enrichment and left the rebuild to the debounced
|
|
914
|
+
# refresher. Two things defeated it, both measured on a live 20-stage
|
|
915
|
+
# import: the mark sat inside the enrichment guard, so an import with
|
|
916
|
+
# nothing left to enrich never marked at all; and the refresher's timer
|
|
917
|
+
# fires ~90s later, by which time signal derivation has raised its
|
|
918
|
+
# in-flight counter and the refresh re-arms itself until derivation ends
|
|
919
|
+
# -- collapsing into the end-of-pipeline rebuild. Zero mid-import
|
|
920
|
+
# rebuilds, every time.
|
|
921
|
+
#
|
|
922
|
+
# So: mark, then rebuild inline while nothing is deriving. ~7-9 minutes on
|
|
923
|
+
# a 17k-edge node, inside the import, which is the point. Skipped when the
|
|
924
|
+
# graph is not dirty, so a re-import that changed nothing pays nothing.
|
|
925
|
+
if canonical_records:
|
|
926
|
+
try:
|
|
927
|
+
from ..features.entities.graph_refresh import mark_graph_dirty, refresh_now_if_dirty
|
|
928
|
+
|
|
929
|
+
mark_graph_dirty()
|
|
930
|
+
outcome["graph_fill"] = await asyncio.to_thread(refresh_now_if_dirty)
|
|
931
|
+
logger.info("[PIPELINE:GRAPH] mid-import graph fill: %s", outcome["graph_fill"])
|
|
932
|
+
except Exception as exc: # noqa: BLE001 -- the graph must never break ingest
|
|
933
|
+
logger.warning("mid-import graph fill skipped: %s", exc)
|
|
934
|
+
|
|
933
935
|
if run_signal and signal_jobs and not signal_gate_open:
|
|
934
936
|
logger.debug(
|
|
935
937
|
"[PIPELINE:SIGNAL_DERIVE] Skipping signal derivation (manual trigger): source_id=%s records=%d",
|
|
@@ -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
|
|
|
@@ -299,6 +299,7 @@ REASONS = frozenset(
|
|
|
299
299
|
"source_has_live_tools",
|
|
300
300
|
"source_ref",
|
|
301
301
|
"summary_enrichment",
|
|
302
|
+
"world_knowledge_no_retrieval",
|
|
302
303
|
# --- control plane: refusals that never reach the node. The human-readable
|
|
303
304
|
# sentence stays on the response's own `deny_reason`; the ledger carries the code.
|
|
304
305
|
"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
|
|
@@ -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": "stub"
|
|
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.
|