topos-node 0.1.0__tar.gz → 0.1.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-0.1.0/topos_node.egg-info → topos_node-0.1.2}/PKG-INFO +1 -1
- {topos_node-0.1.0 → topos_node-0.1.2}/pyproject.toml +1 -1
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/__version__.py +2 -2
- topos_node-0.1.2/topos/cli/commands.py +243 -0
- {topos_node-0.1.0 → topos_node-0.1.2/topos_node.egg-info}/PKG-INFO +1 -1
- topos_node-0.1.0/topos/cli/commands.py +0 -132
- {topos_node-0.1.0 → topos_node-0.1.2}/LICENSE +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/README.md +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/setup.cfg +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/shared/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/shared/filtering.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/shared/schema_registry.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/analytics/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/analytics/profiles.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/analytics/query_engine.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/analytics/raw_queries.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/analytics.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/app_registry.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/backup.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/compute_remote.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/data_commit.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/db.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/device.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/enrichment.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/filter_lab.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/health.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/ingestion_api.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/ingestion_compat.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/ingestion_sources.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/llm.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/local_mcp.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/messenger_analytics.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/query_api.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/source_install.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/sources.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/sync.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/ui_config.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/uma_data.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/usage.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/api/user_identity.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/app.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/auth.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/canonicalization/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/canonicalization/models.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/canonicalization/resolver.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/cli/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/cli/__main__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/config/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/config/settings.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/contacts/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/contacts/identity.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/control_plane_client.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/api_models.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/connection_resilience.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/device_helpers.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/errors.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/events.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/handlers.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/logging.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/metrics.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/startup_banner.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/state.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/table_layers.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/core/types.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/backends/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/backends/base.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/backends/ollama.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/backends/stub.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/engine.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/intake.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/queue_manager.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/registration.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/result_formatter.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/router.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/scoped_token.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/tasks.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/transport.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/usage_guard.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/usage_observation.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/engine/validator.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/models/manager.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/models/registry.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/processor.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/enrichment/website_classifier.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/filter_lab/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/filter_lab/bundles.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/filter_lab/schema.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/filter_lab/service.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/filter_lab/store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/filter_lab/worker.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/hosted_pool_lease.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/jobs.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/local_sync.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/log_preview.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/manager.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/parser.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/progress.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/sources/base.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/state_machine.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/validation/base.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/lineage/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/lineage/provenance.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/lineage/tracker.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/observability/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/observability/alerts.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/observability/metrics.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/observability/tracing.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/openai_client.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/projections/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/projections/vector_index/base.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/rate_limit.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/sanitization/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/scope_resolution.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/container.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/embeddings/base.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/embeddings/local.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/embeddings/remote.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/interfaces.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/llm/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/llm/base.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/llm/openai.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/local.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/services/postgres.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/sources/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/sources/definitions.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/sources/install_service.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/sources/registry.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/sources/runtime_install.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/db/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/db/client.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/db/paths.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/db/postgres.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/db/schema.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/oplog/decision.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/projections/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/raw/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/raw/file_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/security/encryption.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/signal_identity.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/source_settings.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/storage/user_identity.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/sync/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/sync/client.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/sync_handlers.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/testing/__init__.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/testing/lifespan.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/uma_filters.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/uma_resource_id.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/uma_rpt.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/utils/base_object.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos/websocket_client.py +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos_node.egg-info/SOURCES.txt +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-0.1.0 → topos_node-0.1.2}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-0.1.0 → topos_node-0.1.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 = "0.1.
|
|
7
|
+
version = "0.1.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"
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"""CLI entry points for Topos."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import subprocess
|
|
8
|
+
import sys
|
|
9
|
+
from importlib.metadata import PackageNotFoundError, version as package_version
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from urllib.error import URLError
|
|
12
|
+
from urllib.request import urlopen
|
|
13
|
+
|
|
14
|
+
import click
|
|
15
|
+
import uvicorn
|
|
16
|
+
from packaging.version import InvalidVersion, Version
|
|
17
|
+
|
|
18
|
+
# Add parent directory to path for imports
|
|
19
|
+
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
|
20
|
+
|
|
21
|
+
from topos.storage.db.paths import discover_databases
|
|
22
|
+
|
|
23
|
+
USER_ENV_PATH = Path.home() / ".topos" / ".env"
|
|
24
|
+
LEGACY_ENV_PATH = Path(__file__).resolve().parent.parent / ".env"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _load_env_file(env_path: Path) -> None:
|
|
28
|
+
if not env_path.exists():
|
|
29
|
+
return
|
|
30
|
+
for line in env_path.read_text(encoding="utf-8").splitlines():
|
|
31
|
+
stripped = line.strip()
|
|
32
|
+
if not stripped or stripped.startswith("#") or "=" not in stripped:
|
|
33
|
+
continue
|
|
34
|
+
key, value = stripped.split("=", 1)
|
|
35
|
+
key = key.strip()
|
|
36
|
+
value = value.strip().strip('"').strip("'")
|
|
37
|
+
if key and key not in os.environ:
|
|
38
|
+
os.environ[key] = value
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _save_topos_key(topos_key: str, env_path: Path = USER_ENV_PATH) -> Path:
|
|
42
|
+
env_path.parent.mkdir(parents=True, exist_ok=True)
|
|
43
|
+
lines: list[str] = []
|
|
44
|
+
if env_path.exists():
|
|
45
|
+
lines = env_path.read_text(encoding="utf-8").splitlines()
|
|
46
|
+
|
|
47
|
+
updated = False
|
|
48
|
+
new_lines: list[str] = []
|
|
49
|
+
for line in lines:
|
|
50
|
+
stripped = line.strip()
|
|
51
|
+
if stripped.startswith("TOPOS_KEY="):
|
|
52
|
+
new_lines.append(f"TOPOS_KEY={topos_key}")
|
|
53
|
+
updated = True
|
|
54
|
+
else:
|
|
55
|
+
new_lines.append(line)
|
|
56
|
+
|
|
57
|
+
if not updated:
|
|
58
|
+
if new_lines and new_lines[-1].strip():
|
|
59
|
+
new_lines.append("")
|
|
60
|
+
new_lines.append(f"TOPOS_KEY={topos_key}")
|
|
61
|
+
|
|
62
|
+
env_path.write_text("\n".join(new_lines) + "\n", encoding="utf-8")
|
|
63
|
+
try:
|
|
64
|
+
env_path.chmod(0o600)
|
|
65
|
+
except OSError:
|
|
66
|
+
# Best-effort permissions (e.g. may fail on some filesystems).
|
|
67
|
+
pass
|
|
68
|
+
return env_path
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _can_prompt_for_input() -> bool:
|
|
72
|
+
return sys.stdin.isatty() and sys.stdout.isatty()
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _prompt_for_topos_key() -> str:
|
|
76
|
+
click.echo("TOPOS_KEY is required to connect Topos Node.")
|
|
77
|
+
click.echo("Enter your TOPOS_KEY to save it locally and continue.")
|
|
78
|
+
while True:
|
|
79
|
+
key = click.prompt("TOPOS_KEY", hide_input=True).strip()
|
|
80
|
+
if key:
|
|
81
|
+
return key
|
|
82
|
+
click.echo("TOPOS_KEY cannot be empty. Please try again.")
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _resolve_topos_key(cli_topos_key: str | None, env_path: Path = USER_ENV_PATH) -> str:
|
|
86
|
+
if cli_topos_key:
|
|
87
|
+
os.environ["TOPOS_KEY"] = cli_topos_key
|
|
88
|
+
return cli_topos_key
|
|
89
|
+
|
|
90
|
+
existing_key = (os.getenv("TOPOS_KEY") or "").strip()
|
|
91
|
+
if existing_key:
|
|
92
|
+
os.environ["TOPOS_KEY"] = existing_key
|
|
93
|
+
return existing_key
|
|
94
|
+
|
|
95
|
+
if _can_prompt_for_input():
|
|
96
|
+
prompted_key = _prompt_for_topos_key()
|
|
97
|
+
saved_path = _save_topos_key(prompted_key, env_path=env_path)
|
|
98
|
+
os.environ["TOPOS_KEY"] = prompted_key
|
|
99
|
+
click.echo(f"Saved TOPOS_KEY to {saved_path}")
|
|
100
|
+
click.echo("Connecting with saved TOPOS_KEY...")
|
|
101
|
+
return prompted_key
|
|
102
|
+
|
|
103
|
+
raise click.ClickException(
|
|
104
|
+
"TOPOS_KEY is not configured. Run `topos-node --set-topos-key <YOUR_TOPOS_KEY>` "
|
|
105
|
+
"or provide `--topos-key` for this run."
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _get_installed_package_version(package_name: str) -> str | None:
|
|
110
|
+
try:
|
|
111
|
+
return package_version(package_name)
|
|
112
|
+
except PackageNotFoundError:
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _get_latest_pypi_version(package_name: str, timeout_seconds: float = 2.0) -> str | None:
|
|
117
|
+
url = f"https://pypi.org/pypi/{package_name}/json"
|
|
118
|
+
try:
|
|
119
|
+
with urlopen(url, timeout=timeout_seconds) as response:
|
|
120
|
+
payload = json.loads(response.read().decode("utf-8"))
|
|
121
|
+
except (OSError, URLError, ValueError):
|
|
122
|
+
return None
|
|
123
|
+
return str(payload.get("info", {}).get("version") or "").strip() or None
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _should_skip_update_check(skip_update_check: bool) -> bool:
|
|
127
|
+
if skip_update_check:
|
|
128
|
+
return True
|
|
129
|
+
env_value = (os.getenv("TOPOS_SKIP_UPDATE_CHECK") or "").strip().lower()
|
|
130
|
+
return env_value in {"1", "true", "yes", "on"}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _maybe_offer_self_update(
|
|
134
|
+
skip_update_check: bool,
|
|
135
|
+
package_name: str = "topos-node",
|
|
136
|
+
) -> bool:
|
|
137
|
+
if _should_skip_update_check(skip_update_check):
|
|
138
|
+
return False
|
|
139
|
+
|
|
140
|
+
installed = _get_installed_package_version(package_name)
|
|
141
|
+
if not installed:
|
|
142
|
+
return False
|
|
143
|
+
|
|
144
|
+
latest = _get_latest_pypi_version(package_name)
|
|
145
|
+
if not latest:
|
|
146
|
+
return False
|
|
147
|
+
|
|
148
|
+
try:
|
|
149
|
+
if Version(latest) <= Version(installed):
|
|
150
|
+
return False
|
|
151
|
+
except InvalidVersion:
|
|
152
|
+
return False
|
|
153
|
+
|
|
154
|
+
click.echo(f"Update available for {package_name}: {installed} -> {latest}")
|
|
155
|
+
if not _can_prompt_for_input():
|
|
156
|
+
click.echo(f"Run `uv tool upgrade {package_name}` to update.")
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
if not click.confirm("Install the latest version now?", default=True):
|
|
160
|
+
return False
|
|
161
|
+
|
|
162
|
+
click.echo(f"Updating {package_name}...")
|
|
163
|
+
result = subprocess.run(["uv", "tool", "upgrade", package_name], check=False)
|
|
164
|
+
if result.returncode != 0:
|
|
165
|
+
click.echo("Update failed. Continuing with current version.")
|
|
166
|
+
return False
|
|
167
|
+
|
|
168
|
+
click.echo("Update installed. Please re-run `topos-node` to use the latest version.")
|
|
169
|
+
return True
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
@click.command()
|
|
173
|
+
@click.option(
|
|
174
|
+
"--db-path",
|
|
175
|
+
help="Database file path (SQLite). If not specified, uses auto-discovery.",
|
|
176
|
+
)
|
|
177
|
+
@click.option(
|
|
178
|
+
"--topos-key",
|
|
179
|
+
help="Topos key for this run (overrides saved key).",
|
|
180
|
+
)
|
|
181
|
+
@click.option(
|
|
182
|
+
"--set-topos-key",
|
|
183
|
+
metavar="KEY",
|
|
184
|
+
help="Save TOPOS_KEY to ~/.topos/.env and exit.",
|
|
185
|
+
)
|
|
186
|
+
@click.option(
|
|
187
|
+
"--discover",
|
|
188
|
+
is_flag=True,
|
|
189
|
+
help="Show discovered databases and exit",
|
|
190
|
+
)
|
|
191
|
+
@click.option(
|
|
192
|
+
"--port",
|
|
193
|
+
default=9000,
|
|
194
|
+
help="Server port (default: 9000)",
|
|
195
|
+
)
|
|
196
|
+
@click.option(
|
|
197
|
+
"--host",
|
|
198
|
+
default="0.0.0.0",
|
|
199
|
+
help="Host to bind to (default: 0.0.0.0)",
|
|
200
|
+
)
|
|
201
|
+
@click.option(
|
|
202
|
+
"--skip-update-check",
|
|
203
|
+
is_flag=True,
|
|
204
|
+
help="Skip checking PyPI for a newer topos-node version.",
|
|
205
|
+
)
|
|
206
|
+
def main(db_path, topos_key, set_topos_key, discover, port, host, skip_update_check) -> None:
|
|
207
|
+
"""Topos Control Plane API entry point."""
|
|
208
|
+
if set_topos_key:
|
|
209
|
+
env_path = _save_topos_key(set_topos_key)
|
|
210
|
+
click.echo(f"Saved TOPOS_KEY to {env_path}")
|
|
211
|
+
click.echo("You can now run: topos-node")
|
|
212
|
+
return
|
|
213
|
+
|
|
214
|
+
if discover:
|
|
215
|
+
databases = discover_databases()
|
|
216
|
+
if databases:
|
|
217
|
+
click.echo("Discovered databases:")
|
|
218
|
+
for db in databases:
|
|
219
|
+
click.echo(f" - {db}")
|
|
220
|
+
else:
|
|
221
|
+
click.echo("No existing databases found")
|
|
222
|
+
return
|
|
223
|
+
|
|
224
|
+
if _maybe_offer_self_update(skip_update_check=skip_update_check):
|
|
225
|
+
return
|
|
226
|
+
|
|
227
|
+
_load_env_file(USER_ENV_PATH)
|
|
228
|
+
_load_env_file(LEGACY_ENV_PATH)
|
|
229
|
+
|
|
230
|
+
_resolve_topos_key(topos_key)
|
|
231
|
+
|
|
232
|
+
from topos.app import app
|
|
233
|
+
|
|
234
|
+
if db_path:
|
|
235
|
+
os.environ["TOPOS_DATABASE_PATH"] = db_path
|
|
236
|
+
click.echo(f"Database path: {db_path}")
|
|
237
|
+
|
|
238
|
+
click.echo(f"Starting topos API on {host}:{port}")
|
|
239
|
+
uvicorn.run(app, host=host, port=port)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
if __name__ == "__main__":
|
|
243
|
+
main()
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
"""CLI entry points for Topos."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import os
|
|
6
|
-
import sys
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
|
|
9
|
-
import click
|
|
10
|
-
import uvicorn
|
|
11
|
-
|
|
12
|
-
# Add parent directory to path for imports
|
|
13
|
-
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
|
14
|
-
|
|
15
|
-
from topos.storage.db.paths import discover_databases
|
|
16
|
-
|
|
17
|
-
USER_ENV_PATH = Path.home() / ".topos" / ".env"
|
|
18
|
-
LEGACY_ENV_PATH = Path(__file__).resolve().parent.parent / ".env"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def _load_env_file(env_path: Path) -> None:
|
|
22
|
-
if not env_path.exists():
|
|
23
|
-
return
|
|
24
|
-
for line in env_path.read_text(encoding="utf-8").splitlines():
|
|
25
|
-
stripped = line.strip()
|
|
26
|
-
if not stripped or stripped.startswith("#") or "=" not in stripped:
|
|
27
|
-
continue
|
|
28
|
-
key, value = stripped.split("=", 1)
|
|
29
|
-
key = key.strip()
|
|
30
|
-
value = value.strip().strip('"').strip("'")
|
|
31
|
-
if key and key not in os.environ:
|
|
32
|
-
os.environ[key] = value
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def _save_topos_key(topos_key: str, env_path: Path = USER_ENV_PATH) -> Path:
|
|
36
|
-
env_path.parent.mkdir(parents=True, exist_ok=True)
|
|
37
|
-
lines: list[str] = []
|
|
38
|
-
if env_path.exists():
|
|
39
|
-
lines = env_path.read_text(encoding="utf-8").splitlines()
|
|
40
|
-
|
|
41
|
-
updated = False
|
|
42
|
-
new_lines: list[str] = []
|
|
43
|
-
for line in lines:
|
|
44
|
-
stripped = line.strip()
|
|
45
|
-
if stripped.startswith("TOPOS_KEY="):
|
|
46
|
-
new_lines.append(f"TOPOS_KEY={topos_key}")
|
|
47
|
-
updated = True
|
|
48
|
-
else:
|
|
49
|
-
new_lines.append(line)
|
|
50
|
-
|
|
51
|
-
if not updated:
|
|
52
|
-
if new_lines and new_lines[-1].strip():
|
|
53
|
-
new_lines.append("")
|
|
54
|
-
new_lines.append(f"TOPOS_KEY={topos_key}")
|
|
55
|
-
|
|
56
|
-
env_path.write_text("\n".join(new_lines) + "\n", encoding="utf-8")
|
|
57
|
-
try:
|
|
58
|
-
env_path.chmod(0o600)
|
|
59
|
-
except OSError:
|
|
60
|
-
# Best-effort permissions (e.g. may fail on some filesystems).
|
|
61
|
-
pass
|
|
62
|
-
return env_path
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
@click.command()
|
|
66
|
-
@click.option(
|
|
67
|
-
"--db-path",
|
|
68
|
-
help="Database file path (SQLite). If not specified, uses auto-discovery.",
|
|
69
|
-
)
|
|
70
|
-
@click.option(
|
|
71
|
-
"--topos-key",
|
|
72
|
-
help="Topos key for this run (overrides saved key).",
|
|
73
|
-
)
|
|
74
|
-
@click.option(
|
|
75
|
-
"--set-topos-key",
|
|
76
|
-
metavar="KEY",
|
|
77
|
-
help="Save TOPOS_KEY to ~/.topos/.env and exit.",
|
|
78
|
-
)
|
|
79
|
-
@click.option(
|
|
80
|
-
"--discover",
|
|
81
|
-
is_flag=True,
|
|
82
|
-
help="Show discovered databases and exit",
|
|
83
|
-
)
|
|
84
|
-
@click.option(
|
|
85
|
-
"--port",
|
|
86
|
-
default=9000,
|
|
87
|
-
help="Server port (default: 9000)",
|
|
88
|
-
)
|
|
89
|
-
@click.option(
|
|
90
|
-
"--host",
|
|
91
|
-
default="0.0.0.0",
|
|
92
|
-
help="Host to bind to (default: 0.0.0.0)",
|
|
93
|
-
)
|
|
94
|
-
def main(db_path, topos_key, set_topos_key, discover, port, host) -> None:
|
|
95
|
-
"""Topos Control Plane API entry point."""
|
|
96
|
-
if set_topos_key:
|
|
97
|
-
env_path = _save_topos_key(set_topos_key)
|
|
98
|
-
click.echo(f"Saved TOPOS_KEY to {env_path}")
|
|
99
|
-
click.echo("You can now run: topos-node")
|
|
100
|
-
return
|
|
101
|
-
|
|
102
|
-
if discover:
|
|
103
|
-
databases = discover_databases()
|
|
104
|
-
if databases:
|
|
105
|
-
click.echo("Discovered databases:")
|
|
106
|
-
for db in databases:
|
|
107
|
-
click.echo(f" - {db}")
|
|
108
|
-
else:
|
|
109
|
-
click.echo("No existing databases found")
|
|
110
|
-
return
|
|
111
|
-
|
|
112
|
-
_load_env_file(USER_ENV_PATH)
|
|
113
|
-
_load_env_file(LEGACY_ENV_PATH)
|
|
114
|
-
|
|
115
|
-
if topos_key:
|
|
116
|
-
os.environ["TOPOS_KEY"] = topos_key
|
|
117
|
-
elif not os.getenv("TOPOS_KEY"):
|
|
118
|
-
os.environ["TOPOS_KEY"] = "dev-key"
|
|
119
|
-
click.echo("TOPOS_KEY not set; using local dev key")
|
|
120
|
-
|
|
121
|
-
from topos.app import app
|
|
122
|
-
|
|
123
|
-
if db_path:
|
|
124
|
-
os.environ["TOPOS_DATABASE_PATH"] = db_path
|
|
125
|
-
click.echo(f"Database path: {db_path}")
|
|
126
|
-
|
|
127
|
-
click.echo(f"Starting topos API on {host}:{port}")
|
|
128
|
-
uvicorn.run(app, host=host, port=port)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
if __name__ == "__main__":
|
|
132
|
-
main()
|
|
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
|
|
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
|