topos-node 1.4.2__tar.gz → 1.4.4__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.4.2/topos_node.egg-info → topos_node-1.4.4}/PKG-INFO +1 -1
- {topos_node-1.4.2 → topos_node-1.4.4}/pyproject.toml +1 -1
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_hub_pipeline_offline_first.py +4 -16
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_lane_shards.py +3 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/__version__.py +2 -2
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/person_graph.py +36 -6
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/home_chat.py +4 -1
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/ingestion_sources.py +91 -12
- topos_node-1.4.4/topos/api/nsfw_maintenance.py +106 -0
- topos_node-1.4.4/topos/api/permissions_ai_chat_capture.py +106 -0
- topos_node-1.4.4/topos/api/permissions_capture_receipts.py +74 -0
- topos_node-1.4.4/topos/api/permissions_native_probe.py +307 -0
- topos_node-1.4.4/topos/api/permissions_search_maintenance.py +90 -0
- topos_node-1.4.4/topos/api/permissions_source_installs.py +94 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/source_install.py +27 -9
- topos_node-1.4.4/topos/api/source_retention.py +157 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/source_scrub.py +2 -2
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/app.py +60 -4
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/auth.py +16 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/declared_field_map.py +6 -1
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/config/settings.py +2 -3
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/control_plane_client.py +5 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/__init__.py +15 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/enrichment.py +6 -1
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/home_chat.py +22 -3
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/ingest.py +38 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/permissions_v2.py +143 -3
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/permissions_v2_release.py +6 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/sources.py +122 -10
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/disclosure/canonical_writer.py +0 -18
- topos_node-1.4.4/topos/disclosure/disclosure_sweep.py +380 -0
- topos_node-1.4.4/topos/disclosure/nsfw_tags.py +456 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/disclosure/privacy_layer.py +132 -153
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/backends/huggingface.py +3 -5
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/model_cache.py +1 -2
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/registration.py +12 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/brief_fallback.py +9 -4
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/derivation_job.py +127 -17
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/pii_redaction_job.py +4 -2
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/person_reading.py +5 -3
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/surfaces.py +91 -30
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/writer.py +40 -9
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/fact_materializer.py +215 -23
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/graph_enrichers.py +152 -36
- topos_node-1.4.4/topos/features/entities/graph_inputs.py +391 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/graph_refresh.py +283 -28
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/maintenance.py +260 -81
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/owner.py +16 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/resolver.py +10 -5
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/facts/extract.py +25 -3
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/lifecycle/blackhole_rebuild.py +65 -18
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/lifecycle/derived_scrub.py +20 -2
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/provenance/roles.py +31 -3
- topos_node-1.4.4/topos/features/provenance/writer_class.py +132 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/brief_canonical_loader.py +22 -3
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/signal_object_store.py +8 -4
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/temporal/records.py +42 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/home_chat/store.py +83 -11
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/canonical_pipeline.py +246 -20
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/chatgpt_owner_snapshot.py +10 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/imessage_attributed_text.py +29 -2
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/ingest_helpers.py +107 -23
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/local_sync.py +606 -39
- topos_node-1.4.4/topos/ingestion/local_sync_jobs.py +175 -0
- topos_node-1.4.4/topos/ingestion/local_sync_schedule.py +705 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/manager.py +93 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/owner_snapshot.py +91 -13
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/sources/imessage_reader.py +144 -30
- topos_node-1.4.4/topos/permissions_v2/ai_chat_capture.py +416 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/automatic_message_review.py +117 -17
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/automatic_review_worker.py +71 -13
- topos_node-1.4.4/topos/permissions_v2/capture_receipts.py +711 -0
- topos_node-1.4.4/topos/permissions_v2/english_short_words.py +332 -0
- topos_node-1.4.4/topos/permissions_v2/entailment_grounding.py +928 -0
- topos_node-1.4.4/topos/permissions_v2/entity_boundary.py +957 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/evidence.py +211 -22
- topos_node-1.4.4/topos/permissions_v2/evidence_families.py +110 -0
- topos_node-1.4.4/topos/permissions_v2/evidence_time.py +117 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/identity.py +14 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/imessage_reconciliation.py +85 -16
- topos_node-1.4.4/topos/permissions_v2/imessage_standing.py +580 -0
- topos_node-1.4.4/topos/permissions_v2/inferred_facts.py +495 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/ingest_provenance.py +20 -6
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/ingest_snapshot_facts.py +2 -6
- topos_node-1.4.4/topos/permissions_v2/interest_family.py +1002 -0
- topos_node-1.4.4/topos/permissions_v2/interest_index.py +327 -0
- topos_node-1.4.4/topos/permissions_v2/interest_relabel.py +338 -0
- topos_node-1.4.4/topos/permissions_v2/interest_review.py +286 -0
- topos_node-1.4.4/topos/permissions_v2/journal_goal_field.py +1056 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/knowledge_contract.py +43 -8
- topos_node-1.4.4/topos/permissions_v2/knowledge_projections.py +663 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/ledger.py +49 -0
- topos_node-1.4.4/topos/permissions_v2/message_evidence.py +664 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/message_review_contract.py +42 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/native_claim_grounding.py +5 -0
- topos_node-1.4.4/topos/permissions_v2/native_imessage_probe.py +443 -0
- topos_node-1.4.4/topos/permissions_v2/permitted_derivation.py +785 -0
- topos_node-1.4.4/topos/permissions_v2/predicate_classes.py +116 -0
- topos_node-1.4.4/topos/permissions_v2/protection_doorbell.py +128 -0
- topos_node-1.4.4/topos/permissions_v2/reconciliation_provenance.py +587 -0
- topos_node-1.4.4/topos/permissions_v2/refresh_loop.py +1415 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/release.py +5 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/runtime.py +32 -15
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/search_index.py +681 -61
- topos_node-1.4.4/topos/permissions_v2/search_release.py +771 -0
- topos_node-1.4.4/topos/permissions_v2/search_timing.py +417 -0
- topos_node-1.4.4/topos/permissions_v2/search_transport.py +362 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/pipeline/job_runner.py +105 -18
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/protocol/handled_message_types.json +5 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/facts_direct.py +40 -11
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/retrieval.py +288 -32
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/scope_registry.json +36 -1
- topos_node-1.4.4/topos/sanitization/explicit_wording.py +902 -0
- topos_node-1.4.4/topos/sanitization/nsfw_classifier.py +71 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sanitization/prewarm.py +9 -22
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sources/definitions.py +15 -0
- topos_node-1.4.4/topos/sources/install_authority.py +99 -0
- topos_node-1.4.4/topos/sources/install_maintenance.py +228 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sources/install_service.py +82 -0
- topos_node-1.4.4/topos/sources/retention.py +1224 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/adapters/sqlite/stores.py +56 -0
- topos_node-1.4.4/topos/storage/canonical/activity_tables.py +46 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/ai_chat/canonicalizer.py +38 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/ai_chat/model.py +10 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/ai_chat/tables.py +28 -1
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/canonical_store.py +372 -9
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/conversations_tables.py +41 -1
- topos_node-1.4.4/topos/storage/db/migrations/activity_writer_columns_v1.py +69 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/actor_role_v1.py +30 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/entity_mentions_authored_v1.py +40 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/registry.py +8 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/temporal_fields_v1.py +5 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/raw/raw_tables_manager.py +56 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/upgrades/manifests.json +35 -0
- {topos_node-1.4.2 → topos_node-1.4.4/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.4.2 → topos_node-1.4.4}/topos_node.egg-info/SOURCES.txt +33 -0
- topos_node-1.4.2/topos/api/permissions_native_probe.py +0 -150
- topos_node-1.4.2/topos/api/permissions_search_maintenance.py +0 -44
- topos_node-1.4.2/topos/ingestion/local_sync_jobs.py +0 -139
- topos_node-1.4.2/topos/permissions_v2/entity_boundary.py +0 -415
- topos_node-1.4.2/topos/permissions_v2/knowledge_projections.py +0 -263
- topos_node-1.4.2/topos/permissions_v2/message_evidence.py +0 -287
- topos_node-1.4.2/topos/permissions_v2/native_imessage_probe.py +0 -218
- topos_node-1.4.2/topos/permissions_v2/reconciliation_provenance.py +0 -136
- topos_node-1.4.2/topos/permissions_v2/search_release.py +0 -411
- topos_node-1.4.2/topos/permissions_v2/search_transport.py +0 -115
- topos_node-1.4.2/topos/sanitization/nsfw_classifier.py +0 -152
- topos_node-1.4.2/topos/storage/canonical/activity_tables.py +0 -27
- {topos_node-1.4.2 → topos_node-1.4.4}/LICENSE +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/MANIFEST.in +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/README.md +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/setup.cfg +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/shared/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/shared/filtering.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/shared/schema_registry.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_extensions.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_profiles.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_sync_dep_pins.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/tests/test_topos_home_hermeticity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/dataset_resolution.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/luck_surface.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/messenger_directed.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/person_overlay.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/profiles.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/analytics/relationship_reads.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/analytics.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/app_registry.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/backup.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/compute_remote.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/connected_apps.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/conversation_context.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/data_commit.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/database_explorer.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/db.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/device.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/disk_space_config.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/engine_run.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/enrichment.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/filter_lab.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/health.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/llm.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/local_mcp.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/permissions_identity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/permissions_ingestion.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/query_api.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/shell.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/signal.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/sources.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/sources_overview.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/sync.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/tool_index.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/ui_config.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/uma_data.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/upgrades.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/usage.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/api/user_identity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/models.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/cli/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/cli/__main__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/cli/assets/topos_black.png +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/cli/commands.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/cli/tray.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/config/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/config/facts_llm.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/config/model_packs.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/contacts/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/contacts/identity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/api_models.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/db_health.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/device_helpers.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/errors.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/events.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/aggregate.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/common.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/config.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/device.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/graph_summary.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/mcp_client_elevations.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/mcp_clients.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/permissions_v2_identity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/permissions_v2_ingestion.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/query.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/shadow_rescore.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/handlers/uma.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/logging.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/metrics.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/routine_access.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/startup_banner.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/state.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/table_layers.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/core/types.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/defaults.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/disclosure/tier.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/backends/base.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/client.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/disk_space.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/engine.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/hosted_llm_wallet.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/intake.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/model_manager.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/ollama_runtime.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/router.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/tasks.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/transport.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/engine/validator.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/processor.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/record_progress.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/evals/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/extensions.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/commitments.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/kernels.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/net_subject_policy.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/person_bridge.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/router.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/social_bench.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/social_kernels.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/template.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/chatgpt_declared.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/discourse_graph.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/edges.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/linking.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/mention_lineage.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/mention_lineage_lane.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/reads.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/entities/structured_fields.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/facts/evidence_time.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/facts/reactions.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/facts/reads.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/facts/store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/lifecycle/blackhole.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/lifecycle/blackhole_guard.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/lifecycle/record_protection.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/conversation_windows.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/derived_index.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/service.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/stats/engine.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/stats/fold.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/stats/insights.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/temporal/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/temporal/points.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/triage/badges.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/triage/daily.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/triage/intents.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/filter_lab/service.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/filter_lab/store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/home_chat/schema.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/local_exports.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/chatgpt_export.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/transcript_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/progress.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/lineage/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/lineage/provenance.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/lineage/tracker.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/mcp_clients.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/observability/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/observability/alerts.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/observability/metrics.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/observability/tracing.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/openai_client.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/owner_key.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/canonical.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/canonical_floor.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/chatgpt_coverage.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/contract.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/evidence_review_runtime.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/evidence_reviews.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/exclusion_floor.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/experiments/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/experiments/__main__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/experiments/evaluators.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/experiments/fact_bridge.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/experiments/harness.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/experiments/models.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/experiments/retention.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/experiments/scoring.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/experiments/source_bridge.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/experiments/synthetic.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/fact_contract.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/fact_eligibility.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/fact_policy.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/fact_projection.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/fact_release.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/fact_release_transport.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/forwarding.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/identity_attestation.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/identity_dispatch.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/identity_protocol.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/ingest_dispatch.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/ingest_protocol.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/ledger_retention.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/node_protocol.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/opaque_ids.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/projection_review_runtime.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/projection_reviews.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/protection_clock.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/protocol.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/reconciliation_facts.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/registry.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/release_transport.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/search_contract.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/search_lanes.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/shadow_index.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/shadow_labeler_local.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/shadow_labelers.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/shadow_rescore.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/shadow_rubric.pinned.md +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/signing.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/permissions_v2/snapshot_message_facts.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/pipeline/audit.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/pipeline/job_secrets.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/pipeline/stages.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/principal.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/profiles.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/projections/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/protocol/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/protocol/narrowing_vocabulary.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/protocol/retrieval_text_contract.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/aggregate.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/audit.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/closeness.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/cohort_resolvers.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/collaborators.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/ddr.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/disclosure.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/entity_window.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/exclusion.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/fingerprint.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/game_layer.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/grant_cache.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/graph_lane.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/inference.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/intent.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/journal_event_lane.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/manifest.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/minimizer.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/narrowing.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/negotiation.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/overheard.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/pipeline.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/planner.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/runtime.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/scope_head.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/session.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/session_utils.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/source_generation.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/truth_door.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/truth_facts.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/types.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/verify.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/query/verify_modes.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/rate_limit.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/relay_stamp.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/routines/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/routines/schema.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/routines/store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/runtime_update.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sanitization/hub_pipeline.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/scope_resolution.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/container.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/interfaces.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/llm/base.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/llm/openai.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/local.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/services/postgres.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sources/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sources/registry.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/startup_banner.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/client.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/backup_custody.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/owner_only_records_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/permissions_fact_lineage_keys_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/permissions_message_context_indexes_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/permissions_read_path_indexes_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/transcripts_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/paths.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/schema.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/derived_row_identity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/source_settings.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/storage/user_identity.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sync/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sync/client.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/sync_handlers.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/testing/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/testing/lifespan.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/uds.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/uma_authority.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/uma_filters.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/uma_resource_id.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/uma_rpt.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/upgrades/runner.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/utils/base_object.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos/websocket_client.py +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.4.2 → topos_node-1.4.4}/topos_node.egg-info/top_level.txt +0 -0
|
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
|
|
|
9
9
|
|
|
10
10
|
[project]
|
|
11
11
|
name = "topos-node"
|
|
12
|
-
version = "1.4.
|
|
12
|
+
version = "1.4.4"
|
|
13
13
|
description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
|
|
14
14
|
readme = "README.md"
|
|
15
15
|
license = "Apache-2.0"
|
|
@@ -181,26 +181,14 @@ def test_the_privacy_filter_loads_through_the_cache_first(calls, monkeypatch):
|
|
|
181
181
|
assert kwargs == {"tokenizer": ("AutoTokenizer", repo), "device": "cpu"}
|
|
182
182
|
|
|
183
183
|
|
|
184
|
-
def
|
|
185
|
-
|
|
186
|
-
):
|
|
184
|
+
def test_the_nsfw_tag_loads_nothing(calls, monkeypatch):
|
|
185
|
+
"""The NSFW tag is a rule now: no Hub call, no cache slot, no pipeline, whatever the text."""
|
|
187
186
|
from topos.engine import model_cache
|
|
188
187
|
from topos.sanitization import nsfw_classifier
|
|
189
188
|
|
|
190
|
-
repo = nsfw_classifier.DEFAULT_NSFW_CLASSIFIER_MODEL
|
|
191
189
|
monkeypatch.setattr(model_cache, "get_model_cache", lambda: _PassThroughCache())
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
assert [(name, kw) for name, _repo, kw in calls.from_pretrained] == [
|
|
196
|
-
("AutoTokenizer", {"local_files_only": True}),
|
|
197
|
-
("AutoModelForSequenceClassification", {"local_files_only": True}),
|
|
198
|
-
]
|
|
199
|
-
((task, model, kwargs),) = calls.pipeline
|
|
200
|
-
assert task == "text-classification"
|
|
201
|
-
assert model == ("AutoModelForSequenceClassification", repo)
|
|
202
|
-
# top_k=None is what makes the classifier return both labels, not only the top one.
|
|
203
|
-
assert kwargs == {"tokenizer": ("AutoTokenizer", repo), "top_k": None}
|
|
190
|
+
assert nsfw_classifier.classify_nsfw_text("a pornographic film")[0] is True
|
|
191
|
+
assert calls.from_pretrained == [] and calls.pipeline == []
|
|
204
192
|
|
|
205
193
|
|
|
206
194
|
def test_settings_switch_off_the_safetensors_conversion_probe():
|
|
@@ -137,6 +137,9 @@ def test_no_prefix_is_claimed_twice() -> None:
|
|
|
137
137
|
("tests/permissions_v2/test_evidence.py::test_x", "permissions_v2"),
|
|
138
138
|
# the longer prefix wins over tests/permissions_v2/
|
|
139
139
|
("tests/permissions_v2/test_message_search_index.py::test_x", "message_search_gap"),
|
|
140
|
+
("tests/permissions_v2/test_journal_family.py::test_x", "permissions_v2_families"),
|
|
141
|
+
# test_message_search_* stays with message_search_gap; test_search_* is the families slice
|
|
142
|
+
("tests/permissions_v2/test_search_send_token.py::test_x", "permissions_v2_families"),
|
|
140
143
|
("tests/gap/p3/engine/test_x.py::TestY::test_z[a-b]", "message_search_gap"),
|
|
141
144
|
("tests/features/test_x.py::test_y", "features_topos_core"),
|
|
142
145
|
("tests/topos/test_x.py::test_y", "features_topos_core"),
|
|
@@ -403,6 +403,15 @@ BAND_DISCUSSED = "discussed"
|
|
|
403
403
|
BAND_AMBIENT = "ambient"
|
|
404
404
|
BAND_ORDER = (BAND_CORE, BAND_NAMED, BAND_DISCUSSED, BAND_AMBIENT)
|
|
405
405
|
|
|
406
|
+
#: How often a name has to come up before it belongs on the default graph.
|
|
407
|
+
#:
|
|
408
|
+
#: Same count as the reading lane (`person_reading.MIN_OWNER_ROWS`). A local model
|
|
409
|
+
#: and a node on the picture are the same decision: people you message, and people
|
|
410
|
+
#: named often in conversations you take part in. A name that merely appears in two
|
|
411
|
+
#: connectors is exposure, not a relationship — that rule is what filled the graph
|
|
412
|
+
#: with everybody a data source had ever mentioned.
|
|
413
|
+
FREQUENT_MENTIONS = 5
|
|
414
|
+
|
|
406
415
|
#: Sources whose rows are exposure rather than expression. Read from the SOURCE CONTRACT
|
|
407
416
|
#: (`sources.registry.effective_posture`), never from a list of connector names — the first
|
|
408
417
|
#: draft of this model ranked grow_journal > imessage > browser_visits, which is three
|
|
@@ -441,17 +450,38 @@ def classify_band(*, messaged: bool, owner_authored: int, distinct_sources: int,
|
|
|
441
450
|
|
|
442
451
|
The reason is not decoration. "Seen once, on a page you visited" is falsifiable and the
|
|
443
452
|
owner can correct it; a rank cannot be argued with.
|
|
453
|
+
|
|
454
|
+
Default-visible bands are core and named. Discussed and ambient stay in the
|
|
455
|
+
data and off the picture until the owner asks for them.
|
|
456
|
+
|
|
457
|
+
* core — you exchanged messages with them
|
|
458
|
+
* named — you wrote their name often, or it comes up often in conversations
|
|
459
|
+
you took part in (`FREQUENT_MENTIONS`, the reading lane's bar)
|
|
460
|
+
* discussed — a real mention, but not often enough to feature
|
|
461
|
+
* ambient — passing sightings, including a name that only shows up because
|
|
462
|
+
two different data sources both extracted it
|
|
444
463
|
"""
|
|
445
464
|
if messaged:
|
|
446
465
|
return BAND_CORE, "you exchange messages with them"
|
|
466
|
+
if owner_authored >= FREQUENT_MENTIONS:
|
|
467
|
+
times = "time" if owner_authored == 1 else "times"
|
|
468
|
+
return BAND_NAMED, f"you wrote their name {owner_authored} {times}"
|
|
469
|
+
if non_ambient_mentions >= FREQUENT_MENTIONS:
|
|
470
|
+
return BAND_NAMED, (
|
|
471
|
+
f"mentioned {non_ambient_mentions} times in things you took part in"
|
|
472
|
+
)
|
|
447
473
|
if owner_authored > 0:
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
return BAND_NAMED, f"they turn up in {distinct_sources} different places"
|
|
451
|
-
if non_ambient_mentions > 0 and mention_count >= 2:
|
|
452
|
-
return BAND_DISCUSSED, f"mentioned {mention_count} times in things you took part in"
|
|
474
|
+
times = "time" if owner_authored == 1 else "times"
|
|
475
|
+
return BAND_DISCUSSED, f"you wrote their name {owner_authored} {times}"
|
|
453
476
|
if non_ambient_mentions > 0:
|
|
454
|
-
|
|
477
|
+
times = "time" if mention_count == 1 else "times"
|
|
478
|
+
return BAND_DISCUSSED, (
|
|
479
|
+
f"mentioned {mention_count} {times} in things you took part in"
|
|
480
|
+
)
|
|
481
|
+
if distinct_sources >= 2:
|
|
482
|
+
return BAND_AMBIENT, (
|
|
483
|
+
f"named in {distinct_sources} places, but you have not talked with them"
|
|
484
|
+
)
|
|
455
485
|
return BAND_AMBIENT, ("seen once in passing" if mention_count <= 1
|
|
456
486
|
else f"seen {mention_count} times in passing, never discussed")
|
|
457
487
|
|
|
@@ -57,7 +57,10 @@ async def get_home_chat_session(
|
|
|
57
57
|
user_id: str = Query(..., min_length=1),
|
|
58
58
|
) -> Dict[str, Any]:
|
|
59
59
|
conn = _get_conn()
|
|
60
|
-
|
|
60
|
+
try:
|
|
61
|
+
row = home_chat_store.get_session(conn, user_id=user_id.strip(), session_id=session_id.strip())
|
|
62
|
+
except ValueError as exc:
|
|
63
|
+
raise _map_store_error(exc) from exc
|
|
61
64
|
if not row:
|
|
62
65
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Session not found")
|
|
63
66
|
return row
|
|
@@ -7,8 +7,9 @@ from datetime import datetime, timezone
|
|
|
7
7
|
from typing import Optional
|
|
8
8
|
|
|
9
9
|
from fastapi import APIRouter, Body, Depends, Query, Request # noqa: F401 Body used in put_signal_settings
|
|
10
|
+
from fastapi.security import HTTPAuthorizationCredentials
|
|
10
11
|
|
|
11
|
-
from ..auth import require_api_key, require_owner_unless_legacy
|
|
12
|
+
from ..auth import bearer_scheme, require_api_key, require_owner_unless_legacy, resolve_request_principal
|
|
12
13
|
from ..core.state import get_db_connection
|
|
13
14
|
from ..ingestion.ingest_helpers import ingest_file_payload, ingest_ui_payload, resolve_file_format
|
|
14
15
|
from ..ingestion.local_sync import run_signal_upload
|
|
@@ -57,8 +58,14 @@ async def ingest_source(
|
|
|
57
58
|
source = REGISTRY.get(source_id)
|
|
58
59
|
if not source:
|
|
59
60
|
return {"status": "error", "error": "unknown source_id"}
|
|
61
|
+
# The door that wrote these rows, from the credential, never the body
|
|
62
|
+
# (features/provenance/writer_class.py). This route has no principal
|
|
63
|
+
# contextvar of its own, so the helpers are told explicitly.
|
|
64
|
+
from ..auth import resolve_request_writer_class
|
|
65
|
+
from ..features.provenance.writer_class import WRITER_OWNER_IMPORT
|
|
60
66
|
|
|
61
67
|
if is_file_delivery(source):
|
|
68
|
+
writer_class = await resolve_request_writer_class(request, owner_class=WRITER_OWNER_IMPORT)
|
|
62
69
|
file = None
|
|
63
70
|
if request.headers.get("content-type", "").startswith("multipart/"):
|
|
64
71
|
form = await request.form()
|
|
@@ -91,6 +98,7 @@ async def ingest_source(
|
|
|
91
98
|
file_path=file_path,
|
|
92
99
|
source_id=source_id,
|
|
93
100
|
file_format=resolve_file_format(source_definition=source, file_path=file_path),
|
|
101
|
+
writer_class=writer_class,
|
|
94
102
|
)
|
|
95
103
|
payload_bytes = await file.read()
|
|
96
104
|
guard = await submit_usage_guard_check(
|
|
@@ -109,6 +117,7 @@ async def ingest_source(
|
|
|
109
117
|
file_bytes=payload_bytes,
|
|
110
118
|
source_id=source_id,
|
|
111
119
|
file_format=resolve_file_format(source_definition=source),
|
|
120
|
+
writer_class=writer_class,
|
|
112
121
|
)
|
|
113
122
|
|
|
114
123
|
if accepts_app_ingest(source):
|
|
@@ -124,6 +133,7 @@ async def ingest_source(
|
|
|
124
133
|
schema_id=source.schema_id,
|
|
125
134
|
payload=payload,
|
|
126
135
|
source_id=source_id, # Pass source_id to enable direct processing
|
|
136
|
+
writer_class=await resolve_request_writer_class(request),
|
|
127
137
|
)
|
|
128
138
|
|
|
129
139
|
if source.delivery == DELIVERY_LOCAL_SYNC:
|
|
@@ -136,10 +146,26 @@ async def ingest_source(
|
|
|
136
146
|
return {"status": "error", "error": "unsupported source type"}
|
|
137
147
|
|
|
138
148
|
|
|
149
|
+
async def _proof_standing_as(principal, action: str, body) -> dict:
|
|
150
|
+
"""The owner's standing iMessage attestation through this door, as the websocket door runs it
|
|
151
|
+
(``core.handlers.sources._proof_standing``), under the request's own principal. ``imessage_standing``
|
|
152
|
+
refuses anyone but the owner on the owner's channels (``owner_authority_required``)."""
|
|
153
|
+
from ..core.handlers.sources import _proof_standing
|
|
154
|
+
from ..principal import reset_principal, set_principal
|
|
155
|
+
|
|
156
|
+
token = set_principal(principal)
|
|
157
|
+
try:
|
|
158
|
+
return await asyncio.to_thread(_proof_standing, action, body)
|
|
159
|
+
finally:
|
|
160
|
+
reset_principal(token)
|
|
161
|
+
|
|
162
|
+
|
|
139
163
|
@router.get("/sources/{source_id}/settings", dependencies=[Depends(require_api_key)])
|
|
140
164
|
async def get_source_settings_endpoint(
|
|
141
165
|
source_id: str,
|
|
166
|
+
request: Request,
|
|
142
167
|
dataset_id: Optional[str] = Query(default=None),
|
|
168
|
+
credentials: Optional[HTTPAuthorizationCredentials] = Depends(bearer_scheme),
|
|
143
169
|
):
|
|
144
170
|
"""Get source settings: enabled, last_sync_at, last_error (for local_sync: imessage, signal)."""
|
|
145
171
|
source = REGISTRY.get(source_id)
|
|
@@ -151,16 +177,43 @@ async def get_source_settings_endpoint(
|
|
|
151
177
|
if not conn:
|
|
152
178
|
return {"status": "error", "error": "Database not available"}
|
|
153
179
|
settings = get_source_settings(conn, dataset_id, source_id)
|
|
154
|
-
|
|
180
|
+
sync_settings = await asyncio.to_thread(_sync_settings_in_worker, dataset_id, source_id)
|
|
181
|
+
if source_id == "imessage":
|
|
182
|
+
# The standing attestation's state is the owner's to see (the websocket door's rule).
|
|
183
|
+
principal = resolve_request_principal(request, credentials)
|
|
184
|
+
if principal is not None and principal.cls == "owner_app":
|
|
185
|
+
sync_settings["proof_standing"] = await _proof_standing_as(principal, "status", None)
|
|
186
|
+
return {"status": "ok", "dataset_id": dataset_id, "source_id": source_id, **settings, **sync_settings}
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _sync_settings_in_worker(dataset_id: str, source_id: str, changes: Optional[dict] = None) -> dict:
|
|
190
|
+
"""Save (when ``changes``) and describe the sync schedule, on this thread's own connection.
|
|
191
|
+
|
|
192
|
+
The same fields the websocket door returns, so the two doors cannot drift.
|
|
193
|
+
"""
|
|
194
|
+
from ..ingestion.local_sync_schedule import describe_sync_settings, put_schedule
|
|
195
|
+
|
|
196
|
+
own = get_db_connection()
|
|
197
|
+
if own is None:
|
|
198
|
+
return {}
|
|
199
|
+
if changes is not None:
|
|
200
|
+
put_schedule(own, dataset_id, source_id, changes)
|
|
201
|
+
return describe_sync_settings(own, dataset_id, source_id)
|
|
155
202
|
|
|
156
203
|
|
|
157
204
|
@router.put("/sources/{source_id}/settings", dependencies=[Depends(require_api_key)])
|
|
158
205
|
async def put_source_settings_endpoint(
|
|
159
206
|
source_id: str,
|
|
207
|
+
request: Request,
|
|
160
208
|
dataset_id: Optional[str] = Query(default=None),
|
|
161
209
|
body: Optional[dict] = Body(default=None),
|
|
210
|
+
credentials: Optional[HTTPAuthorizationCredentials] = Depends(bearer_scheme),
|
|
162
211
|
):
|
|
163
|
-
"""Set source settings (e.g. enabled, exclude_spam). Valid for local_sync sources (imessage, signal).
|
|
212
|
+
"""Set source settings (e.g. enabled, exclude_spam, sync_schedule). Valid for local_sync sources (imessage, signal).
|
|
213
|
+
|
|
214
|
+
``sync_schedule`` is owner-only, under the same rule as the sync route: it
|
|
215
|
+
makes the node sync on its own clock.
|
|
216
|
+
"""
|
|
164
217
|
source = REGISTRY.get(source_id)
|
|
165
218
|
if not source:
|
|
166
219
|
return {"status": "error", "error": "unknown source_id"}
|
|
@@ -173,22 +226,44 @@ async def put_source_settings_endpoint(
|
|
|
173
226
|
enabled = body.get("enabled")
|
|
174
227
|
posture_provided = "posture" in body
|
|
175
228
|
exclude_spam_provided = "exclude_spam" in body
|
|
176
|
-
|
|
177
|
-
|
|
229
|
+
schedule_provided = "sync_schedule" in body
|
|
230
|
+
# The owner's standing iMessage attestation (owner decision 1), as on the websocket door.
|
|
231
|
+
standing_provided = "proof_standing" in body
|
|
232
|
+
if standing_provided and source_id != "imessage":
|
|
233
|
+
return {"status": "error", "error": "proof_standing only applies to imessage"}
|
|
234
|
+
if (enabled is None and not posture_provided and not exclude_spam_provided and not schedule_provided
|
|
235
|
+
and not standing_provided):
|
|
236
|
+
return {"status": "error", "error": "enabled, posture, exclude_spam, sync_schedule, or proof_standing required in body"}
|
|
237
|
+
if schedule_provided or standing_provided:
|
|
238
|
+
# Raises 403 owner_mode_required for any principal but the owner's.
|
|
239
|
+
require_owner_unless_legacy(request, credentials)
|
|
240
|
+
standing_request = body.get("proof_standing") if isinstance(body.get("proof_standing"), dict) else {}
|
|
241
|
+
if standing_provided and standing_request.get("action") not in ("status", "preview", "arm", "disarm"):
|
|
242
|
+
return {"status": "error", "error": "proof_standing.action must be status, preview, arm or disarm"}
|
|
178
243
|
conn = get_db_connection()
|
|
179
244
|
if not conn:
|
|
180
245
|
return {"status": "error", "error": "Database not available"}
|
|
181
|
-
put_kwargs: dict = {"enabled": enabled}
|
|
182
|
-
if posture_provided:
|
|
183
|
-
put_kwargs["posture"] = body.get("posture")
|
|
184
|
-
if exclude_spam_provided:
|
|
185
|
-
put_kwargs["exclude_spam"] = bool(body.get("exclude_spam"))
|
|
186
246
|
try:
|
|
187
|
-
|
|
247
|
+
if enabled is not None or posture_provided or exclude_spam_provided:
|
|
248
|
+
put_kwargs: dict = {"enabled": enabled}
|
|
249
|
+
if posture_provided:
|
|
250
|
+
put_kwargs["posture"] = body.get("posture")
|
|
251
|
+
if exclude_spam_provided:
|
|
252
|
+
put_kwargs["exclude_spam"] = bool(body.get("exclude_spam"))
|
|
253
|
+
put_source_settings(conn, dataset_id, source_id, **put_kwargs)
|
|
254
|
+
sync_settings = await asyncio.to_thread(
|
|
255
|
+
_sync_settings_in_worker,
|
|
256
|
+
dataset_id,
|
|
257
|
+
source_id,
|
|
258
|
+
body.get("sync_schedule") if schedule_provided else None,
|
|
259
|
+
)
|
|
188
260
|
except ValueError as exc:
|
|
189
261
|
return {"status": "error", "error": str(exc)}
|
|
262
|
+
if standing_provided:
|
|
263
|
+
sync_settings["proof_standing"] = await _proof_standing_as(
|
|
264
|
+
resolve_request_principal(request, credentials), standing_request["action"], standing_request)
|
|
190
265
|
settings = get_source_settings(conn, dataset_id, source_id) or {}
|
|
191
|
-
return {"status": "ok", "dataset_id": dataset_id, "source_id": source_id, **settings}
|
|
266
|
+
return {"status": "ok", "dataset_id": dataset_id, "source_id": source_id, **settings, **sync_settings}
|
|
192
267
|
|
|
193
268
|
|
|
194
269
|
@router.post("/sources/{source_id}/sync", dependencies=[Depends(require_owner_unless_legacy)])
|
|
@@ -291,12 +366,16 @@ async def upload_signal_export(
|
|
|
291
366
|
file_bytes = await f.read()
|
|
292
367
|
if not file_bytes:
|
|
293
368
|
return {"status": "error", "error": "file required (multipart/form-data)"}
|
|
369
|
+
from ..auth import resolve_request_writer_class
|
|
370
|
+
from ..features.provenance.writer_class import WRITER_OWNER_IMPORT
|
|
371
|
+
|
|
294
372
|
result = await asyncio.to_thread(
|
|
295
373
|
run_signal_upload,
|
|
296
374
|
dataset_id,
|
|
297
375
|
file_bytes,
|
|
298
376
|
my_phone_number=my_phone_number,
|
|
299
377
|
owner_user_id=owner_user_id,
|
|
378
|
+
writer_class=await resolve_request_writer_class(request, owner_class=WRITER_OWNER_IMPORT),
|
|
300
379
|
)
|
|
301
380
|
return result
|
|
302
381
|
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""Owner socket maintenance of the NSFW tags: the explicit-wording sweep, by hand, with counts.
|
|
2
|
+
|
|
3
|
+
``POST /v1/privacy/nsfw-recheck`` on the node's owner socket only (the 0600 UDS; no bearer, no relay). Body, all
|
|
4
|
+
optional: ``{"dry_run": true|false, "tables": [<table>, ...]}``. ``dry_run`` defaults to true: a bare POST
|
|
5
|
+
evaluates every row of the three tables with the rule and answers what a write run would change, writing nothing.
|
|
6
|
+
``"dry_run": false`` runs the same sweep the node runs for itself at startup (``topos.disclosure.nsfw_tags``),
|
|
7
|
+
over every row, now. ``tables`` limits either to some of ``journal_entries``, ``conversation_messages`` and
|
|
8
|
+
``ai_chat_messages``. The answer is counts (``nsfw_tags.COUNTS`` per table and in total); no id, text or
|
|
9
|
+
matched word.
|
|
10
|
+
|
|
11
|
+
``POST /v1/privacy/disclosure-check`` on the same socket counts the PII disclosure backlog the node's own sweep is
|
|
12
|
+
working through (``topos.disclosure.disclosure_sweep``), and never writes.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import asyncio
|
|
18
|
+
from typing import Any, Optional
|
|
19
|
+
|
|
20
|
+
from fastapi import APIRouter, Body, Depends, HTTPException
|
|
21
|
+
from fastapi.responses import JSONResponse
|
|
22
|
+
|
|
23
|
+
from topos.auth import resolve_request_principal
|
|
24
|
+
|
|
25
|
+
router = APIRouter(prefix="/v1/privacy", tags=["privacy-owner-maintenance"])
|
|
26
|
+
|
|
27
|
+
_NO_STORE = {"Cache-Control": "no-store"}
|
|
28
|
+
_FIELDS = frozenset({"dry_run", "tables"})
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _invalid() -> HTTPException:
|
|
32
|
+
return HTTPException(400, "nsfw_recheck_payload_invalid", headers=_NO_STORE)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _valid_tables(value: Any) -> bool:
|
|
36
|
+
from topos.disclosure.nsfw_tags import TABLES
|
|
37
|
+
|
|
38
|
+
return (type(value) is list and bool(value) and all(type(item) is str for item in value)
|
|
39
|
+
and len(set(value)) == len(value) and set(value) <= set(TABLES))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@router.post("/nsfw-recheck")
|
|
43
|
+
async def nsfw_recheck(payload: Optional[dict] = Body(None), principal=Depends(resolve_request_principal)):
|
|
44
|
+
from topos.principal import OWNER_APP
|
|
45
|
+
|
|
46
|
+
if principal is None or principal.cls != OWNER_APP or principal.channel != "uds":
|
|
47
|
+
raise HTTPException(403, "owner_socket_required", headers=_NO_STORE)
|
|
48
|
+
body = {} if payload is None else payload
|
|
49
|
+
if not isinstance(body, dict) or not set(body) <= _FIELDS:
|
|
50
|
+
raise _invalid()
|
|
51
|
+
dry_run = body.get("dry_run", True)
|
|
52
|
+
tables = body.get("tables")
|
|
53
|
+
if type(dry_run) is not bool or (tables is not None and not _valid_tables(tables)):
|
|
54
|
+
raise _invalid()
|
|
55
|
+
|
|
56
|
+
def apply():
|
|
57
|
+
from topos.core.state import get_db_connection
|
|
58
|
+
from topos.disclosure.nsfw_tags import run_sweep
|
|
59
|
+
from topos.runtime_shutdown import is_shutdown_requested
|
|
60
|
+
|
|
61
|
+
return run_sweep(get_db_connection, dry_run=dry_run, tables=tables, stop=is_shutdown_requested,
|
|
62
|
+
full=not dry_run)
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
result = await asyncio.to_thread(apply)
|
|
66
|
+
except Exception: # noqa: BLE001 -- no path, row or exception text leaves the node
|
|
67
|
+
raise HTTPException(503, "nsfw_recheck_unavailable", headers=_NO_STORE) from None
|
|
68
|
+
return JSONResponse(result, headers=_NO_STORE)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
_DISCLOSURE_FIELDS = frozenset({"tables", "mode"})
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@router.post("/disclosure-check")
|
|
75
|
+
async def disclosure_check(payload: Optional[dict] = Body(None), principal=Depends(resolve_request_principal)):
|
|
76
|
+
"""Counts of the PII disclosure backlog, on the owner socket only; never writes.
|
|
77
|
+
|
|
78
|
+
Body, all optional: ``{"tables": [<table>, ...], "mode": "verify"|"pending"}``. ``verify`` (the default) reads
|
|
79
|
+
every row of the disclosed tables and checks each field's hash against its text, as the node's own sweep does
|
|
80
|
+
(``topos.disclosure.disclosure_sweep``); ``pending`` counts only fields with no disclosure at all. The answer is
|
|
81
|
+
counts per table and in total (``missing`` and ``stale`` are what the sweep still has to redact); no id or text.
|
|
82
|
+
The sweep itself needs no command: it runs at startup and on its intervals.
|
|
83
|
+
"""
|
|
84
|
+
from topos.principal import OWNER_APP
|
|
85
|
+
|
|
86
|
+
if principal is None or principal.cls != OWNER_APP or principal.channel != "uds":
|
|
87
|
+
raise HTTPException(403, "owner_socket_required", headers=_NO_STORE)
|
|
88
|
+
body = {} if payload is None else payload
|
|
89
|
+
if not isinstance(body, dict) or not set(body) <= _DISCLOSURE_FIELDS:
|
|
90
|
+
raise HTTPException(400, "disclosure_check_payload_invalid", headers=_NO_STORE)
|
|
91
|
+
from topos.disclosure.disclosure_sweep import MODES, run_sweep
|
|
92
|
+
from topos.disclosure.field_registry import PII_DISCLOSURE_FIELDS
|
|
93
|
+
|
|
94
|
+
tables = body.get("tables")
|
|
95
|
+
mode = body.get("mode", "verify")
|
|
96
|
+
if mode not in MODES or (tables is not None and not (
|
|
97
|
+
type(tables) is list and tables and all(type(t) is str for t in tables)
|
|
98
|
+
and len(set(tables)) == len(tables) and set(tables) <= set(PII_DISCLOSURE_FIELDS))):
|
|
99
|
+
raise HTTPException(400, "disclosure_check_payload_invalid", headers=_NO_STORE)
|
|
100
|
+
from topos.core.state import get_db_connection
|
|
101
|
+
|
|
102
|
+
try:
|
|
103
|
+
result = await run_sweep(get_db_connection, mode=mode, dry_run=True, tables=tables)
|
|
104
|
+
except Exception: # noqa: BLE001 -- no path, row or exception text leaves the node
|
|
105
|
+
raise HTTPException(503, "disclosure_check_unavailable", headers=_NO_STORE) from None
|
|
106
|
+
return JSONResponse(result, headers=_NO_STORE)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""Owner socket: attest that pre-stamp AI-chat rows came from the owner's own capture app (OD-39).
|
|
2
|
+
|
|
3
|
+
Rows the owner's capture app wrote before the node recorded writer classes carry
|
|
4
|
+
no writer, so nothing on the row can tell them from a grantee's. The owner says
|
|
5
|
+
so once, explicitly, and the node keeps the statement as an auditable receipt
|
|
6
|
+
(``topos/permissions_v2/ai_chat_capture.py``); the rows themselves are never
|
|
7
|
+
re-labelled. Two steps: ``preview`` returns counts and a digest of exactly the
|
|
8
|
+
rows it would cover (no ids, no content); ``attest`` records a receipt only for
|
|
9
|
+
that digest, with ``confirm: true``. ``revoke`` withdraws a receipt. Only the
|
|
10
|
+
owner's socket may call any of them: an owner key over TCP, a relay message and a
|
|
11
|
+
third party are refused.
|
|
12
|
+
"""
|
|
13
|
+
import asyncio
|
|
14
|
+
import sqlite3
|
|
15
|
+
|
|
16
|
+
from fastapi import APIRouter, Depends, HTTPException
|
|
17
|
+
from fastapi.responses import JSONResponse
|
|
18
|
+
|
|
19
|
+
from topos.auth import resolve_request_principal
|
|
20
|
+
from topos.permissions_v2.canonical import PolicyError
|
|
21
|
+
|
|
22
|
+
router = APIRouter(prefix="/v1/permissions-beta/v2/ai-chat/capture-attestation",
|
|
23
|
+
tags=["permissions-owner-ai-chat-capture"])
|
|
24
|
+
|
|
25
|
+
_NO_STORE = {"Cache-Control": "no-store"}
|
|
26
|
+
_CONFLICT = {"capture_attestation_preview_stale", "capture_receipt_revoked"}
|
|
27
|
+
_INVALID = {"capture_attestation_invalid", "capture_attestation_unconfirmed", "capture_receipt_unknown",
|
|
28
|
+
# The generalised receipts' named dataset (permissions_capture_receipts.py): not one install's to name.
|
|
29
|
+
"capture_attestation_dataset_unknown", "capture_attestation_dataset_not_this_node",
|
|
30
|
+
"capture_attestation_dataset_posture_unknown"}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _require_owner_socket(principal) -> None:
|
|
34
|
+
from topos.principal import OWNER_APP
|
|
35
|
+
if principal is None or principal.cls != OWNER_APP or principal.channel != "uds":
|
|
36
|
+
raise HTTPException(403, "owner_socket_required", headers=_NO_STORE)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _run(operation, *, write: bool):
|
|
40
|
+
"""(owner_id, conn) -> result, on the served canonical database under the write gate."""
|
|
41
|
+
from topos.permissions_v2.runtime import get_runtime
|
|
42
|
+
from topos.storage.db.write_gate import with_db_write
|
|
43
|
+
|
|
44
|
+
runtime = get_runtime()
|
|
45
|
+
owner_id = runtime.protocol.ledger.identity.owner_id
|
|
46
|
+
path = runtime.protocol.canonical_database
|
|
47
|
+
with with_db_write():
|
|
48
|
+
conn = sqlite3.connect(path.as_uri() + ("?mode=rw" if write else "?mode=ro"), uri=True, timeout=30)
|
|
49
|
+
try:
|
|
50
|
+
conn.execute("BEGIN IMMEDIATE" if write else "BEGIN")
|
|
51
|
+
result = operation(owner_id, conn)
|
|
52
|
+
conn.commit() if write else conn.rollback()
|
|
53
|
+
return result
|
|
54
|
+
except BaseException:
|
|
55
|
+
conn.rollback()
|
|
56
|
+
raise
|
|
57
|
+
finally:
|
|
58
|
+
conn.close()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
async def _respond(operation, *, write: bool):
|
|
62
|
+
try:
|
|
63
|
+
result = await asyncio.to_thread(_run, operation, write=write)
|
|
64
|
+
except PolicyError as exc:
|
|
65
|
+
if exc.code in {"permissions_v2_disabled", "beta_configuration_required"}:
|
|
66
|
+
raise HTTPException(404, "permissions_v2_disabled", headers=_NO_STORE) from None
|
|
67
|
+
code = 409 if exc.code in _CONFLICT else 400 if exc.code in _INVALID else 403
|
|
68
|
+
raise HTTPException(code, exc.code, headers=_NO_STORE) from None
|
|
69
|
+
except HTTPException:
|
|
70
|
+
raise
|
|
71
|
+
except Exception:
|
|
72
|
+
raise HTTPException(503, "capture_attestation_unavailable", headers=_NO_STORE) from None
|
|
73
|
+
return JSONResponse(result, headers=_NO_STORE)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@router.post("/preview")
|
|
77
|
+
async def preview(payload: dict, principal=Depends(resolve_request_principal)):
|
|
78
|
+
from topos.permissions_v2 import ai_chat_capture
|
|
79
|
+
_require_owner_socket(principal)
|
|
80
|
+
return await _respond(lambda owner_id, conn: ai_chat_capture.preview(
|
|
81
|
+
conn, owner_id=owner_id, source_id=payload.get("source_id"), app_id=payload.get("app_id")), write=False)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@router.post("/attest")
|
|
85
|
+
async def attest(payload: dict, principal=Depends(resolve_request_principal)):
|
|
86
|
+
from topos.permissions_v2 import ai_chat_capture
|
|
87
|
+
_require_owner_socket(principal)
|
|
88
|
+
return await _respond(lambda owner_id, conn: ai_chat_capture.attest(
|
|
89
|
+
conn, owner_id=owner_id, source_id=payload.get("source_id"), app_id=payload.get("app_id"),
|
|
90
|
+
preview_digest=payload.get("preview_digest"), confirm=payload.get("confirm")), write=True)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@router.post("/revoke")
|
|
94
|
+
async def revoke(payload: dict, principal=Depends(resolve_request_principal)):
|
|
95
|
+
from topos.permissions_v2 import ai_chat_capture
|
|
96
|
+
_require_owner_socket(principal)
|
|
97
|
+
return await _respond(lambda owner_id, conn: ai_chat_capture.revoke(
|
|
98
|
+
conn, owner_id=owner_id, receipt_id=payload.get("receipt_id")), write=True)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@router.get("/receipts")
|
|
102
|
+
async def receipts(principal=Depends(resolve_request_principal)):
|
|
103
|
+
from topos.permissions_v2 import ai_chat_capture
|
|
104
|
+
_require_owner_socket(principal)
|
|
105
|
+
return await _respond(lambda owner_id, conn: {"receipts": ai_chat_capture.receipts(conn, owner_id=owner_id)},
|
|
106
|
+
write=False)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Owner socket: attest that rows of a canonical table other than AI chat are the owner's own (OD-50, OD-52).
|
|
2
|
+
|
|
3
|
+
The journal table's rows carry no owner and, before September 2026, no writer, so
|
|
4
|
+
nothing on a row can tell the owner's entry from one another writer sent to the
|
|
5
|
+
same source. The owner says so once, explicitly, and the node keeps the
|
|
6
|
+
statement as an auditable receipt (``topos/permissions_v2/capture_receipts.py``);
|
|
7
|
+
the rows themselves are never re-labelled. The flow is OD-39's
|
|
8
|
+
(``permissions_ai_chat_capture.py``) with the table named: ``preview`` returns
|
|
9
|
+
counts and a digest of exactly the rows it would cover (no ids, no content);
|
|
10
|
+
``attest`` records a receipt only for that digest, with ``confirm: true``;
|
|
11
|
+
``revoke`` withdraws one. Only the owner's socket may call any of them.
|
|
12
|
+
|
|
13
|
+
For the AI-chat export import (``table: ai_chat_messages``) both ``preview`` and
|
|
14
|
+
``attest`` take an optional ``dataset_id``: the dataset of the one install of the
|
|
15
|
+
source the owner names as the one the import came through (a source with two live
|
|
16
|
+
installs certifies none by elimination). ``preview`` lists the source's candidate
|
|
17
|
+
installs (id, date, dataset, declared posture, whether it may be named, rows a
|
|
18
|
+
receipt naming it would cover); a dataset that is not one install's this owner may
|
|
19
|
+
name is refused (``capture_attestation_dataset_unknown``), and so is one whose
|
|
20
|
+
install is scoped to another node's topos than this node's own
|
|
21
|
+
(``capture_attestation_dataset_not_this_node``) or declares no posture
|
|
22
|
+
(``capture_attestation_dataset_posture_unknown``). Nothing here writes an install
|
|
23
|
+
row.
|
|
24
|
+
"""
|
|
25
|
+
from fastapi import APIRouter, Depends
|
|
26
|
+
|
|
27
|
+
from topos.auth import resolve_request_principal
|
|
28
|
+
|
|
29
|
+
from .permissions_ai_chat_capture import _require_owner_socket, _respond
|
|
30
|
+
|
|
31
|
+
router = APIRouter(prefix="/v1/permissions-beta/v2/capture-attestation", tags=["permissions-owner-capture"])
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _node_resource_id():
|
|
35
|
+
"""This node's own topos (its ledger identity's resource id): the only one a named install may be scoped to."""
|
|
36
|
+
from topos.permissions_v2.runtime import get_runtime
|
|
37
|
+
return getattr(get_runtime().protocol.ledger.identity, "resource_id", None)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@router.post("/preview")
|
|
41
|
+
async def preview(payload: dict, principal=Depends(resolve_request_principal)):
|
|
42
|
+
from topos.permissions_v2 import capture_receipts
|
|
43
|
+
_require_owner_socket(principal)
|
|
44
|
+
return await _respond(lambda owner_id, conn: capture_receipts.preview(
|
|
45
|
+
conn, owner_id=owner_id, table=payload.get("table"), source_id=payload.get("source_id"),
|
|
46
|
+
app_id=payload.get("app_id"), dataset_id=payload.get("dataset_id"), resource_id=_node_resource_id()),
|
|
47
|
+
write=False)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@router.post("/attest")
|
|
51
|
+
async def attest(payload: dict, principal=Depends(resolve_request_principal)):
|
|
52
|
+
from topos.permissions_v2 import capture_receipts
|
|
53
|
+
_require_owner_socket(principal)
|
|
54
|
+
return await _respond(lambda owner_id, conn: capture_receipts.attest(
|
|
55
|
+
conn, owner_id=owner_id, table=payload.get("table"), source_id=payload.get("source_id"),
|
|
56
|
+
app_id=payload.get("app_id"), preview_digest=payload.get("preview_digest"),
|
|
57
|
+
confirm=payload.get("confirm"), dataset_id=payload.get("dataset_id"), resource_id=_node_resource_id()),
|
|
58
|
+
write=True)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@router.post("/revoke")
|
|
62
|
+
async def revoke(payload: dict, principal=Depends(resolve_request_principal)):
|
|
63
|
+
from topos.permissions_v2 import capture_receipts
|
|
64
|
+
_require_owner_socket(principal)
|
|
65
|
+
return await _respond(lambda owner_id, conn: capture_receipts.revoke(
|
|
66
|
+
conn, owner_id=owner_id, receipt_id=payload.get("receipt_id")), write=True)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@router.get("/receipts")
|
|
70
|
+
async def receipts(principal=Depends(resolve_request_principal)):
|
|
71
|
+
from topos.permissions_v2 import capture_receipts
|
|
72
|
+
_require_owner_socket(principal)
|
|
73
|
+
return await _respond(lambda owner_id, conn: {"receipts": capture_receipts.receipts(conn, owner_id=owner_id)},
|
|
74
|
+
write=False)
|