topos-node 1.3.8__tar.gz → 1.3.9__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.8/topos_node.egg-info → topos_node-1.3.9}/PKG-INFO +1 -1
- {topos_node-1.3.8 → topos_node-1.3.9}/pyproject.toml +1 -1
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/__version__.py +2 -2
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/derivation_recovery.py +141 -55
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/pipeline/job_runner.py +32 -2
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/pipeline/job_store.py +23 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/upgrades/manifests.json +24 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/upgrades/runner.py +19 -0
- {topos_node-1.3.8 → topos_node-1.3.9/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.3.8 → topos_node-1.3.9}/LICENSE +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/MANIFEST.in +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/README.md +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/setup.cfg +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/shared/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/shared/filtering.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/shared/schema_registry.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/tests/test_extensions.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/analytics/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/analytics/profiles.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/analytics.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/app_registry.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/backup.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/compute_remote.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/conversation_context.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/data_commit.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/database_explorer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/db.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/device.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/engine_run.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/enrichment.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/filter_lab.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/health.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/home_chat.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/llm.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/local_mcp.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/query_api.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/shell.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/signal.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/source_install.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/source_scrub.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/sources.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/sources_overview.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/sync.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/tool_index.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/ui_config.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/uma_data.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/upgrades.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/usage.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/api/user_identity.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/app.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/auth.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/models.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/cli/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/cli/__main__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/cli/commands.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/cli/tray.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/config/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/config/facts_llm.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/config/model_packs.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/config/settings.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/contacts/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/contacts/identity.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/control_plane_client.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/api_models.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/device_helpers.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/errors.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/events.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/common.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/config.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/device.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/query.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/handlers/uma.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/logging.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/metrics.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/routine_access.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/startup_banner.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/state.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/table_layers.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/core/types.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/disclosure/tier.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/backends/base.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/client.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/engine.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/intake.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/model_cache.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/registration.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/router.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/tasks.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/transport.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/engine/validator.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/url_classification_core.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/url_classification_enrichment_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/canonical/url_classification_signal_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/processor.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment/website_classifier.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/evals/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/extensions.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/edges.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/fact_materializer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/linking.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/reads.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/facts/extract.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/facts/reads.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/facts/store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/lifecycle/blackhole.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/lifecycle/blackhole_guard.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/lifecycle/derived_scrub.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/service.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/stats/engine.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/stats/fold.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/stats/insights.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/triage/badges.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/triage/daily.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/triage/intents.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/filter_lab/service.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/filter_lab/store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/home_chat/schema.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/home_chat/store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/manager.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/progress.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/lineage/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/lineage/provenance.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/lineage/tracker.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/observability/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/observability/alerts.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/observability/metrics.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/observability/tracing.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/openai_client.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/pipeline/audit.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/pipeline/stages.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/projections/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/protocol/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/audit.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/cohort_resolvers.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/ddr.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/disclosure.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/fingerprint.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/game_layer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/grant_cache.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/inference.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/intent.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/manifest.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/minimizer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/negotiation.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/pipeline.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/planner.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/retrieval.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/runtime.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/scope_registry.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/session.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/session_utils.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/source_generation.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/truth_facts.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/types.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/verify.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/query/verify_modes.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/rate_limit.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/routines/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/routines/schema.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/routines/store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/runtime_update.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/scope_resolution.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/container.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/interfaces.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/llm/base.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/llm/openai.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/local.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/services/postgres.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sources/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sources/definitions.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sources/install_service.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sources/registry.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/startup_banner.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/client.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/registry.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/paths.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/schema.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/source_settings.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/storage/user_identity.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sync/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sync/client.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/sync_handlers.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/testing/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/testing/lifespan.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/uma_filters.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/uma_resource_id.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/uma_rpt.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/utils/base_object.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos/websocket_client.py +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos_node.egg-info/SOURCES.txt +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.3.8 → topos_node-1.3.9}/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.9"
|
|
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"
|
|
@@ -240,6 +240,70 @@ def list_pending_derivation_retries(
|
|
|
240
240
|
return out
|
|
241
241
|
|
|
242
242
|
|
|
243
|
+
async def retry_single_derivation(
|
|
244
|
+
conn: sqlite3.Connection,
|
|
245
|
+
*,
|
|
246
|
+
source_id: str,
|
|
247
|
+
sync_batch_id: str,
|
|
248
|
+
job_name: str,
|
|
249
|
+
record_ids: Optional[Sequence[str]] = None,
|
|
250
|
+
) -> Dict[str, Any]:
|
|
251
|
+
"""Re-run exactly one recorded derivation debt.
|
|
252
|
+
|
|
253
|
+
Reloads the debt's canonical records and re-runs ONLY the job that failed,
|
|
254
|
+
so a retry cannot disturb jobs that already succeeded. Jobs are idempotent
|
|
255
|
+
per (batch, job) at the ledger level; a retry that fails again simply leaves
|
|
256
|
+
the debt in place for the next attempt.
|
|
257
|
+
|
|
258
|
+
Returns ``{"outcome": "recovered" | "still_failing" | "skipped", ...}``.
|
|
259
|
+
"skipped" means the debt cannot be re-run mechanically (unknown source, no
|
|
260
|
+
surviving records) — the caller decides whether that discharges it.
|
|
261
|
+
"""
|
|
262
|
+
if not job_name or not source_id:
|
|
263
|
+
return {"outcome": "skipped", "reason": "incomplete record"}
|
|
264
|
+
try:
|
|
265
|
+
from ..ingestion.canonical_pipeline import load_canonical_records_for_signal
|
|
266
|
+
# Reuses reprocess's resolver so a runtime-installed source rehydrates
|
|
267
|
+
# the same way it does for a manual reprocess.
|
|
268
|
+
from ..ingestion.reprocess import _resolve_source_def
|
|
269
|
+
|
|
270
|
+
try:
|
|
271
|
+
source_def = _resolve_source_def(source_id)
|
|
272
|
+
except ValueError:
|
|
273
|
+
return {"outcome": "skipped", "reason": "unknown source"}
|
|
274
|
+
records = load_canonical_records_for_signal(conn, source_def)
|
|
275
|
+
wanted = {str(r) for r in (record_ids or []) if r}
|
|
276
|
+
if wanted:
|
|
277
|
+
scoped = [
|
|
278
|
+
r
|
|
279
|
+
for r in records
|
|
280
|
+
if str(r.get("message_id") or r.get("record_id") or "") in wanted
|
|
281
|
+
]
|
|
282
|
+
records = scoped or records
|
|
283
|
+
if not records:
|
|
284
|
+
return {"outcome": "skipped", "reason": "no records"}
|
|
285
|
+
|
|
286
|
+
from .orchestrator import SignalDerivationOrchestrator
|
|
287
|
+
|
|
288
|
+
result = await SignalDerivationOrchestrator().run_signal_derivation(
|
|
289
|
+
records, source_id, job_names=[job_name], sync_batch_id=sync_batch_id
|
|
290
|
+
)
|
|
291
|
+
if result.get("errors"):
|
|
292
|
+
return {
|
|
293
|
+
"outcome": "still_failing",
|
|
294
|
+
"error": result["errors"][0].get("error"),
|
|
295
|
+
}
|
|
296
|
+
# run_signal_derivation clears the debt itself on success.
|
|
297
|
+
return {
|
|
298
|
+
"outcome": "recovered",
|
|
299
|
+
"records": len(records),
|
|
300
|
+
"created": result.get("records_created", {}).get(job_name, 0),
|
|
301
|
+
}
|
|
302
|
+
except Exception as exc: # noqa: BLE001 — one bad debt must not stop the rest
|
|
303
|
+
logger.warning("[DERIVE:RETRY] retry failed job=%s source=%s: %s", job_name, source_id, exc)
|
|
304
|
+
return {"outcome": "still_failing", "error": str(exc)}
|
|
305
|
+
|
|
306
|
+
|
|
243
307
|
async def retry_pending_derivations(
|
|
244
308
|
conn: Optional[sqlite3.Connection] = None,
|
|
245
309
|
*,
|
|
@@ -249,11 +313,6 @@ async def retry_pending_derivations(
|
|
|
249
313
|
) -> Dict[str, Any]:
|
|
250
314
|
"""Re-run derivation jobs that previously failed, clearing settled debts.
|
|
251
315
|
|
|
252
|
-
Reloads each debt's canonical records and re-runs ONLY the job that failed,
|
|
253
|
-
so a retry cannot disturb jobs that already succeeded. Jobs are idempotent
|
|
254
|
-
per (batch, job) at the ledger level; a retry that fails again simply leaves
|
|
255
|
-
the debt in place for the next attempt.
|
|
256
|
-
|
|
257
316
|
``dry_run`` reports what would run without touching anything.
|
|
258
317
|
"""
|
|
259
318
|
from ..core.state import get_db_connection
|
|
@@ -278,61 +337,27 @@ async def retry_pending_derivations(
|
|
|
278
337
|
]
|
|
279
338
|
return outcome
|
|
280
339
|
|
|
281
|
-
from ..ingestion.canonical_pipeline import load_canonical_records_for_signal
|
|
282
|
-
# Reuses reprocess's resolver so a runtime-installed source rehydrates the
|
|
283
|
-
# same way it does for a manual reprocess.
|
|
284
|
-
from ..ingestion.reprocess import _resolve_source_def
|
|
285
|
-
|
|
286
340
|
for debt in pending:
|
|
287
341
|
job_name = debt["job_name"]
|
|
288
342
|
src = debt["source_id"]
|
|
289
343
|
batch = debt["sync_batch_id"]
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
wanted = set(debt.get("record_ids") or [])
|
|
301
|
-
if wanted:
|
|
302
|
-
scoped = [
|
|
303
|
-
r
|
|
304
|
-
for r in records
|
|
305
|
-
if str(r.get("message_id") or r.get("record_id") or "") in wanted
|
|
306
|
-
]
|
|
307
|
-
records = scoped or records
|
|
308
|
-
if not records:
|
|
309
|
-
outcome["skipped"].append({"job_name": job_name, "source_id": src, "reason": "no records"})
|
|
310
|
-
continue
|
|
311
|
-
|
|
312
|
-
from .orchestrator import SignalDerivationOrchestrator
|
|
313
|
-
|
|
344
|
+
result = await retry_single_derivation(
|
|
345
|
+
conn,
|
|
346
|
+
source_id=src,
|
|
347
|
+
sync_batch_id=batch,
|
|
348
|
+
job_name=job_name,
|
|
349
|
+
record_ids=debt.get("record_ids") or [],
|
|
350
|
+
)
|
|
351
|
+
kind = result.pop("outcome")
|
|
352
|
+
entry = {"job_name": job_name, "source_id": src, **result}
|
|
353
|
+
if kind == "recovered":
|
|
314
354
|
outcome["attempted"] += 1
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
)
|
|
322
|
-
else:
|
|
323
|
-
# run_signal_derivation clears the debt itself on success.
|
|
324
|
-
outcome["recovered"].append(
|
|
325
|
-
{
|
|
326
|
-
"job_name": job_name,
|
|
327
|
-
"source_id": src,
|
|
328
|
-
"batch": batch,
|
|
329
|
-
"records": len(records),
|
|
330
|
-
"created": result.get("records_created", {}).get(job_name, 0),
|
|
331
|
-
}
|
|
332
|
-
)
|
|
333
|
-
except Exception as exc: # noqa: BLE001 — one bad debt must not stop the rest
|
|
334
|
-
logger.warning("[DERIVE:RETRY] retry failed job=%s source=%s: %s", job_name, src, exc)
|
|
335
|
-
outcome["still_failing"].append({"job_name": job_name, "source_id": src, "error": str(exc)})
|
|
355
|
+
outcome["recovered"].append({**entry, "batch": batch})
|
|
356
|
+
elif kind == "still_failing":
|
|
357
|
+
outcome["attempted"] += 1
|
|
358
|
+
outcome["still_failing"].append(entry)
|
|
359
|
+
else:
|
|
360
|
+
outcome["skipped"].append(entry)
|
|
336
361
|
|
|
337
362
|
outcome["pending_after"] = len(list_pending_derivation_retries(conn, source_id=source_id, limit=1000))
|
|
338
363
|
logger.info(
|
|
@@ -344,6 +369,67 @@ async def retry_pending_derivations(
|
|
|
344
369
|
return outcome
|
|
345
370
|
|
|
346
371
|
|
|
372
|
+
#: How long a worker-claimed retry waits for an active derivation batch to end
|
|
373
|
+
#: before handing the job back to the queue. Debts are recorded MID-batch, and
|
|
374
|
+
#: the worker claims within its poll interval — re-running immediately would
|
|
375
|
+
#: re-contend for the same write gate that produced the original "database is
|
|
376
|
+
#: locked". The wait doubles as the requeue backoff: while a long batch runs,
|
|
377
|
+
#: the worker cycles claim → wait → requeue at this period instead of spinning.
|
|
378
|
+
_IN_FLIGHT_WAIT_SECONDS = 30.0
|
|
379
|
+
_IN_FLIGHT_POLL_SECONDS = 0.5
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
async def run_derivation_retry_job(payload: Dict[str, Any]) -> Dict[str, Any]:
|
|
383
|
+
"""Worker executor for ``SIGNAL_DERIVE_RETRY_KIND`` pipeline jobs.
|
|
384
|
+
|
|
385
|
+
This is the "by the worker" half of the module contract: the debt record IS
|
|
386
|
+
the queue row, so the worker claims it and re-runs the one derivation it
|
|
387
|
+
describes. Success marks the row done (the orchestrator clears the debt,
|
|
388
|
+
then the worker completes the job). A retry that fails again returns an
|
|
389
|
+
error status, parking the row 'failed' — still visible in every debt
|
|
390
|
+
listing, re-queued by the next organic failure of the same (batch, job), and
|
|
391
|
+
re-runnable via ``POST /signal/derivation-debt/retry``. One claim is one
|
|
392
|
+
attempt; nothing here loops.
|
|
393
|
+
"""
|
|
394
|
+
import asyncio
|
|
395
|
+
|
|
396
|
+
from .pipeline_activity import is_derivation_in_flight
|
|
397
|
+
|
|
398
|
+
waited = 0.0
|
|
399
|
+
while is_derivation_in_flight():
|
|
400
|
+
if waited >= _IN_FLIGHT_WAIT_SECONDS:
|
|
401
|
+
return {"status": "requeue", "reason": "derivation in flight"}
|
|
402
|
+
await asyncio.sleep(_IN_FLIGHT_POLL_SECONDS)
|
|
403
|
+
waited += _IN_FLIGHT_POLL_SECONDS
|
|
404
|
+
|
|
405
|
+
from ..core.state import get_db_connection
|
|
406
|
+
|
|
407
|
+
conn = get_db_connection()
|
|
408
|
+
if conn is None:
|
|
409
|
+
return {"status": "error", "error": "no database connection"}
|
|
410
|
+
|
|
411
|
+
job_name = str(payload.get("job_name") or "")
|
|
412
|
+
result = await retry_single_derivation(
|
|
413
|
+
conn,
|
|
414
|
+
source_id=str(payload.get("source_id") or ""),
|
|
415
|
+
sync_batch_id=str(payload.get("sync_batch_id") or "unknown"),
|
|
416
|
+
job_name=job_name,
|
|
417
|
+
record_ids=payload.get("record_ids") or [],
|
|
418
|
+
)
|
|
419
|
+
outcome = result.pop("outcome")
|
|
420
|
+
if outcome == "recovered":
|
|
421
|
+
return {
|
|
422
|
+
"status": "ok",
|
|
423
|
+
"records_created": {job_name: result.get("created", 0)},
|
|
424
|
+
**result,
|
|
425
|
+
}
|
|
426
|
+
if outcome == "skipped":
|
|
427
|
+
# A debt that cannot be re-run is still recorded data loss. Failing the
|
|
428
|
+
# job keeps it visible for a human instead of silently discharging it.
|
|
429
|
+
return {"status": "error", "error": f"cannot retry: {result.get('reason')}"}
|
|
430
|
+
return {"status": "error", "error": str(result.get("error") or "retry failed")}
|
|
431
|
+
|
|
432
|
+
|
|
347
433
|
def pending_derivation_summary(conn: Optional[sqlite3.Connection]) -> Dict[str, Any]:
|
|
348
434
|
"""What derived data this node KNOWS it is missing, and since when it knew.
|
|
349
435
|
|
|
@@ -11,6 +11,8 @@ import uuid
|
|
|
11
11
|
from typing import Any, Awaitable, Callable, Dict, Optional
|
|
12
12
|
|
|
13
13
|
from ..storage.db.write_gate import is_busy_error
|
|
14
|
+
# Safe at import time: derivation_recovery has no module-level heavy imports.
|
|
15
|
+
from ..enrichment.derivation_recovery import SIGNAL_DERIVE_RETRY_KIND
|
|
14
16
|
from .job_store import (
|
|
15
17
|
claim_matching_queued_jobs,
|
|
16
18
|
claim_next_job,
|
|
@@ -18,6 +20,7 @@ from .job_store import (
|
|
|
18
20
|
fail_job,
|
|
19
21
|
recover_stale_jobs,
|
|
20
22
|
record_derivation_completion,
|
|
23
|
+
requeue_job,
|
|
21
24
|
update_job_progress,
|
|
22
25
|
)
|
|
23
26
|
|
|
@@ -167,14 +170,29 @@ async def _execute_topic_consolidation(payload: Dict[str, Any]) -> Dict[str, Any
|
|
|
167
170
|
return {"status": "ok", "result": result}
|
|
168
171
|
|
|
169
172
|
|
|
173
|
+
async def _execute_signal_derive_retry(payload: Dict[str, Any]) -> Dict[str, Any]:
|
|
174
|
+
from ..enrichment.derivation_recovery import run_derivation_retry_job
|
|
175
|
+
|
|
176
|
+
return await run_derivation_retry_job(payload)
|
|
177
|
+
|
|
178
|
+
|
|
170
179
|
EXECUTORS: Dict[str, ExecutorFn] = {
|
|
171
180
|
"inbox_deferred_enrichment": _execute_inbox_deferred_enrichment,
|
|
172
181
|
"file_ingestion": _execute_file_ingestion,
|
|
173
182
|
"enrichment_process_source": _execute_enrichment_process_source,
|
|
174
183
|
"topic_consolidation": _execute_topic_consolidation,
|
|
184
|
+
SIGNAL_DERIVE_RETRY_KIND: _execute_signal_derive_retry,
|
|
175
185
|
}
|
|
176
186
|
|
|
177
187
|
|
|
188
|
+
def _executable_kinds() -> list[str]:
|
|
189
|
+
"""Kinds this worker may claim. Computed per claim so tests that patch
|
|
190
|
+
EXECUTORS are honored. A queued row of any other kind (e.g. written by a
|
|
191
|
+
newer node version) stays queued and visible instead of being claimed and
|
|
192
|
+
immediately failed as unknown."""
|
|
193
|
+
return sorted(EXECUTORS)
|
|
194
|
+
|
|
195
|
+
|
|
178
196
|
#: Upper bound on inbox jobs merged into one derive batch. A CP backlog after
|
|
179
197
|
#: downtime arrives as one job per delivery (usually one record each); merging
|
|
180
198
|
#: them runs the per-batch jobs (dimension briefs, topic work) once instead of
|
|
@@ -277,6 +295,18 @@ async def process_job(conn_factory: Callable[[], Any], job: Dict[str, Any]) -> N
|
|
|
277
295
|
await _run_db(conn_factory, _mark_crashed)
|
|
278
296
|
return
|
|
279
297
|
|
|
298
|
+
if str(result.get("status") or "ok") == "requeue":
|
|
299
|
+
# The executor declined to run right now (e.g. a derivation batch holds
|
|
300
|
+
# the write gate). Hand the claim back untouched — this is a deferral,
|
|
301
|
+
# not an attempt, so the row must not read as failed and must not burn
|
|
302
|
+
# a retry.
|
|
303
|
+
def _requeue(own: Any) -> None:
|
|
304
|
+
for entry in jobs:
|
|
305
|
+
requeue_job(own, str(entry["job_id"]))
|
|
306
|
+
|
|
307
|
+
await _run_db(conn_factory, _requeue)
|
|
308
|
+
return
|
|
309
|
+
|
|
280
310
|
if str(result.get("status") or "ok") == "error":
|
|
281
311
|
error = str(result.get("error") or result.get("message") or "failed")
|
|
282
312
|
|
|
@@ -345,7 +375,7 @@ async def _worker_loop(conn_factory: Callable[[], Any]) -> None:
|
|
|
345
375
|
own = conn_factory()
|
|
346
376
|
if own is None:
|
|
347
377
|
return None
|
|
348
|
-
return claim_next_job(own, lease_owner=_lease_owner)
|
|
378
|
+
return claim_next_job(own, lease_owner=_lease_owner, kinds=_executable_kinds())
|
|
349
379
|
|
|
350
380
|
job = await asyncio.to_thread(_claim)
|
|
351
381
|
if job is None:
|
|
@@ -409,7 +439,7 @@ async def process_pending_jobs_once(conn_factory: Callable[[], Any], *, limit: i
|
|
|
409
439
|
own = conn_factory()
|
|
410
440
|
if own is None:
|
|
411
441
|
return None
|
|
412
|
-
return claim_next_job(own, lease_owner=_lease_owner)
|
|
442
|
+
return claim_next_job(own, lease_owner=_lease_owner, kinds=_executable_kinds())
|
|
413
443
|
|
|
414
444
|
for _ in range(max(1, int(limit))):
|
|
415
445
|
job = await asyncio.to_thread(_claim)
|
|
@@ -273,6 +273,29 @@ def fail_job(
|
|
|
273
273
|
commit_connection(conn)
|
|
274
274
|
|
|
275
275
|
|
|
276
|
+
def requeue_job(conn: sqlite3.Connection, job_id: str) -> None:
|
|
277
|
+
"""Return a claimed job to the queue without recording an attempt.
|
|
278
|
+
|
|
279
|
+
For executors that decline to run right now (e.g. a derivation batch is in
|
|
280
|
+
flight). Unlike ``fail_job`` the row goes back to 'queued', so nothing
|
|
281
|
+
downstream reads a deferral as a failure. Guarded on status='running' so a
|
|
282
|
+
job that was settled out-of-band while claimed (``clear_derivation_retry``
|
|
283
|
+
marks the row 'done' when a later batch succeeds) is not resurrected.
|
|
284
|
+
"""
|
|
285
|
+
ensure_pipeline_jobs_schema(conn)
|
|
286
|
+
with with_db_write():
|
|
287
|
+
conn.execute(
|
|
288
|
+
"""
|
|
289
|
+
UPDATE pipeline_jobs
|
|
290
|
+
SET status='queued', lease_owner=NULL, lease_expires_at=NULL,
|
|
291
|
+
updated_at=datetime('now')
|
|
292
|
+
WHERE job_id=? AND status='running'
|
|
293
|
+
""",
|
|
294
|
+
(job_id,),
|
|
295
|
+
)
|
|
296
|
+
commit_connection(conn)
|
|
297
|
+
|
|
298
|
+
|
|
276
299
|
def recover_stale_jobs(conn: sqlite3.Connection) -> int:
|
|
277
300
|
"""Reset expired or orphaned running jobs to queued."""
|
|
278
301
|
ensure_pipeline_jobs_schema(conn)
|
|
@@ -212,6 +212,30 @@
|
|
|
212
212
|
"Worker-thread write offload + statistics txn hygiene close the database-is-locked / event-loop-stall class that hit repeat ingests after 1.3.7."
|
|
213
213
|
]
|
|
214
214
|
},
|
|
215
|
+
{
|
|
216
|
+
"version": "1.3.9",
|
|
217
|
+
"summary": "Derivation-retry repair: the signal_derive_retry executor was never registered, so every recorded derivation debt was claimed and failed as an unknown job kind \u2014 the retry meant to repair a lost derivation destroyed the record of it instead. The executor is wired, workers claim only kinds they can execute, and an executor may requeue rather than read as failed. One consent:auto step sweeps debt already parked 'failed', which nothing else would re-queue. Also: public_bio:read / work_context:read gain test cover for the restored profile_records lane, and just harness-gate scores answer quality against a ratcheting floor instead of a 70/70 bar it cannot reach on a signal-less seed DB. No schema change.",
|
|
218
|
+
"steps": [
|
|
219
|
+
{
|
|
220
|
+
"id": "retry-recorded-derivation-debt",
|
|
221
|
+
"kind": "engine_endpoint",
|
|
222
|
+
"title": "Re-run derivation debt that was failed as an unknown job kind",
|
|
223
|
+
"why": "record_failed_derivation() has enqueued pipeline rows of kind 'signal_derive_retry' since 1.3.x, but no executor was ever registered for that kind, so the worker claimed each row and immediately failed it with 'Unknown job kind: signal_derive_retry'. The debt record IS the queue row, so the retry meant to repair a lost derivation destroyed the record of it instead \u2014 nodes carry silent derivation gaps with a 'failed' row and nothing pointing at them. The executor is registered as of this release, but that does not revive the existing rows: a failed row is only re-queued by the next organic failure of the same (batch, job), and recover_stale_jobs resets 'running' rows, never 'failed' ones. This step sweeps them once on upgrade so the repair happens without an operator remembering to POST /v1/signal/derivation-debt/retry.",
|
|
224
|
+
"params": {
|
|
225
|
+
"method": "POST",
|
|
226
|
+
"path": "/v1/signal/derivation-debt/retry",
|
|
227
|
+
"limit": 200
|
|
228
|
+
},
|
|
229
|
+
"consent": "auto",
|
|
230
|
+
"cost": "no LLM, no network; re-runs only the derivations already recorded as lost",
|
|
231
|
+
"progress": "synchronous; response is the attempted/recovered/still_failing report",
|
|
232
|
+
"idempotent": "re-running is a no-op once pending is empty; a debt that fails again is left 'failed' and still listed",
|
|
233
|
+
"estimated_duration": "seconds on a node with no debt (the common case); proportional to recorded debt otherwise",
|
|
234
|
+
"order": 1
|
|
235
|
+
}
|
|
236
|
+
],
|
|
237
|
+
"notes": []
|
|
238
|
+
},
|
|
215
239
|
{
|
|
216
240
|
"version": "unreleased",
|
|
217
241
|
"summary": "Staging entry for in-flight PRs. cut_release.py stamps this with the next version at release cut. Never executed by steps_between.",
|
|
@@ -376,6 +376,25 @@ def _exec_engine_endpoint(step: Dict[str, Any], conn: sqlite3.Connection) -> Dic
|
|
|
376
376
|
from ..features.entities.rebuild_subprocess import run_graph_rebuild
|
|
377
377
|
|
|
378
378
|
return dict(run_graph_rebuild(conn))
|
|
379
|
+
if path == "/v1/signal/derivation-debt/retry":
|
|
380
|
+
# Recorded debt is not self-healing: a failed row is only re-queued by
|
|
381
|
+
# the next organic failure of the same (batch, job), and recover_stale_jobs
|
|
382
|
+
# resets 'running' rows, never 'failed' ones. So a node that recorded debt
|
|
383
|
+
# while its executor was missing keeps the gap until something sweeps it.
|
|
384
|
+
import asyncio
|
|
385
|
+
|
|
386
|
+
from ..enrichment.derivation_recovery import retry_pending_derivations
|
|
387
|
+
|
|
388
|
+
params = step.get("params") or {}
|
|
389
|
+
return dict(
|
|
390
|
+
asyncio.run(
|
|
391
|
+
retry_pending_derivations(
|
|
392
|
+
conn,
|
|
393
|
+
source_id=params.get("source_id"),
|
|
394
|
+
limit=int(params.get("limit") or 200),
|
|
395
|
+
)
|
|
396
|
+
)
|
|
397
|
+
)
|
|
379
398
|
raise ValueError(f"no internal dispatch for endpoint step: {path!r}")
|
|
380
399
|
|
|
381
400
|
|
|
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
|
|
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
|
{topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/browser_activity_mapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/github_activity_mapper.py
RENAMED
|
File without changes
|
{topos_node-1.3.8 → topos_node-1.3.9}/topos/canonicalization/mappers/google_calendar_mapper.py
RENAMED
|
File without changes
|
|
File without changes
|