topos-node 1.0.1__tar.gz → 1.0.2__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.0.1 → topos_node-1.0.2}/PKG-INFO +1 -1
- {topos_node-1.0.1 → topos_node-1.0.2}/pyproject.toml +1 -1
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/__version__.py +2 -2
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/enrichment.py +3 -3
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/config/settings.py +3 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/handlers.py +18 -18
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/logging.py +56 -2
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/disclosure/privacy_layer.py +3 -3
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/backends/huggingface.py +6 -1
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/topic_clusters_job.py +2 -2
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/orchestrator.py +8 -8
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/canonical_pipeline.py +1 -1
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/ingest_helpers.py +7 -7
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/manager.py +5 -5
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/pipeline/envelope.py +1 -1
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/pipeline/stub_enqueue.py +1 -1
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sources/scrub_service.py +1 -1
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/raw/browser_flat_tables.py +3 -3
- {topos_node-1.0.1 → topos_node-1.0.2}/topos_node.egg-info/PKG-INFO +1 -1
- {topos_node-1.0.1 → topos_node-1.0.2}/LICENSE +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/README.md +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/setup.cfg +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/shared/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/shared/filtering.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/shared/schema_registry.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/analytics/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/analytics/profiles.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/analytics.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/app_registry.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/backup.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/compute_remote.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/data_commit.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/database_explorer.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/db.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/device.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/filter_lab.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/health.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/home_chat.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/llm.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/local_mcp.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/query_api.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/signal.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/source_install.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/source_scrub.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/sources.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/sources_overview.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/sync.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/ui_config.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/uma_data.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/usage.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/api/user_identity.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/app.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/auth.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/canonicalization/models.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/cli/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/cli/__main__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/cli/commands.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/config/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/contacts/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/contacts/identity.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/control_plane_client.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/api_models.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/device_helpers.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/errors.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/events.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/metrics.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/routine_access.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/startup_banner.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/state.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/table_layers.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/core/types.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/disclosure/tier.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/backends/base.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/engine.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/intake.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/registration.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/router.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/tasks.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/transport.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/engine/validator.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/url_classification_core.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/url_classification_enrichment_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/url_classification_signal_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/processor.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/enrichment/website_classifier.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/service.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/filter_lab/service.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/filter_lab/store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/home_chat/schema.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/home_chat/store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parser.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/progress.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/lineage/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/lineage/provenance.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/lineage/tracker.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/observability/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/observability/alerts.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/observability/metrics.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/observability/tracing.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/openai_client.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/pipeline/audit.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/pipeline/stages.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/projections/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/audit.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/disclosure.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/fingerprint.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/game_layer.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/inference.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/intent.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/manifest.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/pipeline.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/retrieval.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/runtime.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/session.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/session_utils.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/source_generation.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/query/types.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/rate_limit.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/routines/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/routines/schema.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/routines/store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/runtime_update.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/scope_resolution.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/container.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/interfaces.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/llm/base.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/llm/openai.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/local.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/services/postgres.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sources/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sources/definitions.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sources/install_service.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sources/registry.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/startup_banner.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/client.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/paths.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/schema.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/source_settings.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/storage/user_identity.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sync/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sync/client.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/sync_handlers.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/testing/__init__.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/testing/lifespan.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/uma_filters.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/uma_resource_id.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/uma_rpt.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/utils/base_object.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos/websocket_client.py +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos_node.egg-info/SOURCES.txt +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.0.1 → topos_node-1.0.2}/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.0.
|
|
7
|
+
version = "1.0.2"
|
|
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"
|
|
@@ -94,7 +94,7 @@ async def _backfill_browser_visits_url_classification(
|
|
|
94
94
|
)
|
|
95
95
|
from ..sources.registry import BROWSER_VISITS
|
|
96
96
|
|
|
97
|
-
logger.
|
|
97
|
+
logger.debug(
|
|
98
98
|
"[PIPELINE:SIGNAL_DERIVE] Browser visits backfill from activity_events only_missing=%s limit=%s",
|
|
99
99
|
only_missing,
|
|
100
100
|
limit,
|
|
@@ -175,7 +175,7 @@ async def _backfill_browser_visits_url_classification(
|
|
|
175
175
|
"rows_failed": failed,
|
|
176
176
|
"errors": (derive_result.get("errors") or [])[:100],
|
|
177
177
|
}
|
|
178
|
-
logger.
|
|
178
|
+
logger.debug(
|
|
179
179
|
"[PIPELINE:SIGNAL_DERIVE] Browser visits backfill complete: scanned=%d processed=%d skipped=%d failed=%d",
|
|
180
180
|
summary["rows_scanned"],
|
|
181
181
|
summary["rows_processed"],
|
|
@@ -549,7 +549,7 @@ async def _process_enrichment_core(
|
|
|
549
549
|
tables_manager = DerivedTablesManager(conn=db_conn)
|
|
550
550
|
orchestrator = EnrichmentOrchestrator(tables_manager=tables_manager)
|
|
551
551
|
|
|
552
|
-
logger.
|
|
552
|
+
logger.debug(
|
|
553
553
|
"[PIPELINE:ENRICHMENT] %s: Manual enrichment triggered: source_id=%s, messages=%d, jobs=%s",
|
|
554
554
|
orchestrator,
|
|
555
555
|
source_id,
|
|
@@ -8,6 +8,9 @@ from typing import List, Optional
|
|
|
8
8
|
from pydantic import Field, model_validator
|
|
9
9
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
10
10
|
|
|
11
|
+
# Set before any huggingface_hub import during app/route loading.
|
|
12
|
+
os.environ.setdefault("HF_HUB_DISABLE_PROGRESS_BARS", "1")
|
|
13
|
+
|
|
11
14
|
|
|
12
15
|
DEFAULT_TOPOS_CONTROL_PLANE_URL = "wss://cp.logu3s.com/ws/engine"
|
|
13
16
|
|
|
@@ -171,7 +171,7 @@ def _uma_transform_progress_hook(req_id: str, stage_label: str):
|
|
|
171
171
|
return
|
|
172
172
|
state["bucket"] = bucket
|
|
173
173
|
filter_text = f" filter={current_filter}" if current_filter else ""
|
|
174
|
-
logger.
|
|
174
|
+
logger.debug(
|
|
175
175
|
"[PIPELINE:UMA][TRANSFORM] req=%s stage=%s%s %s %s%% (%s/%s)",
|
|
176
176
|
req_id,
|
|
177
177
|
stage_label,
|
|
@@ -2118,7 +2118,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
2118
2118
|
if not existing_user_id:
|
|
2119
2119
|
# Engine started but no user_id yet - link to authenticated user
|
|
2120
2120
|
store_user_id(conn, auth_user_id)
|
|
2121
|
-
logger.
|
|
2121
|
+
logger.debug(
|
|
2122
2122
|
"[PIPELINE:CONNECTION] Engine had no user_id. Stored auth user_id=%s from control plane. "
|
|
2123
2123
|
"Engine is now linked to authenticated user.",
|
|
2124
2124
|
auth_user_id[:8] if auth_user_id else None,
|
|
@@ -4178,7 +4178,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
4178
4178
|
if not enrichment_name:
|
|
4179
4179
|
return {"id": req_id, "status": "error", "error": "enrichment_name required"}
|
|
4180
4180
|
try:
|
|
4181
|
-
logger.
|
|
4181
|
+
logger.debug(
|
|
4182
4182
|
"[PIPELINE:ENRICHMENT] source_enrichment_backfill received: source_id=%s enrichment=%s only_missing=%s limit=%s",
|
|
4183
4183
|
source_id,
|
|
4184
4184
|
enrichment_name,
|
|
@@ -4193,7 +4193,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
4193
4193
|
only_missing=bool(only_missing),
|
|
4194
4194
|
limit=limit,
|
|
4195
4195
|
)
|
|
4196
|
-
logger.
|
|
4196
|
+
logger.debug(
|
|
4197
4197
|
"[PIPELINE:ENRICHMENT] source_enrichment_backfill complete: source_id=%s enrichment=%s rows_scanned=%s rows_processed=%s rows_failed=%s",
|
|
4198
4198
|
source_id,
|
|
4199
4199
|
enrichment_name,
|
|
@@ -4215,7 +4215,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
4215
4215
|
if not enrichment_name:
|
|
4216
4216
|
return {"id": req_id, "status": "error", "error": "enrichment_name required"}
|
|
4217
4217
|
try:
|
|
4218
|
-
logger.
|
|
4218
|
+
logger.debug(
|
|
4219
4219
|
"[PIPELINE:ENRICHMENT] source_enrichment_test received: source_id=%s enrichment=%s",
|
|
4220
4220
|
source_id,
|
|
4221
4221
|
enrichment_name,
|
|
@@ -5359,7 +5359,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
5359
5359
|
requesting_app_id = (payload.get("requesting_app_id") or "").strip() or None
|
|
5360
5360
|
requesting_app_name = (payload.get("requesting_app_name") or "").strip() or None
|
|
5361
5361
|
app_display = requesting_app_name or requesting_app_id or "(unknown app)"
|
|
5362
|
-
logger.
|
|
5362
|
+
logger.debug(
|
|
5363
5363
|
"[PIPELINE:UMA] uma_get_messages: message_stream=%s, resource_id=%s, dataset_id=%s, limit=%s, offset=%s, requesting_user_email=%s, requesting_app=%s",
|
|
5364
5364
|
message_stream,
|
|
5365
5365
|
resource_id[:50] if resource_id else None,
|
|
@@ -5502,12 +5502,12 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
5502
5502
|
pre_name_rows = sum(1 for row in after_contact if row.get("sender_display_name"))
|
|
5503
5503
|
manifest_for_generic = strip_contact_runtime_filters(filter_manifest)
|
|
5504
5504
|
transform_diag: Dict[str, Any] = {}
|
|
5505
|
-
logger.
|
|
5505
|
+
logger.debug(
|
|
5506
5506
|
"[PIPELINE:UMA][TRANSFORM] req=%s stage=conversation_messages start rows=%s",
|
|
5507
5507
|
req_id,
|
|
5508
5508
|
len(after_contact),
|
|
5509
5509
|
)
|
|
5510
|
-
logger.
|
|
5510
|
+
logger.debug(
|
|
5511
5511
|
"[PIPELINE:UMA] contact names: contacts_resolve=%s names_effective=%s "
|
|
5512
5512
|
"sender_display_name_rows_after_pipeline=%s allowed_scopes=%s",
|
|
5513
5513
|
contacts_resolve,
|
|
@@ -5523,7 +5523,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
5523
5523
|
diagnostics=transform_diag,
|
|
5524
5524
|
progress_hook=_uma_transform_progress_hook(req_id, "conversation_messages"),
|
|
5525
5525
|
)
|
|
5526
|
-
logger.
|
|
5526
|
+
logger.debug(
|
|
5527
5527
|
"[PIPELINE:UMA][TRANSFORM] req=%s stage=conversation_messages done applied=%s skipped=%s reasons=%s",
|
|
5528
5528
|
req_id,
|
|
5529
5529
|
transform_diag.get("applied_count", 0),
|
|
@@ -5532,7 +5532,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
5532
5532
|
)
|
|
5533
5533
|
_skip_reasons = transform_diag.get("skip_reasons") or {}
|
|
5534
5534
|
if _skip_reasons.get("table_mismatch"):
|
|
5535
|
-
logger.
|
|
5535
|
+
logger.debug(
|
|
5536
5536
|
"[PIPELINE:UMA] req=%s table_mismatch skips=%s are expected when field_transforms "
|
|
5537
5537
|
"include other tables (browser_visits, etc.) while processing conversation_messages.",
|
|
5538
5538
|
req_id,
|
|
@@ -5707,7 +5707,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
5707
5707
|
pre_contact_len,
|
|
5708
5708
|
)
|
|
5709
5709
|
transform_diag = {}
|
|
5710
|
-
logger.
|
|
5710
|
+
logger.debug(
|
|
5711
5711
|
"[PIPELINE:UMA][TRANSFORM] req=%s stage=ai_chat_messages start rows=%s",
|
|
5712
5712
|
req_id,
|
|
5713
5713
|
len(messages),
|
|
@@ -5720,7 +5720,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
5720
5720
|
diagnostics=transform_diag,
|
|
5721
5721
|
progress_hook=_uma_transform_progress_hook(req_id, "ai_chat_messages"),
|
|
5722
5722
|
)
|
|
5723
|
-
logger.
|
|
5723
|
+
logger.debug(
|
|
5724
5724
|
"[PIPELINE:UMA][TRANSFORM] req=%s stage=ai_chat_messages done applied=%s skipped=%s reasons=%s",
|
|
5725
5725
|
req_id,
|
|
5726
5726
|
transform_diag.get("applied_count", 0),
|
|
@@ -5764,7 +5764,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
5764
5764
|
pre_contact_len,
|
|
5765
5765
|
)
|
|
5766
5766
|
transform_diag = {}
|
|
5767
|
-
logger.
|
|
5767
|
+
logger.debug(
|
|
5768
5768
|
"[PIPELINE:UMA][TRANSFORM] req=%s stage=ai_chat_messages_jsonl start rows=%s",
|
|
5769
5769
|
req_id,
|
|
5770
5770
|
len(messages),
|
|
@@ -5777,7 +5777,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
5777
5777
|
diagnostics=transform_diag,
|
|
5778
5778
|
progress_hook=_uma_transform_progress_hook(req_id, "ai_chat_messages_jsonl"),
|
|
5779
5779
|
)
|
|
5780
|
-
logger.
|
|
5780
|
+
logger.debug(
|
|
5781
5781
|
"[PIPELINE:UMA][TRANSFORM] req=%s stage=ai_chat_messages_jsonl done applied=%s skipped=%s reasons=%s",
|
|
5782
5782
|
req_id,
|
|
5783
5783
|
transform_diag.get("applied_count", 0),
|
|
@@ -5951,7 +5951,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
5951
5951
|
rows = all_rows[:limit]
|
|
5952
5952
|
try:
|
|
5953
5953
|
transform_diag = {}
|
|
5954
|
-
logger.
|
|
5954
|
+
logger.debug(
|
|
5955
5955
|
"[PIPELINE:UMA][TRANSFORM] req=%s stage=rows:%s start rows=%s",
|
|
5956
5956
|
req_id,
|
|
5957
5957
|
table_name,
|
|
@@ -5965,7 +5965,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
5965
5965
|
diagnostics=transform_diag,
|
|
5966
5966
|
progress_hook=_uma_transform_progress_hook(req_id, f"rows:{table_name}"),
|
|
5967
5967
|
)
|
|
5968
|
-
logger.
|
|
5968
|
+
logger.debug(
|
|
5969
5969
|
"[PIPELINE:UMA][TRANSFORM] req=%s stage=rows:%s done applied=%s skipped=%s reasons=%s",
|
|
5970
5970
|
req_id,
|
|
5971
5971
|
table_name,
|
|
@@ -6840,7 +6840,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
6840
6840
|
sync_options = payload.get("sync_options")
|
|
6841
6841
|
if source_id == "imessage" and not sync_options:
|
|
6842
6842
|
sync_options = {"mode": "3m"}
|
|
6843
|
-
logger.
|
|
6843
|
+
logger.debug(
|
|
6844
6844
|
"[PIPELINE:SYNC] Engine received source_sync request: source_id=%s dataset_id=%s sync_options=%s (req_id=%s)",
|
|
6845
6845
|
source_id,
|
|
6846
6846
|
dataset_id[:24] + "..." if dataset_id and len(dataset_id) > 24 else dataset_id,
|
|
@@ -6870,7 +6870,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
|
|
|
6870
6870
|
error,
|
|
6871
6871
|
exc_info=False,
|
|
6872
6872
|
)
|
|
6873
|
-
logger.
|
|
6873
|
+
logger.debug("[PIPELINE:SYNC] source_sync completed: source_id=%s status=%s", source_id, status)
|
|
6874
6874
|
if conn and status == "ok":
|
|
6875
6875
|
update_sync_result(conn, dataset_id, source_id, success=True, last_sync_at=datetime.now(timezone.utc).isoformat())
|
|
6876
6876
|
elif conn and status == "error":
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
+
import os
|
|
4
|
+
import re
|
|
3
5
|
import sys
|
|
4
6
|
from datetime import datetime
|
|
5
7
|
from time import time
|
|
@@ -9,6 +11,26 @@ from ..runtime_update import is_update_available
|
|
|
9
11
|
|
|
10
12
|
_LOG_FORMAT: str | None = None
|
|
11
13
|
|
|
14
|
+
# Before huggingface_hub/transformers import, suppress download/load tqdm bars.
|
|
15
|
+
os.environ.setdefault("HF_HUB_DISABLE_PROGRESS_BARS", "1")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def suppress_ml_progress_bars() -> None:
|
|
19
|
+
"""Hide Hugging Face / transformers tqdm progress bars; keep app INFO load logs."""
|
|
20
|
+
os.environ.setdefault("HF_HUB_DISABLE_PROGRESS_BARS", "1")
|
|
21
|
+
try:
|
|
22
|
+
from huggingface_hub.utils import disable_progress_bars
|
|
23
|
+
|
|
24
|
+
disable_progress_bars()
|
|
25
|
+
except Exception:
|
|
26
|
+
pass
|
|
27
|
+
try:
|
|
28
|
+
from transformers.utils.logging import disable_progress_bar
|
|
29
|
+
|
|
30
|
+
disable_progress_bar()
|
|
31
|
+
except Exception:
|
|
32
|
+
pass
|
|
33
|
+
|
|
12
34
|
# Route uvicorn loggers through the root handler configured by configure_logging().
|
|
13
35
|
UVICORN_LOG_CONFIG: dict[str, object] = {
|
|
14
36
|
"version": 1,
|
|
@@ -37,6 +59,7 @@ def align_uvicorn_loggers() -> None:
|
|
|
37
59
|
|
|
38
60
|
def configure_logging() -> None:
|
|
39
61
|
"""Configure logging to stdout based on environment/log settings."""
|
|
62
|
+
suppress_ml_progress_bars()
|
|
40
63
|
handler = logging.StreamHandler(sys.stdout)
|
|
41
64
|
|
|
42
65
|
def resolve_format() -> str:
|
|
@@ -145,12 +168,42 @@ class ColorFormatter(logging.Formatter):
|
|
|
145
168
|
|
|
146
169
|
# Message text: Same blue as DEBUG
|
|
147
170
|
_MESSAGE_COLOR = "\x1b[38;5;26m" # Light blue (same as DEBUG)
|
|
171
|
+
|
|
172
|
+
# source / source_id values: bold magenta — easy to scan in pipeline logs
|
|
173
|
+
_SOURCE_IDENTITY_VALUE_COLOR = "\x1b[1;38;5;213m" # Bold bright magenta
|
|
148
174
|
|
|
149
175
|
# Logger name (module path): Same teal/cyan as class names
|
|
150
176
|
_LOGGER_NAME_COLOR = "\x1b[38;5;75m" # Teal/cyan blue-green
|
|
151
177
|
|
|
152
178
|
_ARROW_COLOR = "\x1b[38;5;244m" # Gray for arrows
|
|
153
179
|
|
|
180
|
+
_SOURCE_KV_PATTERN = re.compile(
|
|
181
|
+
r"(?<![?&/])" # skip URL query/path fragments like ...&source=editors
|
|
182
|
+
r"\b(?P<key>source_id|source)="
|
|
183
|
+
r"(?:"
|
|
184
|
+
r"(?P<q>['\"])(?P<qval>[^'\"]+)(?P=q)|"
|
|
185
|
+
r"(?P<uval>[^\s,;)\]&]+)"
|
|
186
|
+
r")"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
_SOURCE_VALUE_SKIP = frozenset({"%s", "%d", "%i", "%f", "?"})
|
|
190
|
+
|
|
191
|
+
def _highlight_source_identities(self, message: str) -> str:
|
|
192
|
+
"""Bold magenta on source / source_id values (keys stay default message color)."""
|
|
193
|
+
|
|
194
|
+
def repl(match: re.Match[str]) -> str:
|
|
195
|
+
value = match.group("qval") or match.group("uval") or ""
|
|
196
|
+
if value in self._SOURCE_VALUE_SKIP or value.startswith("excluded."):
|
|
197
|
+
return match.group(0)
|
|
198
|
+
key = match.group("key")
|
|
199
|
+
quote = match.group("q") or ""
|
|
200
|
+
colored_value = (
|
|
201
|
+
f"{self._SOURCE_IDENTITY_VALUE_COLOR}{value}{self._RESET}{self._MESSAGE_COLOR}"
|
|
202
|
+
)
|
|
203
|
+
return f"{key}={quote}{colored_value}{quote}"
|
|
204
|
+
|
|
205
|
+
return self._SOURCE_KV_PATTERN.sub(repl, message)
|
|
206
|
+
|
|
154
207
|
def format(self, record: logging.LogRecord) -> str: # noqa: D401
|
|
155
208
|
# Format timestamp: YYYY-MM-DD HH:MM:SS.ms (green)
|
|
156
209
|
timestamp_str = datetime.fromtimestamp(record.created).strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
|
|
@@ -171,8 +224,7 @@ class ColorFormatter(logging.Formatter):
|
|
|
171
224
|
|
|
172
225
|
# Get message and extract pipeline tag if present
|
|
173
226
|
message = record.getMessage()
|
|
174
|
-
|
|
175
|
-
|
|
227
|
+
|
|
176
228
|
# Extract pipeline stage tag from message if it exists
|
|
177
229
|
pipeline_tag_pattern = r'\[PIPELINE:[A-Z_]+\]'
|
|
178
230
|
pipeline_tag_match = re.search(pipeline_tag_pattern, message)
|
|
@@ -204,6 +256,8 @@ class ColorFormatter(logging.Formatter):
|
|
|
204
256
|
f"{self._ARROW_COLOR}\\1{self._RESET}{self._MESSAGE_COLOR}",
|
|
205
257
|
message_colored
|
|
206
258
|
)
|
|
259
|
+
|
|
260
|
+
message_colored = self._highlight_source_identities(message_colored)
|
|
207
261
|
|
|
208
262
|
# Format: TIMESTAMP | LEVEL | [PIPELINE:TAG] | LOGGER: MESSAGE
|
|
209
263
|
separator = f"{self._SEPARATOR_COLOR}|{self._RESET}"
|
|
@@ -184,11 +184,11 @@ async def run_privacy_disclosure_layer(
|
|
|
184
184
|
apply_canonical_nsfw_v1_up(conn)
|
|
185
185
|
|
|
186
186
|
if not getattr(settings, "platform_privacy_via_engine", True):
|
|
187
|
-
logger.
|
|
187
|
+
logger.debug("[PIPELINE:PRIVACY] skipped: platform_privacy_via_engine=false")
|
|
188
188
|
return {"records_updated": 0, "skipped": True}
|
|
189
189
|
|
|
190
190
|
if nsfw_only and not getattr(settings, "nsfw_classifier_enabled", True):
|
|
191
|
-
logger.
|
|
191
|
+
logger.debug("[PIPELINE:PRIVACY] nsfw-only backfill skipped: nsfw_classifier_enabled=false")
|
|
192
192
|
return {"records_updated": 0, "nsfw_tagged": 0, "skipped": True}
|
|
193
193
|
|
|
194
194
|
if not canonical_messages:
|
|
@@ -353,7 +353,7 @@ async def run_privacy_disclosure_layer(
|
|
|
353
353
|
conn.commit()
|
|
354
354
|
|
|
355
355
|
duration_ms = int((time.perf_counter() - started) * 1000)
|
|
356
|
-
logger.
|
|
356
|
+
logger.debug(
|
|
357
357
|
"[PIPELINE:PRIVACY] platform_privacy_layer disclosure_updated=%d nsfw_tagged=%d "
|
|
358
358
|
"failed_batches=%d nsfw_failed_batches=%d duration_ms=%d version=%s",
|
|
359
359
|
updated,
|
|
@@ -278,7 +278,12 @@ class HuggingFaceAdapter:
|
|
|
278
278
|
vectors: List[List[float]] = []
|
|
279
279
|
for i in range(0, len(texts), batch_size):
|
|
280
280
|
batch = texts[i : i + batch_size]
|
|
281
|
-
encoded = embedder.encode(
|
|
281
|
+
encoded = embedder.encode(
|
|
282
|
+
batch,
|
|
283
|
+
convert_to_numpy=True,
|
|
284
|
+
normalize_embeddings=normalize,
|
|
285
|
+
show_progress_bar=False,
|
|
286
|
+
)
|
|
282
287
|
for row in encoded:
|
|
283
288
|
vectors.append([float(x) for x in row.tolist()])
|
|
284
289
|
dims = len(vectors[0]) if vectors else 0
|
|
@@ -41,7 +41,7 @@ class TopicClusterJob(BaseEnrichmentJob):
|
|
|
41
41
|
# does not wipe cross-source memory_topic_map rollups.
|
|
42
42
|
scope_ids = list(_resolved_topic_cluster_source_ids())
|
|
43
43
|
if source_ids:
|
|
44
|
-
logger.
|
|
44
|
+
logger.debug(
|
|
45
45
|
"[PIPELINE:TOPIC_CLUSTERS] batch sources=%s; clustering scope=%s",
|
|
46
46
|
sorted(source_ids),
|
|
47
47
|
scope_ids,
|
|
@@ -57,7 +57,7 @@ class TopicClusterJob(BaseEnrichmentJob):
|
|
|
57
57
|
min_records=3,
|
|
58
58
|
)
|
|
59
59
|
if result.get("status") == "skipped":
|
|
60
|
-
logger.
|
|
60
|
+
logger.debug("[PIPELINE:TOPIC_CLUSTERS] skipped: %s", result.get("reason"))
|
|
61
61
|
if progress_callback:
|
|
62
62
|
progress_callback(1, 1)
|
|
63
63
|
return []
|
|
@@ -58,7 +58,7 @@ class EnrichmentOrchestrator(BaseObject):
|
|
|
58
58
|
|
|
59
59
|
total_messages = len(canonical_messages)
|
|
60
60
|
total_jobs = len(jobs_to_run)
|
|
61
|
-
logger.
|
|
61
|
+
logger.debug(
|
|
62
62
|
"[PIPELINE:ENRICHMENT] %s: Starting enrichment: %d messages, %d jobs to run",
|
|
63
63
|
self,
|
|
64
64
|
total_messages,
|
|
@@ -75,7 +75,7 @@ class EnrichmentOrchestrator(BaseObject):
|
|
|
75
75
|
continue
|
|
76
76
|
try:
|
|
77
77
|
job_name = job.get_job_name()
|
|
78
|
-
logger.
|
|
78
|
+
logger.debug(
|
|
79
79
|
"[PIPELINE:ENRICHMENT] %s: Running job %d/%d: %s (%d messages, %.1f%% of jobs complete)",
|
|
80
80
|
self,
|
|
81
81
|
job_idx,
|
|
@@ -115,7 +115,7 @@ class EnrichmentOrchestrator(BaseObject):
|
|
|
115
115
|
records, derived_table
|
|
116
116
|
)
|
|
117
117
|
results["records_created"][derived_table] = records_written
|
|
118
|
-
logger.
|
|
118
|
+
logger.debug(
|
|
119
119
|
"[PIPELINE:ENRICHMENT] %s → %s: %d records written to %s (job %d/%d, %.1f%% complete)",
|
|
120
120
|
self,
|
|
121
121
|
job,
|
|
@@ -132,7 +132,7 @@ class EnrichmentOrchestrator(BaseObject):
|
|
|
132
132
|
results["records_created"]["canonical_disclosure"] = (
|
|
133
133
|
int(results["records_created"].get("canonical_disclosure") or 0) + updated
|
|
134
134
|
)
|
|
135
|
-
logger.
|
|
135
|
+
logger.debug(
|
|
136
136
|
"[PIPELINE:ENRICHMENT] %s → %s: %d canonical disclosure rows updated (job %d/%d)",
|
|
137
137
|
self,
|
|
138
138
|
job,
|
|
@@ -143,7 +143,7 @@ class EnrichmentOrchestrator(BaseObject):
|
|
|
143
143
|
else:
|
|
144
144
|
table_name = derived_table or job.get_job_name()
|
|
145
145
|
results["records_created"][table_name] = 0
|
|
146
|
-
logger.
|
|
146
|
+
logger.debug(
|
|
147
147
|
"[PIPELINE:ENRICHMENT] %s → %s: completed with 0 records (job %d/%d, %.1f%% complete)",
|
|
148
148
|
self,
|
|
149
149
|
job,
|
|
@@ -181,7 +181,7 @@ class EnrichmentOrchestrator(BaseObject):
|
|
|
181
181
|
# Mark job as 100% complete (even if failed, we've moved past it)
|
|
182
182
|
progress_callback(messages_processed_so_far, total_messages, job.get_job_name(), job_progress_percent, 100.0)
|
|
183
183
|
|
|
184
|
-
logger.
|
|
184
|
+
logger.debug(
|
|
185
185
|
"[PIPELINE:ENRICHMENT] %s: Enrichment complete: %d jobs run, %d total records created",
|
|
186
186
|
self,
|
|
187
187
|
results["jobs_run"],
|
|
@@ -275,7 +275,7 @@ class SignalDerivationOrchestrator(EnrichmentOrchestrator):
|
|
|
275
275
|
}
|
|
276
276
|
jobs_to_run = [self._signal_jobs[name] for name in resolved if name in self._signal_jobs]
|
|
277
277
|
total_jobs = len(jobs_to_run)
|
|
278
|
-
logger.
|
|
278
|
+
logger.debug(
|
|
279
279
|
"[PIPELINE:SIGNAL_DERIVE] source_id=%s batch_id=%s jobs=%s messages=%d",
|
|
280
280
|
source_id,
|
|
281
281
|
sync_batch_id,
|
|
@@ -343,7 +343,7 @@ class SignalDerivationOrchestrator(EnrichmentOrchestrator):
|
|
|
343
343
|
except Exception as exc:
|
|
344
344
|
logger.debug("[PIPELINE:SIGNAL_DERIVE] dimension profile update skipped: %s", exc)
|
|
345
345
|
|
|
346
|
-
logger.
|
|
346
|
+
logger.debug(
|
|
347
347
|
"[PIPELINE:SIGNAL_DERIVE] complete source_id=%s batch_id=%s jobs_run=%d deferred=%s",
|
|
348
348
|
source_id,
|
|
349
349
|
sync_batch_id,
|
|
@@ -683,7 +683,7 @@ async def run_post_canonical_pipeline(
|
|
|
683
683
|
logger.error("[PIPELINE:ENRICHMENT] post-canonical failed: %s", exc, exc_info=True)
|
|
684
684
|
outcome["canonical_enrichment"] = {"errors": [str(exc)]}
|
|
685
685
|
elif canonical_jobs and enrichment_trigger == "manual":
|
|
686
|
-
logger.
|
|
686
|
+
logger.debug(
|
|
687
687
|
"[PIPELINE:ENRICHMENT] Skipping canonical enrichment (manual trigger): source_id=%s records=%d",
|
|
688
688
|
source_id,
|
|
689
689
|
len(canonical_records),
|
|
@@ -86,7 +86,7 @@ async def ingest_file_payload(
|
|
|
86
86
|
for source in REGISTRY.values():
|
|
87
87
|
if source.schema_id == schema_id and source.source_type == "file":
|
|
88
88
|
source_id = source.source_id
|
|
89
|
-
logger.
|
|
89
|
+
logger.info(
|
|
90
90
|
"[PIPELINE:RAW] Found source_id=%s for schema_id=%s (file type)",
|
|
91
91
|
source_id,
|
|
92
92
|
schema_id,
|
|
@@ -101,7 +101,7 @@ async def ingest_file_payload(
|
|
|
101
101
|
file_store = RawFileStore()
|
|
102
102
|
trigger = FileTrigger(file_store=file_store)
|
|
103
103
|
job_id = job_id or str(uuid.uuid4())
|
|
104
|
-
logger.
|
|
104
|
+
logger.info(
|
|
105
105
|
"[PIPELINE:RAW] Creating file ingestion job: job_id=%s, dataset_id=%s, schema_id=%s, source_id=%s, file_path=%s, file_size=%s",
|
|
106
106
|
job_id,
|
|
107
107
|
dataset_id,
|
|
@@ -123,7 +123,7 @@ async def ingest_file_payload(
|
|
|
123
123
|
progress_api_url=progress_api_url,
|
|
124
124
|
progress_api_key=progress_api_key,
|
|
125
125
|
)
|
|
126
|
-
logger.
|
|
126
|
+
logger.info(
|
|
127
127
|
"[PIPELINE:RAW] %s: File ingestion complete: job_id=%s, records_processed=%s, errors=%s",
|
|
128
128
|
manager,
|
|
129
129
|
job_id,
|
|
@@ -201,7 +201,7 @@ async def ingest_ui_payload(
|
|
|
201
201
|
"content": content,
|
|
202
202
|
"created_at": created_at,
|
|
203
203
|
}
|
|
204
|
-
logger.
|
|
204
|
+
logger.info(
|
|
205
205
|
"[PIPELINE:RAW] Appending UI message to raw store: job_id=%s, dataset_id=%s, message_id=%s, content_preview=%s",
|
|
206
206
|
job_id,
|
|
207
207
|
dataset_id,
|
|
@@ -216,10 +216,10 @@ async def ingest_ui_payload(
|
|
|
216
216
|
schema_id,
|
|
217
217
|
file_store.get_file_path(dataset_id, schema_id).as_posix(),
|
|
218
218
|
)
|
|
219
|
-
logger.
|
|
219
|
+
logger.info("[PIPELINE:RAW] Starting ingestion job: job_id=%s, dataset_id=%s, schema_id=%s", job_id, dataset_id, schema_id)
|
|
220
220
|
manager = IngestionManager(file_store=file_store)
|
|
221
221
|
result = await manager.process_job(job)
|
|
222
|
-
logger.
|
|
222
|
+
logger.info(
|
|
223
223
|
"[PIPELINE:RAW] %s: UI ingestion complete: job_id=%s, records_processed=%s, errors=%s",
|
|
224
224
|
manager,
|
|
225
225
|
job_id,
|
|
@@ -389,7 +389,7 @@ async def _ingest_ui_payload_direct(
|
|
|
389
389
|
payload=raw_payload,
|
|
390
390
|
source_type=raw_source_type,
|
|
391
391
|
)
|
|
392
|
-
logger.
|
|
392
|
+
logger.info(
|
|
393
393
|
"[PIPELINE:RAW] Stored raw payload: source=%s, record_id=%s",
|
|
394
394
|
source_id,
|
|
395
395
|
record_id[:8] if record_id else None,
|
|
@@ -587,7 +587,7 @@ async def _try_install_runtime_source_definition_from_control_plane(
|
|
|
587
587
|
install_source_definition(row)
|
|
588
588
|
installed = REGISTRY.get(row_source_id)
|
|
589
589
|
if installed:
|
|
590
|
-
logger.
|
|
590
|
+
logger.debug(
|
|
591
591
|
"[PIPELINE:MANAGER] Installed runtime source definition from control-plane: source_id=%s schema_id=%s",
|
|
592
592
|
row_source_id,
|
|
593
593
|
row_schema_id,
|
|
@@ -690,7 +690,7 @@ class IngestionManager(BaseObject):
|
|
|
690
690
|
if source_id:
|
|
691
691
|
source_def = REGISTRY.get(source_id)
|
|
692
692
|
if source_def:
|
|
693
|
-
logger.
|
|
693
|
+
logger.debug(
|
|
694
694
|
"[PIPELINE:MANAGER] %s: Using source from source_id=%s: %s (enrichment_trigger=%s)",
|
|
695
695
|
self,
|
|
696
696
|
source_id,
|
|
@@ -745,7 +745,7 @@ class IngestionManager(BaseObject):
|
|
|
745
745
|
# Keep first match as fallback
|
|
746
746
|
source_def = source
|
|
747
747
|
if source_def:
|
|
748
|
-
logger.
|
|
748
|
+
logger.debug(
|
|
749
749
|
"[PIPELINE:MANAGER] %s: Found source by schema_id: source_id=%s, source_type=%s, enrichment_trigger=%s",
|
|
750
750
|
self,
|
|
751
751
|
source_def.source_id,
|
|
@@ -1009,7 +1009,7 @@ class IngestionManager(BaseObject):
|
|
|
1009
1009
|
and enrichment_trigger == "automatic"
|
|
1010
1010
|
and tables_manager
|
|
1011
1011
|
):
|
|
1012
|
-
logger.
|
|
1012
|
+
logger.debug(
|
|
1013
1013
|
"[PIPELINE:ENRICHMENT] %s: Enrichment trigger check: source_id=%s, enrichment_trigger=%s, canonical_messages=%d, jobs=%s",
|
|
1014
1014
|
self,
|
|
1015
1015
|
source_def.source_id,
|
|
@@ -1031,7 +1031,7 @@ class IngestionManager(BaseObject):
|
|
|
1031
1031
|
len(canonical_messages),
|
|
1032
1032
|
)
|
|
1033
1033
|
elif source_def.canonical_enrichment_jobs and enrichment_trigger == "manual":
|
|
1034
|
-
logger.
|
|
1034
|
+
logger.debug(
|
|
1035
1035
|
"[PIPELINE:ENRICHMENT] %s: Skipping enrichment (manual trigger): %d canonical messages will be enriched later via POST /v1/enrichment/process",
|
|
1036
1036
|
self,
|
|
1037
1037
|
len(canonical_messages),
|
|
@@ -224,7 +224,7 @@ def write_browser_visit(conn, payload: Dict[str, Any]) -> None:
|
|
|
224
224
|
_to_sql_value(payload.get("referred_by")),
|
|
225
225
|
))
|
|
226
226
|
conn.commit()
|
|
227
|
-
logger.
|
|
227
|
+
logger.info("[PIPELINE:RAW] Wrote flat row to %s: record_id=%s", BROWSER_VISITS_TABLE, record_id[:24] if record_id else None)
|
|
228
228
|
|
|
229
229
|
|
|
230
230
|
def write_browser_event(conn, payload: Dict[str, Any]) -> None:
|
|
@@ -259,7 +259,7 @@ def write_browser_event(conn, payload: Dict[str, Any]) -> None:
|
|
|
259
259
|
_to_sql_value(payload.get("starred_at")),
|
|
260
260
|
))
|
|
261
261
|
conn.commit()
|
|
262
|
-
logger.
|
|
262
|
+
logger.info("[PIPELINE:RAW] Wrote flat row to %s: record_id=%s event_type=%s", BROWSER_EVENTS_TABLE, record_id[:24] if record_id else None, event_type)
|
|
263
263
|
|
|
264
264
|
|
|
265
265
|
def write_browser_url_classification(
|
|
@@ -295,7 +295,7 @@ def write_browser_url_classification(
|
|
|
295
295
|
))
|
|
296
296
|
conn.commit()
|
|
297
297
|
if log_write:
|
|
298
|
-
logger.
|
|
298
|
+
logger.info(
|
|
299
299
|
"[PIPELINE:RAW] Wrote URL classification row: source=%s record_id=%s category=%s",
|
|
300
300
|
source_table,
|
|
301
301
|
record_id[:24] if record_id else None,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|