topos-node 1.3.41__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.41/topos_node.egg-info → topos_node-1.3.42}/PKG-INFO +1 -1
- {topos_node-1.3.41 → topos_node-1.3.42}/pyproject.toml +1 -1
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/__version__.py +2 -2
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/protocol/narrowing_vocabulary.json +2 -1
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/game_layer.py +69 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/narrowing.py +1 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/pipeline.py +22 -2
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_registry.json +129 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/bundled_canonical_triples.py +37 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/install_service.py +86 -4
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/upgrades/manifests.json +6 -0
- {topos_node-1.3.41 → topos_node-1.3.42/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.3.41 → topos_node-1.3.42}/LICENSE +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/MANIFEST.in +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/README.md +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/setup.cfg +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/shared/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/shared/filtering.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/shared/schema_registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_extensions.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_profiles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/dataset_resolution.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/luck_surface.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/messenger_directed.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/person_graph.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/person_overlay.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/profiles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/relationship_reads.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/analytics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/app_registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/backup.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/compute_remote.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/connected_apps.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/conversation_context.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/data_commit.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/database_explorer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/db.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/device.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/disk_space_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/engine_run.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/enrichment.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/filter_lab.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/health.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/home_chat.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/llm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/local_mcp.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/query_api.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/shell.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/signal.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/source_install.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/source_scrub.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/sources.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/sources_overview.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/sync.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/tool_index.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/ui_config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/uma_data.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/upgrades.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/usage.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/user_identity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/app.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/auth.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/declared_field_map.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/models.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/__main__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/commands.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/tray.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/facts_llm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/model_packs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/settings.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/contacts/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/contacts/identity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/control_plane_client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/api_models.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/db_health.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/device_helpers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/errors.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/events.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/common.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/config.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/device.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/graph_summary.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/mcp_client_elevations.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/mcp_clients.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/query.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/uma.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/logging.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/metrics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/routine_access.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/startup_banner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/state.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/table_layers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/types.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/defaults.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/tier.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/disk_space.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/engine.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/hosted_llm_wallet.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/intake.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/model_cache.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/model_manager.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/ollama_runtime.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/registration.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/router.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/tasks.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/transport.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/validator.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/processor.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/record_progress.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/evals/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/extensions.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/kernels.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/net_subject_policy.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/person_bridge.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/router.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/social_bench.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/social_kernels.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/surfaces.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/template.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/writer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/chatgpt_declared.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/edges.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/fact_materializer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/linking.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/owner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/reads.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/structured_fields.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/extract.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/reads.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/blackhole.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_guard.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/derived_scrub.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/conversation_windows.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/derived_index.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/service.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/stats/engine.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/stats/fold.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/stats/insights.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/badges.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/daily.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/intents.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/service.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/home_chat/schema.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/home_chat/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/local_exports.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/manager.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_export.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/progress.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/lineage/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/lineage/provenance.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/lineage/tracker.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/mcp_clients.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/observability/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/observability/alerts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/observability/metrics.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/observability/tracing.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/openai_client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/owner_key.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/audit.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/job_runner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/stages.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/principal.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/profiles.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/projections/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/protocol/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/audit.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/closeness.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/cohort_resolvers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/collaborators.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/ddr.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/disclosure.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/entity_window.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/exclusion.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/facts_direct.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/fingerprint.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/grant_cache.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/inference.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/intent.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/manifest.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/minimizer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/negotiation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/planner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/retrieval.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/runtime.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_head.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/session.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/session_utils.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/source_generation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/truth_facts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/types.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/verify.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/verify_modes.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/rate_limit.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/relay_stamp.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/routines/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/routines/schema.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/routines/store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/runtime_update.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/scope_resolution.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/container.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/interfaces.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/llm/base.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/llm/openai.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/local.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/postgres.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/definitions.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/startup_banner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/backup_custody.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/registry.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/paths.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/schema.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/derived_row_identity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/source_settings.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/user_identity.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sync/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sync/client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/sync_handlers.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/testing/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/testing/lifespan.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/uds.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/uma_filters.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/uma_resource_id.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/uma_rpt.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/upgrades/runner.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/utils/base_object.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos/websocket_client.py +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos_node.egg-info/SOURCES.txt +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.3.41 → topos_node-1.3.42}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.3.41 → 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"
|
|
@@ -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.
|
|
@@ -8,7 +8,7 @@ import uuid
|
|
|
8
8
|
from contextlib import contextmanager
|
|
9
9
|
from dataclasses import dataclass
|
|
10
10
|
from datetime import datetime, timezone
|
|
11
|
-
from typing import Any, Dict, Iterator, List, Optional, Tuple
|
|
11
|
+
from typing import Any, Dict, Iterator, List, Optional, Set, Tuple
|
|
12
12
|
|
|
13
13
|
from ..config.settings import settings
|
|
14
14
|
from ..core.state import get_db_connection
|
|
@@ -16,7 +16,7 @@ from ..enrichment.jobs import CANONICAL_JOBS, RAW_JOBS
|
|
|
16
16
|
from ..ingestion.parsers import PARSER_REGISTRY
|
|
17
17
|
from ..storage.db.postgres import connect_postgres, execute_query, fetch_all, fetch_one
|
|
18
18
|
from ..storage.db.write_gate import commit_connection, with_db_write
|
|
19
|
-
from .bundled_canonical_triples import bundled_lane_conflict
|
|
19
|
+
from .bundled_canonical_triples import bundled_lane_conflict, bundled_schema_drift
|
|
20
20
|
from .runtime_install import RuntimeInstallHandle, install_source_definition
|
|
21
21
|
from .scrub_attribution import scrub_attributed_rows
|
|
22
22
|
|
|
@@ -924,6 +924,68 @@ def _is_rehydratable_source_definition(source_def: Dict[str, Any]) -> bool:
|
|
|
924
924
|
return source_kind_from_payload(source_def) == SOURCE_KIND_INGESTION
|
|
925
925
|
|
|
926
926
|
|
|
927
|
+
# drive_files is gdrive_files republished under a new source id — the runtime
|
|
928
|
+
# definitions are identical except source_id — so an active drive_files install
|
|
929
|
+
# proves a legacy-scope gdrive_files row is retired, not merely missing.
|
|
930
|
+
_LEGACY_SOURCE_SUCCESSORS: Dict[str, str] = {"gdrive_files": "drive_files"}
|
|
931
|
+
|
|
932
|
+
_LEGACY_DATASET_SEGMENT = "default"
|
|
933
|
+
_CANONICAL_DATASET_SEGMENT = "topos"
|
|
934
|
+
|
|
935
|
+
|
|
936
|
+
def _dataset_scope_segment(scope: Dict[str, str]) -> str:
|
|
937
|
+
parts = str(scope.get("dataset_id") or "").split(":")
|
|
938
|
+
return parts[1] if len(parts) == 3 else ""
|
|
939
|
+
|
|
940
|
+
|
|
941
|
+
def _canonical_active_index(records: List[InstallRecord]) -> Set[Tuple[str, str, str]]:
|
|
942
|
+
"""(user_id, topos_id, source_id) for active installs under the canonical
|
|
943
|
+
{owner}:topos:{topos_id} dataset scope."""
|
|
944
|
+
index: Set[Tuple[str, str, str]] = set()
|
|
945
|
+
for rec in records:
|
|
946
|
+
scope = _normalize_scope(rec.scope)
|
|
947
|
+
if _dataset_scope_segment(scope) != _CANONICAL_DATASET_SEGMENT:
|
|
948
|
+
continue
|
|
949
|
+
if scope["user_id"] == "*" or scope["topos_id"] == "*":
|
|
950
|
+
continue
|
|
951
|
+
index.add((scope["user_id"], scope["topos_id"], rec.source_id))
|
|
952
|
+
return index
|
|
953
|
+
|
|
954
|
+
|
|
955
|
+
def _has_bundled_replacement(source_id: str) -> bool:
|
|
956
|
+
"""True when the engine ships a bundled definition for this source_id, so
|
|
957
|
+
retiring its runtime install row leaves the source available."""
|
|
958
|
+
from .registry import BUNDLED_REGISTRY
|
|
959
|
+
|
|
960
|
+
return str(source_id or "").strip() in BUNDLED_REGISTRY
|
|
961
|
+
|
|
962
|
+
|
|
963
|
+
def _legacy_scope_superseded_reason(
|
|
964
|
+
rec: InstallRecord, canonical_active: Set[Tuple[str, str, str]]
|
|
965
|
+
) -> Optional[str]:
|
|
966
|
+
"""Reason to retire an active legacy {owner}:default:{key-hash} scope row, or None.
|
|
967
|
+
|
|
968
|
+
Readers query the canonical {owner}:topos:{topos_id} scope only, so a legacy
|
|
969
|
+
row duplicated there is dead weight — and poison for any reader that ever
|
|
970
|
+
matches the legacy scope, which would see a partial install list. Demote only
|
|
971
|
+
when an active canonical row proves the same install is live for the same
|
|
972
|
+
user+topos, under the same source_id or its declared successor.
|
|
973
|
+
"""
|
|
974
|
+
scope = _normalize_scope(rec.scope)
|
|
975
|
+
if _dataset_scope_segment(scope) != _LEGACY_DATASET_SEGMENT:
|
|
976
|
+
return None
|
|
977
|
+
if scope["user_id"] == "*" or scope["topos_id"] == "*":
|
|
978
|
+
return None
|
|
979
|
+
candidates = [rec.source_id]
|
|
980
|
+
successor = _LEGACY_SOURCE_SUCCESSORS.get(rec.source_id)
|
|
981
|
+
if successor:
|
|
982
|
+
candidates.append(successor)
|
|
983
|
+
for sid in candidates:
|
|
984
|
+
if (scope["user_id"], scope["topos_id"], sid) in canonical_active:
|
|
985
|
+
return f"legacy dataset scope superseded by active canonical-scope install source_id={sid}"
|
|
986
|
+
return None
|
|
987
|
+
|
|
988
|
+
|
|
927
989
|
def _supersede_install(*, scope_key: str, source_id: str, reason: str) -> None:
|
|
928
990
|
"""Retire an active install row that can never install again.
|
|
929
991
|
|
|
@@ -955,12 +1017,22 @@ def rehydrate_active_installs_runtime(*, source_id: Optional[str] = None) -> Dic
|
|
|
955
1017
|
"""
|
|
956
1018
|
ensure_install_schema()
|
|
957
1019
|
records = [rec for rec in list_installs(source_id=source_id) if rec.is_active]
|
|
1020
|
+
# Successor demotion (gdrive_files -> drive_files) must see peers that a
|
|
1021
|
+
# source_id-filtered listing excludes.
|
|
1022
|
+
peers = records if source_id is None else [rec for rec in list_installs() if rec.is_active]
|
|
1023
|
+
canonical_active = _canonical_active_index(peers)
|
|
958
1024
|
rehydrated = 0
|
|
959
1025
|
failed = 0
|
|
960
1026
|
# (scope_key, source_id, reason) for rows retired after the locked pass.
|
|
961
1027
|
superseded: List[Tuple[str, str, str]] = []
|
|
962
1028
|
with _LOCK:
|
|
963
1029
|
for rec in records:
|
|
1030
|
+
# Before contract checks: a legacy-scope duplicate retires even if
|
|
1031
|
+
# its stored definition is stale or incomplete.
|
|
1032
|
+
legacy_reason = _legacy_scope_superseded_reason(rec, canonical_active)
|
|
1033
|
+
if legacy_reason:
|
|
1034
|
+
superseded.append((_scope_key(rec.scope), rec.source_id, legacy_reason))
|
|
1035
|
+
continue
|
|
964
1036
|
source_def = rec.source_definition_json if isinstance(rec.source_definition_json, dict) else {}
|
|
965
1037
|
if not source_def:
|
|
966
1038
|
continue
|
|
@@ -974,9 +1046,13 @@ def rehydrate_active_installs_runtime(*, source_id: Optional[str] = None) -> Dic
|
|
|
974
1046
|
# A runtime install predating the bundled source keeps a lane the
|
|
975
1047
|
# bundled triple contradicts. Retrying it warns on every sources
|
|
976
1048
|
# list; the bundled definition wins, so retire the row instead.
|
|
1049
|
+
# A drift-variant schema (BUNDLED_SCHEMA_ALIASES) retires the same
|
|
1050
|
+
# way only when the engine bundles a replacement for the source_id;
|
|
1051
|
+
# otherwise retiring would orphan a live connector.
|
|
977
1052
|
conflict = bundled_lane_conflict(source_def)
|
|
978
|
-
if conflict
|
|
979
|
-
|
|
1053
|
+
drift = None if conflict else bundled_schema_drift(source_def)
|
|
1054
|
+
if conflict or (drift and _has_bundled_replacement(rec.source_id)):
|
|
1055
|
+
superseded.append((_scope_key(rec.scope), rec.source_id, conflict or drift))
|
|
980
1056
|
continue
|
|
981
1057
|
try:
|
|
982
1058
|
scope_key = _scope_key(rec.scope)
|
|
@@ -992,6 +1068,12 @@ def rehydrate_active_installs_runtime(*, source_id: Optional[str] = None) -> Dic
|
|
|
992
1068
|
runtime_missing = runtime_key not in _ACTIVE_HANDLES or any(parser_id not in PARSER_REGISTRY for parser_id in parser_ids)
|
|
993
1069
|
if not runtime_missing:
|
|
994
1070
|
continue
|
|
1071
|
+
if drift:
|
|
1072
|
+
logger.warning(
|
|
1073
|
+
"Tolerating bundled-schema drift on active install (no bundled replacement): source_id=%s %s",
|
|
1074
|
+
rec.source_id,
|
|
1075
|
+
drift,
|
|
1076
|
+
)
|
|
995
1077
|
_ACTIVE_HANDLES[runtime_key] = install_source_definition(source_def)
|
|
996
1078
|
rehydrated += 1
|
|
997
1079
|
except Exception as exc: # noqa: BLE001
|
|
@@ -757,6 +757,12 @@
|
|
|
757
757
|
"steps": [],
|
|
758
758
|
"notes": []
|
|
759
759
|
},
|
|
760
|
+
{
|
|
761
|
+
"version": "1.3.42",
|
|
762
|
+
"summary": "Release 1.3.42.",
|
|
763
|
+
"steps": [],
|
|
764
|
+
"notes": []
|
|
765
|
+
},
|
|
760
766
|
{
|
|
761
767
|
"version": "unreleased",
|
|
762
768
|
"summary": "Staging entry for in-flight PRs. cut_release.py stamps this with the next version at release cut. Never executed by steps_between.",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|