topos-node 1.4.1__tar.gz → 1.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {topos_node-1.4.1 → topos_node-1.4.2}/MANIFEST.in +3 -0
- {topos_node-1.4.1/topos_node.egg-info → topos_node-1.4.2}/PKG-INFO +2 -1
- {topos_node-1.4.1 → topos_node-1.4.2}/pyproject.toml +3 -1
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/__version__.py +2 -2
- topos_node-1.4.2/topos/api/permissions_native_probe.py +150 -0
- topos_node-1.4.2/topos/api/permissions_search_maintenance.py +44 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/app.py +4 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/permissions_v2.py +120 -10
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/evidence_time.py +32 -13
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/extract.py +5 -1
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/blackhole.py +3 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/blackhole_guard.py +42 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/chatgpt_owner_snapshot.py +15 -3
- topos_node-1.4.2/topos/ingestion/imessage_attributed_text.py +130 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/owner_snapshot.py +37 -3
- topos_node-1.4.2/topos/permissions_v2/automatic_message_review.py +259 -0
- topos_node-1.4.2/topos/permissions_v2/automatic_review_worker.py +136 -0
- topos_node-1.4.2/topos/permissions_v2/chatgpt_coverage.py +99 -0
- topos_node-1.4.2/topos/permissions_v2/entity_boundary.py +415 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/evidence.py +267 -37
- topos_node-1.4.2/topos/permissions_v2/evidence_reviews.py +422 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/fact_bridge.py +1 -1
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/source_bridge.py +1 -1
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_eligibility.py +3 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/identity.py +2 -0
- topos_node-1.4.2/topos/permissions_v2/imessage_reconciliation.py +229 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ingest_provenance.py +6 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ingest_snapshot_facts.py +30 -11
- topos_node-1.4.2/topos/permissions_v2/knowledge_contract.py +156 -0
- topos_node-1.4.2/topos/permissions_v2/knowledge_projections.py +263 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ledger.py +31 -7
- topos_node-1.4.2/topos/permissions_v2/message_evidence.py +287 -0
- topos_node-1.4.2/topos/permissions_v2/message_review_contract.py +103 -0
- topos_node-1.4.2/topos/permissions_v2/native_claim_grounding.py +46 -0
- topos_node-1.4.2/topos/permissions_v2/native_imessage_probe.py +218 -0
- topos_node-1.4.2/topos/permissions_v2/reconciliation_facts.py +181 -0
- topos_node-1.4.2/topos/permissions_v2/reconciliation_provenance.py +136 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/registry.py +19 -7
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/release.py +22 -4
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/runtime.py +98 -9
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/search_contract.py +80 -1
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/search_index.py +314 -64
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/search_release.py +92 -26
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/search_transport.py +9 -3
- topos_node-1.4.2/topos/permissions_v2/shadow_rubric.pinned.md +30 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/signing.py +38 -6
- topos_node-1.4.2/topos/permissions_v2/snapshot_message_facts.py +46 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/protocol/handled_message_types.json +10 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/retrieval.py +14 -2
- topos_node-1.4.2/topos/storage/db/migrations/permissions_message_context_indexes_v1.py +32 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/registry.py +5 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/uma_contact_enrichment.py +1 -5
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/upgrades/manifests.json +8 -0
- {topos_node-1.4.1 → topos_node-1.4.2/topos_node.egg-info}/PKG-INFO +2 -1
- {topos_node-1.4.1 → topos_node-1.4.2}/topos_node.egg-info/SOURCES.txt +19 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos_node.egg-info/requires.txt +1 -0
- topos_node-1.4.1/topos/permissions_v2/evidence_reviews.py +0 -218
- {topos_node-1.4.1 → topos_node-1.4.2}/LICENSE +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/README.md +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/setup.cfg +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/shared/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/shared/filtering.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/shared/schema_registry.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_extensions.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_hub_pipeline_offline_first.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_lane_shards.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_profiles.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_sync_dep_pins.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_topos_home_hermeticity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/dataset_resolution.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/luck_surface.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/messenger_directed.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/person_graph.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/person_overlay.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/profiles.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/relationship_reads.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/analytics.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/app_registry.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/backup.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/compute_remote.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/connected_apps.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/conversation_context.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/data_commit.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/database_explorer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/db.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/device.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/disk_space_config.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/engine_run.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/enrichment.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/filter_lab.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/health.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/home_chat.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/llm.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/local_mcp.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/permissions_identity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/permissions_ingestion.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/query_api.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/shell.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/signal.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/source_install.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/source_scrub.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/sources.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/sources_overview.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/sync.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/tool_index.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/ui_config.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/uma_data.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/upgrades.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/usage.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/user_identity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/auth.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/declared_field_map.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/models.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/__main__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/assets/topos_black.png +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/commands.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/tray.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/facts_llm.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/model_packs.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/settings.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/contacts/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/contacts/identity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/control_plane_client.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/api_models.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/db_health.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/device_helpers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/errors.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/events.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/aggregate.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/common.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/config.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/device.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/graph_summary.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/mcp_client_elevations.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/mcp_clients.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/permissions_v2_identity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/permissions_v2_ingestion.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/permissions_v2_release.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/query.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/shadow_rescore.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/uma.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/logging.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/metrics.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/routine_access.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/startup_banner.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/state.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/table_layers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/types.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/defaults.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/tier.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/base.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/client.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/disk_space.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/engine.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/hosted_llm_wallet.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/intake.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/model_cache.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/model_manager.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/ollama_runtime.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/registration.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/router.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/tasks.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/transport.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/validator.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/processor.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/record_progress.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/evals/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/extensions.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/commitments.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/kernels.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/net_subject_policy.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/person_bridge.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/person_reading.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/router.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/social_bench.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/social_kernels.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/surfaces.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/template.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/writer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/chatgpt_declared.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/discourse_graph.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/edges.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/fact_materializer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/linking.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/mention_lineage.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/mention_lineage_lane.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/owner.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/reads.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/structured_fields.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/reactions.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/reads.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/derived_scrub.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/record_protection.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/conversation_windows.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/derived_index.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/service.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/stats/engine.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/stats/fold.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/stats/insights.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/temporal/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/temporal/points.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/temporal/records.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/badges.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/daily.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/intents.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/service.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/home_chat/schema.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/home_chat/store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/local_exports.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/local_sync_jobs.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/manager.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/chatgpt_export.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/transcript_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/progress.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/lineage/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/lineage/provenance.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/lineage/tracker.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/mcp_clients.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/observability/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/observability/alerts.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/observability/metrics.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/observability/tracing.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/openai_client.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/owner_key.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/canonical.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/canonical_floor.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/contract.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/evidence_review_runtime.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/exclusion_floor.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/__main__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/evaluators.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/harness.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/models.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/retention.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/scoring.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/synthetic.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_contract.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_policy.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_projection.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_release.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_release_transport.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/forwarding.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/identity_attestation.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/identity_dispatch.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/identity_protocol.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ingest_dispatch.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ingest_protocol.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ledger_retention.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/node_protocol.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/opaque_ids.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/projection_review_runtime.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/projection_reviews.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/protection_clock.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/protocol.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/release_transport.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/search_lanes.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/shadow_index.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/shadow_labeler_local.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/shadow_labelers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/shadow_rescore.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/audit.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/job_runner.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/job_secrets.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/stages.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/principal.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/profiles.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/projections/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/protocol/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/protocol/narrowing_vocabulary.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/protocol/retrieval_text_contract.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/aggregate.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/audit.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/closeness.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/cohort_resolvers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/collaborators.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/ddr.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/disclosure.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/entity_window.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/exclusion.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/facts_direct.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/fingerprint.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/game_layer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/grant_cache.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/graph_lane.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/inference.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/intent.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/journal_event_lane.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/manifest.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/minimizer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/narrowing.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/negotiation.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/overheard.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/pipeline.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/planner.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/runtime.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_head.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_registry.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/session.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/session_utils.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/source_generation.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/truth_door.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/truth_facts.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/types.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/verify.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/verify_modes.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/rate_limit.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/relay_stamp.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/routines/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/routines/schema.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/routines/store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/runtime_update.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/hub_pipeline.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/scope_resolution.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/container.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/interfaces.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/llm/base.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/llm/openai.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/local.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/postgres.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/definitions.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/install_service.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/registry.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/startup_banner.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/client.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/backup_custody.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/owner_only_records_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/permissions_fact_lineage_keys_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/permissions_read_path_indexes_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/temporal_fields_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/transcripts_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/paths.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/schema.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/derived_row_identity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/source_settings.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/user_identity.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sync/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sync/client.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/sync_handlers.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/testing/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/testing/lifespan.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/uds.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/uma_authority.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/uma_filters.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/uma_resource_id.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/uma_rpt.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/upgrades/runner.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/utils/base_object.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos/websocket_client.py +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.4.1 → topos_node-1.4.2}/topos_node.egg-info/top_level.txt +0 -0
|
@@ -6,3 +6,6 @@ recursive-include shared *.json
|
|
|
6
6
|
# Tray icon glyphs (topos/cli/assets) — without them the tray cannot render.
|
|
7
7
|
recursive-include topos *.png
|
|
8
8
|
recursive-include topos/features/derivation/bundled_packs *.yaml
|
|
9
|
+
|
|
10
|
+
# Pinned runtime privacy rubric; absence must fail closed, but must ship.
|
|
11
|
+
include topos/permissions_v2/shadow_rubric.pinned.md
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: topos-node
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.2
|
|
4
4
|
Summary: Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://topos.dialogues.ai
|
|
@@ -40,6 +40,7 @@ Requires-Dist: scikit-learn<2,>=1.4
|
|
|
40
40
|
Requires-Dist: sqlite-vec~=0.1.9
|
|
41
41
|
Requires-Dist: pystray~=0.19.5
|
|
42
42
|
Requires-Dist: pillow>=10.0
|
|
43
|
+
Requires-Dist: pytypedstream==0.1.0
|
|
43
44
|
Provides-Extra: database
|
|
44
45
|
Requires-Dist: psycopg[binary]~=3.3.3; extra == "database"
|
|
45
46
|
Provides-Extra: engine
|
|
@@ -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.2"
|
|
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"
|
|
@@ -65,6 +65,8 @@ dependencies = [
|
|
|
65
65
|
# only when a GUI session is detected — harmless on headless installs.
|
|
66
66
|
"pystray~=0.19.5",
|
|
67
67
|
"pillow>=10.0",
|
|
68
|
+
# Pure-data validation of complete native iMessage archives; no NSUnarchiver.
|
|
69
|
+
"pytypedstream==0.1.0",
|
|
68
70
|
]
|
|
69
71
|
|
|
70
72
|
[project.urls]
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"""Local-owner-only diagnostic. No native paths, text or release authority on the wire."""
|
|
2
|
+
import asyncio
|
|
3
|
+
from datetime import datetime, timezone
|
|
4
|
+
import sqlite3
|
|
5
|
+
|
|
6
|
+
from fastapi import APIRouter, Depends, HTTPException
|
|
7
|
+
from fastapi.responses import JSONResponse
|
|
8
|
+
|
|
9
|
+
from topos.auth import resolve_request_principal
|
|
10
|
+
from topos.permissions_v2.canonical import PolicyError
|
|
11
|
+
from topos.permissions_v2.contract import Identifier, StrictModel
|
|
12
|
+
|
|
13
|
+
router = APIRouter(prefix='/v1/permissions-beta/v2/imessage', tags=['permissions-owner-maintenance'])
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class NativeProbeRequest(StrictModel):
|
|
17
|
+
dataset_id: Identifier
|
|
18
|
+
starts_at: str
|
|
19
|
+
ends_at: str
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@router.post('/preflight')
|
|
23
|
+
async def preflight(body: NativeProbeRequest, principal=Depends(resolve_request_principal)):
|
|
24
|
+
from topos.principal import OWNER_APP
|
|
25
|
+
if principal is None or principal.cls != OWNER_APP or principal.channel != 'uds':
|
|
26
|
+
raise HTTPException(403, 'owner_socket_required')
|
|
27
|
+
|
|
28
|
+
def apply():
|
|
29
|
+
from topos.permissions_v2.runtime import get_runtime
|
|
30
|
+
from topos.permissions_v2.native_imessage_probe import probe_native_messages
|
|
31
|
+
runtime = get_runtime()
|
|
32
|
+
identity = runtime.protocol.ledger.identity
|
|
33
|
+
if principal.acting_user and principal.acting_user != identity.owner_id:
|
|
34
|
+
raise PolicyError('owner_binding')
|
|
35
|
+
path = runtime.protocol.canonical_database
|
|
36
|
+
conn = sqlite3.connect(path.as_uri() + '?mode=ro', uri=True, timeout=1)
|
|
37
|
+
try:
|
|
38
|
+
conn.row_factory = sqlite3.Row
|
|
39
|
+
conn.execute('PRAGMA query_only=ON')
|
|
40
|
+
conn.execute('BEGIN')
|
|
41
|
+
return probe_native_messages(conn, dataset_id=body.dataset_id, owner_id=identity.owner_id,
|
|
42
|
+
starts_at=body.starts_at, ends_at=body.ends_at, now=datetime.now(timezone.utc))
|
|
43
|
+
finally:
|
|
44
|
+
conn.close()
|
|
45
|
+
try:
|
|
46
|
+
result = await asyncio.to_thread(apply)
|
|
47
|
+
return JSONResponse(result, headers={'Cache-Control': 'no-store'})
|
|
48
|
+
except PolicyError as exc:
|
|
49
|
+
raise HTTPException(503, exc.code, headers={'Cache-Control': 'no-store'}) from None
|
|
50
|
+
except Exception:
|
|
51
|
+
raise HTTPException(503, 'native_probe_unavailable', headers={'Cache-Control': 'no-store'}) from None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class NativeRecoveryRequest(NativeProbeRequest):
|
|
55
|
+
owner_attestation: str
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# Recovery is a bounded maintenance operation, never a sync loop or a recipient
|
|
59
|
+
# API. One run per process avoids duplicate paid/local preparation on retries.
|
|
60
|
+
import threading
|
|
61
|
+
_RECOVERY_LOCK = threading.Lock()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@router.post('/recover')
|
|
65
|
+
async def recover(body: NativeRecoveryRequest, principal=Depends(resolve_request_principal)):
|
|
66
|
+
from topos.principal import OWNER_APP
|
|
67
|
+
from topos.permissions_v2.ingest_provenance import OWNER_ATTESTATION
|
|
68
|
+
if principal is None or principal.cls != OWNER_APP or principal.channel != 'uds':
|
|
69
|
+
raise HTTPException(403, 'owner_socket_required')
|
|
70
|
+
if body.owner_attestation != OWNER_ATTESTATION:
|
|
71
|
+
raise HTTPException(422, 'ingest_owner_attestation_required')
|
|
72
|
+
if not _RECOVERY_LOCK.acquire(blocking=False):
|
|
73
|
+
raise HTTPException(409, 'native_recovery_running')
|
|
74
|
+
|
|
75
|
+
def apply():
|
|
76
|
+
from dataclasses import replace
|
|
77
|
+
from topos.permissions_v2.runtime import get_runtime
|
|
78
|
+
from topos.permissions_v2.native_imessage_probe import capture_matching_snapshot
|
|
79
|
+
from topos.permissions_v2.imessage_reconciliation import ATTRIBUTED_CONTRACT, parse_reconciliation_snapshot
|
|
80
|
+
from topos.permissions_v2.reconciliation_provenance import publish_existing
|
|
81
|
+
from topos.permissions_v2.reconciliation_facts import prepare_facts, derive_prepared
|
|
82
|
+
from topos.permissions_v2.reconciliation_facts import owner_subject
|
|
83
|
+
from topos.principal import set_principal, reset_principal
|
|
84
|
+
runtime = get_runtime()
|
|
85
|
+
identity = runtime.protocol.ledger.identity
|
|
86
|
+
if principal.acting_user and principal.acting_user != identity.owner_id:
|
|
87
|
+
raise PolicyError('owner_binding')
|
|
88
|
+
token = set_principal(replace(principal, acting_user=identity.owner_id))
|
|
89
|
+
db = None
|
|
90
|
+
try:
|
|
91
|
+
service = runtime.ingestion()
|
|
92
|
+
db = runtime.ingestion_connection()
|
|
93
|
+
owner_subject(db)
|
|
94
|
+
if db.execute("SELECT 1 FROM sqlite_master WHERE name='ingest_provenance_enrollments'").fetchone():
|
|
95
|
+
if db.execute('SELECT 1 FROM ingest_provenance_enrollments WHERE dataset_id=?', (body.dataset_id,)).fetchone():
|
|
96
|
+
raise PolicyError('native_recovery_already_enrolled')
|
|
97
|
+
# The configured private directories are installed by the operator,
|
|
98
|
+
# not picked or chmodded from request fields.
|
|
99
|
+
db.execute('PRAGMA query_only=ON')
|
|
100
|
+
db.execute('BEGIN')
|
|
101
|
+
snapshot_id, measured = capture_matching_snapshot(db, snapshot_root=service.root,
|
|
102
|
+
dataset_id=body.dataset_id, owner_id=identity.owner_id, starts_at=body.starts_at,
|
|
103
|
+
ends_at=body.ends_at, now=datetime.now(timezone.utc))
|
|
104
|
+
description, data = service._snapshot(snapshot_id, ATTRIBUTED_CONTRACT)
|
|
105
|
+
records = parse_reconciliation_snapshot(data, now=datetime.now(timezone.utc), reader_contract=ATTRIBUTED_CONTRACT)
|
|
106
|
+
boundary = service.resolver.entity_boundary(db)
|
|
107
|
+
rows = []
|
|
108
|
+
withheld = 0
|
|
109
|
+
for record in records:
|
|
110
|
+
row = dict(db.execute('SELECT * FROM conversation_messages WHERE message_id=?', (record.message_id,)).fetchone())
|
|
111
|
+
try:
|
|
112
|
+
boundary.check(table='conversation_messages', record_id=record.message_id,
|
|
113
|
+
source_id='imessage', dataset_id=body.dataset_id, row=row)
|
|
114
|
+
rows.append(row)
|
|
115
|
+
except PolicyError:
|
|
116
|
+
withheld += 1
|
|
117
|
+
db.rollback()
|
|
118
|
+
db.execute('PRAGMA query_only=OFF')
|
|
119
|
+
# No writer lock or live DB transaction during local inference.
|
|
120
|
+
prepared, stats = asyncio.run(prepare_facts(rows))
|
|
121
|
+
if not prepared:
|
|
122
|
+
return {'authority_created': False, 'counts': measured['counts'], 'preparation': stats,
|
|
123
|
+
'boundary_withheld': withheld}
|
|
124
|
+
enrollment = service.enroll(db, snapshot_id=snapshot_id, dataset_id=body.dataset_id,
|
|
125
|
+
snapshot_sha256=description['snapshot_sha256'], owner_attestation=body.owner_attestation,
|
|
126
|
+
reader_contract=ATTRIBUTED_CONTRACT)
|
|
127
|
+
derived = {}
|
|
128
|
+
def derive(conn, current):
|
|
129
|
+
derived.update(derive_prepared(conn, current, prepared))
|
|
130
|
+
result = publish_existing(service, db, enrollment_id=enrollment['enrollment_id'], derive=derive,
|
|
131
|
+
classifications={key: item['classification'] for key, item in prepared.items()})
|
|
132
|
+
return {'authority_created': True, 'reconciled': result['reconciled'], 'preparation': stats,
|
|
133
|
+
'derivation': derived, 'boundary_withheld': withheld}
|
|
134
|
+
finally:
|
|
135
|
+
if db is not None:
|
|
136
|
+
db.close()
|
|
137
|
+
reset_principal(token)
|
|
138
|
+
try:
|
|
139
|
+
# The worker owns the lock until it actually stops, even if HTTP cancels.
|
|
140
|
+
def guarded():
|
|
141
|
+
try:
|
|
142
|
+
return apply()
|
|
143
|
+
finally:
|
|
144
|
+
_RECOVERY_LOCK.release()
|
|
145
|
+
result = await asyncio.to_thread(guarded)
|
|
146
|
+
return JSONResponse(result, headers={'Cache-Control': 'no-store'})
|
|
147
|
+
except PolicyError as exc:
|
|
148
|
+
raise HTTPException(503, exc.code, headers={'Cache-Control': 'no-store'}) from None
|
|
149
|
+
except Exception:
|
|
150
|
+
raise HTTPException(503, 'native_recovery_unavailable', headers={'Cache-Control': 'no-store'}) from None
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Owner socket maintenance of existing signed message-search indexes."""
|
|
2
|
+
from fastapi import APIRouter, Depends, HTTPException
|
|
3
|
+
|
|
4
|
+
from topos.auth import resolve_request_principal
|
|
5
|
+
from topos.core.handlers.permissions_v2 import handle_permissions_v2_message_search_rebuild
|
|
6
|
+
|
|
7
|
+
router = APIRouter(prefix="/v1/permissions-beta/v2/message-search", tags=["permissions-owner-maintenance"])
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@router.post("/rebuild")
|
|
11
|
+
async def rebuild(principal=Depends(resolve_request_principal)):
|
|
12
|
+
from topos.principal import set_principal, reset_principal
|
|
13
|
+
|
|
14
|
+
token = set_principal(principal)
|
|
15
|
+
try:
|
|
16
|
+
result = await handle_permissions_v2_message_search_rebuild({"id":"owner-search-rebuild"})
|
|
17
|
+
finally:
|
|
18
|
+
reset_principal(token)
|
|
19
|
+
if result.get("status") != "ok":
|
|
20
|
+
raise HTTPException(result.get("code",503), result.get("error","permissions_v2_unavailable"),
|
|
21
|
+
headers={"Cache-Control":"no-store"})
|
|
22
|
+
from fastapi.responses import JSONResponse
|
|
23
|
+
return JSONResponse(result["payload"], headers={"Cache-Control":"no-store"})
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@router.post("/message-review")
|
|
27
|
+
async def message_review(payload: dict, principal=Depends(resolve_request_principal)):
|
|
28
|
+
from topos.principal import set_principal, reset_principal
|
|
29
|
+
from topos.core.handlers.permissions_v2 import handle_permissions_v2_message_review
|
|
30
|
+
from fastapi.responses import JSONResponse
|
|
31
|
+
from topos.principal import OWNER_APP
|
|
32
|
+
if principal.cls == OWNER_APP and principal.channel == "uds" and not principal.acting_user:
|
|
33
|
+
from dataclasses import replace
|
|
34
|
+
from topos.permissions_v2.runtime import get_runtime
|
|
35
|
+
principal = replace(principal, acting_user=get_runtime().protocol.ledger.identity.owner_id)
|
|
36
|
+
token = set_principal(principal)
|
|
37
|
+
try:
|
|
38
|
+
result = await handle_permissions_v2_message_review({"id":"owner-message-review","payload":payload})
|
|
39
|
+
finally:
|
|
40
|
+
reset_principal(token)
|
|
41
|
+
if result.get("status") != "ok":
|
|
42
|
+
raise HTTPException(result.get("code",503),result.get("error","message_review_unavailable"),
|
|
43
|
+
headers={"Cache-Control":"no-store"})
|
|
44
|
+
return JSONResponse(result["payload"],headers={"Cache-Control":"no-store"})
|
|
@@ -29,6 +29,8 @@ from .api import (
|
|
|
29
29
|
ingestion_sources as ingestion_sources_routes,
|
|
30
30
|
permissions_identity as permissions_identity_routes,
|
|
31
31
|
permissions_ingestion as permissions_ingestion_routes,
|
|
32
|
+
permissions_search_maintenance as permissions_search_maintenance_routes,
|
|
33
|
+
permissions_native_probe as permissions_native_probe_routes,
|
|
32
34
|
intelligence_lifecycle as intelligence_lifecycle_routes,
|
|
33
35
|
local_mcp as local_mcp_routes,
|
|
34
36
|
llm as llm_routes,
|
|
@@ -143,6 +145,8 @@ app.include_router(ingestion_routes.router, prefix="/v1")
|
|
|
143
145
|
app.include_router(ingestion_sources_routes.router)
|
|
144
146
|
app.include_router(permissions_ingestion_routes.router)
|
|
145
147
|
app.include_router(permissions_identity_routes.router)
|
|
148
|
+
app.include_router(permissions_search_maintenance_routes.router)
|
|
149
|
+
app.include_router(permissions_native_probe_routes.router)
|
|
146
150
|
app.include_router(query_routes.router, prefix="/v1")
|
|
147
151
|
app.include_router(messenger_analytics_routes.router, prefix="/v1")
|
|
148
152
|
app.include_router(uma_data_routes.router)
|
|
@@ -87,7 +87,8 @@ async def handle_permissions_v2_status(message):
|
|
|
87
87
|
async def _handle_evidence(message, operation, *, projection=False):
|
|
88
88
|
from ...permissions_v2.canonical import PolicyError
|
|
89
89
|
from ...permissions_v2.evidence import EvidenceBinding
|
|
90
|
-
from ...permissions_v2.evidence_reviews import EvidenceLookup, RecordEvidenceReview,
|
|
90
|
+
from ...permissions_v2.evidence_reviews import (EvidenceLookup, FactOptIn, FactOptOut, RecordEvidenceReview,
|
|
91
|
+
ReviewQueueRequest, ReviewTotalsRequest, RevokeEvidenceReview)
|
|
91
92
|
from ...permissions_v2.fact_contract import FAMILY, OUTPUT_FAMILIES
|
|
92
93
|
from ...permissions_v2.identity import LEGACY_CONTRACT, SUBJECT_CONTRACTS
|
|
93
94
|
from ...permissions_v2.projection_reviews import RecordProjectionReview, RevokeProjectionReview
|
|
@@ -123,7 +124,9 @@ async def _handle_evidence(message, operation, *, projection=False):
|
|
|
123
124
|
binding = EvidenceBinding.parse(payload["binding"])
|
|
124
125
|
request_type = {"preview":EvidenceLookup, "read":EvidenceLookup,
|
|
125
126
|
"record":RecordProjectionReview if projection else RecordEvidenceReview,
|
|
126
|
-
"revoke":RevokeProjectionReview if projection else RevokeEvidenceReview
|
|
127
|
+
"revoke":RevokeProjectionReview if projection else RevokeEvidenceReview,
|
|
128
|
+
# Implicit review's owner surfaces: the queue, the totals, the deselection and its undo.
|
|
129
|
+
"queue":ReviewQueueRequest, "totals":ReviewTotalsRequest, "opt_out":FactOptOut, "opt_in":FactOptIn}[operation]
|
|
127
130
|
request = request_type.parse(payload["request"])
|
|
128
131
|
runtime = get_runtime()
|
|
129
132
|
actual = EvidenceBinding.parse(runtime.protocol.ledger.identity.model_dump())
|
|
@@ -146,12 +149,12 @@ async def _handle_evidence(message, operation, *, projection=False):
|
|
|
146
149
|
return getattr(service, operation)(request, now=int(time.time()), contract=contract,
|
|
147
150
|
family=family)
|
|
148
151
|
service = runtime.evidence_reviews(require_existing=operation in {"record", "revoke"})
|
|
149
|
-
if operation
|
|
150
|
-
result = service
|
|
152
|
+
if operation in {"record", "opt_out"}:
|
|
153
|
+
result = getattr(service, operation)(request, now=int(time.time()))
|
|
151
154
|
_refresh_message_search(runtime)
|
|
152
155
|
return result
|
|
153
156
|
result = getattr(service, operation)(request)
|
|
154
|
-
if operation
|
|
157
|
+
if operation in {"revoke", "opt_in"}:
|
|
155
158
|
_refresh_message_search(runtime)
|
|
156
159
|
return result
|
|
157
160
|
|
|
@@ -201,6 +204,30 @@ async def handle_permissions_v2_evidence_review_revoke(message):
|
|
|
201
204
|
return await _handle_evidence(message, "revoke")
|
|
202
205
|
|
|
203
206
|
|
|
207
|
+
@handles("permissions_v2_evidence_review_queue", owner_only=True)
|
|
208
|
+
async def handle_permissions_v2_evidence_review_queue(message):
|
|
209
|
+
"""Owner-only: a page of current facts, least confident first, with labels, standing and source counts."""
|
|
210
|
+
return await _handle_evidence(message, "queue")
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
@handles("permissions_v2_evidence_totals", owner_only=True)
|
|
214
|
+
async def handle_permissions_v2_evidence_totals(message):
|
|
215
|
+
"""Owner-only: qualifying / deselected / withheld counts, overall and per source."""
|
|
216
|
+
return await _handle_evidence(message, "totals")
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
@handles("permissions_v2_evidence_opt_out", owner_only=True)
|
|
220
|
+
async def handle_permissions_v2_evidence_opt_out(message):
|
|
221
|
+
"""Owner-only: deselect one fact; every search index is rebuilt without it."""
|
|
222
|
+
return await _handle_evidence(message, "opt_out")
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
@handles("permissions_v2_evidence_opt_in", owner_only=True)
|
|
226
|
+
async def handle_permissions_v2_evidence_opt_in(message):
|
|
227
|
+
"""Owner-only: reselect one fact; every search index is rebuilt with it."""
|
|
228
|
+
return await _handle_evidence(message, "opt_in")
|
|
229
|
+
|
|
230
|
+
|
|
204
231
|
@handles("permissions_v2_projection_preview", owner_only=True)
|
|
205
232
|
async def handle_permissions_v2_projection_preview(message):
|
|
206
233
|
return await _handle_evidence(message, "preview", projection=True)
|
|
@@ -242,17 +269,100 @@ async def handle_permissions_v2_message_search_rebuild(message):
|
|
|
242
269
|
return {"id": req_id, "status": "error", "code": 403, "error": "owner_mode_required"}
|
|
243
270
|
|
|
244
271
|
def apply():
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
272
|
+
from dataclasses import replace
|
|
273
|
+
from ...principal import set_principal, reset_principal
|
|
274
|
+
|
|
275
|
+
token = None
|
|
276
|
+
try:
|
|
277
|
+
with with_db_write():
|
|
278
|
+
runtime = get_runtime()
|
|
279
|
+
owner_id = runtime.protocol.ledger.identity.owner_id
|
|
280
|
+
if (principal.channel == "cp_relay" and principal.acting_user != owner_id
|
|
281
|
+
or principal.channel == "uds" and principal.acting_user and principal.acting_user != owner_id):
|
|
282
|
+
raise PolicyError("owner_binding")
|
|
283
|
+
if principal.channel == "uds":
|
|
284
|
+
# The authenticated local owner transport identifies this
|
|
285
|
+
# paired node. Bind its account from trusted runtime state,
|
|
286
|
+
# never from a request body/header, for deeper owner checks.
|
|
287
|
+
token = set_principal(replace(principal, acting_user=owner_id))
|
|
288
|
+
index = runtime.message_search_index()
|
|
289
|
+
# The index owns its publication/check gates. Fact qualification
|
|
290
|
+
# and embedding must not hold the writer gate for the whole build.
|
|
250
291
|
index.sweep()
|
|
251
292
|
states = index.rebuild_all()
|
|
252
293
|
return {"grants": len(states), "ready": sum(state == "ready" for state in states.values())}
|
|
294
|
+
finally:
|
|
295
|
+
if token is not None:
|
|
296
|
+
reset_principal(token)
|
|
253
297
|
try:
|
|
254
298
|
return {"id": req_id, "status": "ok", "payload": await asyncio.to_thread(apply)}
|
|
255
299
|
except PolicyError as exc:
|
|
256
300
|
return {"id": req_id, "status": "error", "code": 403 if exc.code == "owner_binding" else 503, "error": exc.code}
|
|
257
301
|
except Exception:
|
|
258
302
|
return {"id": req_id, "status": "error", "code": 503, "error": "permissions_v2_unavailable"}
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
@handles("permissions_v2_message_review", owner_only=True)
|
|
306
|
+
async def handle_permissions_v2_message_review(message):
|
|
307
|
+
from ...permissions_v2.canonical import PolicyError, digest
|
|
308
|
+
from ...permissions_v2.evidence import EvidenceBinding, _owner
|
|
309
|
+
from ...permissions_v2.message_review_contract import (MessageLookup, RecordMessageReview,
|
|
310
|
+
MessageReviewQueue, MessageReviewPreview, MessageOptOutResult, MessageReviewResult,
|
|
311
|
+
AutomaticReviewRequest, AutomaticReviewLookup)
|
|
312
|
+
from ...permissions_v2.message_evidence import (preview_message, record_message_review, queue_messages, message_key)
|
|
313
|
+
from ...permissions_v2.runtime import get_runtime
|
|
314
|
+
from ...storage.db.write_gate import with_db_write
|
|
315
|
+
|
|
316
|
+
req_id, payload = message.get("id"), message.get("payload")
|
|
317
|
+
if not isinstance(payload, dict) or set(payload) != {"binding", "operation", "request"}:
|
|
318
|
+
return {"id":req_id,"status":"error","code":400,"error":"message_review_payload_invalid"}
|
|
319
|
+
def apply():
|
|
320
|
+
with with_db_write():
|
|
321
|
+
runtime = get_runtime()
|
|
322
|
+
actual = EvidenceBinding.parse(runtime.protocol.ledger.identity.model_dump())
|
|
323
|
+
_owner(actual)
|
|
324
|
+
if EvidenceBinding.parse(payload["binding"]) != actual:
|
|
325
|
+
raise PolicyError("evidence_target_binding")
|
|
326
|
+
op = payload["operation"]
|
|
327
|
+
model = {"queue":MessageReviewQueue, "preview":MessageLookup, "record":RecordMessageReview,
|
|
328
|
+
"opt_out":MessageLookup, "opt_in":MessageLookup,
|
|
329
|
+
"automatic_start":AutomaticReviewRequest, "automatic_status":AutomaticReviewLookup,
|
|
330
|
+
"automatic_cancel":AutomaticReviewLookup}.get(op)
|
|
331
|
+
if model is None:
|
|
332
|
+
raise PolicyError("message_review_operation_invalid")
|
|
333
|
+
request = model.parse(payload["request"])
|
|
334
|
+
if op.startswith("automatic_"):
|
|
335
|
+
worker = runtime.automatic_message_reviews()
|
|
336
|
+
if op == "automatic_start":
|
|
337
|
+
return worker.start(request)
|
|
338
|
+
return worker.cancel() if op == "automatic_cancel" else worker.status()
|
|
339
|
+
service = runtime.evidence_reviews(require_existing=True)
|
|
340
|
+
resolver, reviews = service.resolver, service.reviews
|
|
341
|
+
if op == "queue":
|
|
342
|
+
return queue_messages(resolver, reviews, request, now=int(time.time()))
|
|
343
|
+
if op == "record":
|
|
344
|
+
review = record_message_review(resolver, reviews, **request.model_dump(), reviewed_at=int(time.time()))
|
|
345
|
+
result = MessageReviewResult(review=review, review_revision=digest(review.model_dump()))
|
|
346
|
+
else:
|
|
347
|
+
if request.identity.binding != actual or request.identity.table == "signal_objects":
|
|
348
|
+
raise PolicyError("evidence_target_binding")
|
|
349
|
+
if op == "preview":
|
|
350
|
+
return MessageReviewPreview.parse(preview_message(resolver, reviews, request.identity))
|
|
351
|
+
key = message_key(request.identity)
|
|
352
|
+
if op == "opt_out":
|
|
353
|
+
reviews.opt_out(key, now=int(time.time()))
|
|
354
|
+
else:
|
|
355
|
+
reviews.opt_in(key)
|
|
356
|
+
result = MessageOptOutResult(identity=request.identity, opted_out=op == "opt_out")
|
|
357
|
+
_refresh_message_search(runtime)
|
|
358
|
+
return result
|
|
359
|
+
try:
|
|
360
|
+
result = await asyncio.to_thread(apply)
|
|
361
|
+
return {"id":req_id,"status":"ok","payload":result.model_dump()}
|
|
362
|
+
except PolicyError as exc:
|
|
363
|
+
code = (403 if exc.code in {"owner_authority_required", "evidence_target_binding"} else
|
|
364
|
+
409 if exc.code in {"review_stale", "review_conflict", "review_id_conflict"} else
|
|
365
|
+
400 if exc.code in {"schema_invalid", "message_review_window_invalid", "message_review_operation_invalid"} else 503)
|
|
366
|
+
return {"id":req_id,"status":"error","code":code,"error":exc.code}
|
|
367
|
+
except Exception:
|
|
368
|
+
return {"id":req_id,"status":"error","code":503,"error":"message_review_unavailable"}
|
|
@@ -16,10 +16,12 @@ It is deliberately narrow, because every wrong refusal keeps a stale belief:
|
|
|
16
16
|
- Evidence is read when the decision is made, from the rows the facts'
|
|
17
17
|
current ``source_refs`` name, never from the record frozen at insert. A ref
|
|
18
18
|
counts only while its row still exists, is not deleted or excluded, and the
|
|
19
|
-
ref names that row's
|
|
20
|
-
|
|
19
|
+
ref names that row's table and source, plus its dataset for human messages.
|
|
20
|
+
AI-chat rows have no dataset column; the trust must prove their enrollment
|
|
21
|
+
and parent owner/source binding instead.
|
|
21
22
|
- Only owner statements are ordered, and a ref counts only when its row is the
|
|
22
|
-
owner's own (``is_from_self`` 1
|
|
23
|
+
owner's own (``is_from_self`` 1, or an authored user prompt with validated
|
|
24
|
+
native provenance). A refresh merges refs from any speaker into
|
|
23
25
|
a fact, so the fact's label alone does not show whose message supports it.
|
|
24
26
|
- A time is "cannot tell" when it could end after the moment its row is known
|
|
25
27
|
to have existed: the trust's own ceiling for rows it vouches for (for the
|
|
@@ -43,6 +45,7 @@ from ..temporal.points import TimePoint, order, parse_point, span, unknown
|
|
|
43
45
|
from ..temporal.records import EventTime
|
|
44
46
|
|
|
45
47
|
LEAF_TABLE = "conversation_messages"
|
|
48
|
+
_ORDERED_TABLES = (LEAF_TABLE, "ai_chat_messages")
|
|
46
49
|
OWNER = "owner"
|
|
47
50
|
_EVENT_COLUMN = {"conversation_messages": "event_at", "ai_chat_messages": "event_at", "journal_entries": "entry_at"}
|
|
48
51
|
# SQLite's datetime('now') forms, UTC by definition, with optional fractional seconds.
|
|
@@ -104,31 +107,47 @@ def _last(point: TimePoint) -> int:
|
|
|
104
107
|
|
|
105
108
|
|
|
106
109
|
def _owner_row(row: Dict[str, Any]) -> bool:
|
|
110
|
+
if row.get("_table") == "ai_chat_messages":
|
|
111
|
+
# These labels only permit asking the trust. They never replace the
|
|
112
|
+
# durable proof of the row and its parent account identity.
|
|
113
|
+
return row.get("sender_type") in ("human", "user") and row.get("actor_role") == "authored"
|
|
107
114
|
flag = row.get("is_from_self")
|
|
108
115
|
return flag is True or (type(flag) is int and flag == 1)
|
|
109
116
|
|
|
110
117
|
|
|
118
|
+
def _names_row(ref: Dict[str, Any], row: Dict[str, Any]) -> bool:
|
|
119
|
+
if ref.get("source_id") in (None, "") or str(ref["source_id"]) != str(row.get("source_id")):
|
|
120
|
+
return False
|
|
121
|
+
if row["_table"] == "ai_chat_messages":
|
|
122
|
+
return ref.get("dataset_id") is None # the AI leaf contract is datasetless
|
|
123
|
+
return ref.get("dataset_id") not in (None, "") and str(ref["dataset_id"]) == str(row.get("dataset_id"))
|
|
124
|
+
|
|
125
|
+
|
|
111
126
|
def _points(conn, trust: EvidenceTrust, refs: Iterable[Dict[str, Any]]) -> List[Optional[TimePoint]]:
|
|
112
127
|
"""One entry per ref: the trusted point, or ``None`` when it cannot tell."""
|
|
113
128
|
refs = [ref for ref in refs or []]
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
129
|
+
rows: Dict[tuple, Dict[str, Any]] = {}
|
|
130
|
+
for table in _ORDERED_TABLES:
|
|
131
|
+
ids = sorted({str(ref.get("record_id")) for ref in refs
|
|
132
|
+
if type(ref) is dict and ref.get("table") == table and ref.get("record_id")})
|
|
133
|
+
if not ids:
|
|
134
|
+
continue
|
|
118
135
|
try:
|
|
119
136
|
cursor = conn.execute(
|
|
120
|
-
f"SELECT * FROM {
|
|
137
|
+
f"SELECT * FROM {table} WHERE message_id IN ({','.join('?' for _ in ids)})", ids)
|
|
121
138
|
names = [column[0] for column in cursor.description]
|
|
122
|
-
|
|
139
|
+
for values in cursor.fetchall():
|
|
140
|
+
row = {**dict(zip(names, values)), "_table": table}
|
|
141
|
+
rows[(table, str(row["message_id"]))] = row
|
|
123
142
|
except sqlite3.Error:
|
|
124
|
-
|
|
143
|
+
continue
|
|
125
144
|
excluded = _excluded_ids(conn) if rows else set()
|
|
126
145
|
out: List[Optional[TimePoint]] = []
|
|
127
146
|
for ref in refs:
|
|
128
|
-
row = rows.get(
|
|
147
|
+
row = (rows.get((ref.get("table"), str(ref.get("record_id"))))
|
|
148
|
+
if type(ref) is dict and ref.get("table") in _ORDERED_TABLES else None)
|
|
129
149
|
if (row is None or _deleted(row) or str(row.get("message_id")) in excluded or not _owner_row(row)
|
|
130
|
-
or not
|
|
131
|
-
for key in ("source_id", "dataset_id"))):
|
|
150
|
+
or not _names_row(ref, row)):
|
|
132
151
|
out.append(None)
|
|
133
152
|
continue
|
|
134
153
|
try:
|
|
@@ -467,6 +467,7 @@ def extract_rules_facts(
|
|
|
467
467
|
source_ref,
|
|
468
468
|
temporal_for,
|
|
469
469
|
accept_value=None,
|
|
470
|
+
message_extractor=None,
|
|
470
471
|
stats: Optional[Dict[str, int]] = None,
|
|
471
472
|
) -> int:
|
|
472
473
|
"""The rules floor alone, for a caller that has already proved its rows.
|
|
@@ -476,7 +477,8 @@ def extract_rules_facts(
|
|
|
476
477
|
chooses or creates a self entity: the caller supplies the subject, the
|
|
477
478
|
reference and the temporal record for each row. ``accept_value`` may refuse
|
|
478
479
|
a value before anything is written; refusals count under
|
|
479
|
-
``value_refused`` in ``stats``.
|
|
480
|
+
``value_refused`` in ``stats``. ``message_extractor`` is a trusted server
|
|
481
|
+
callback for proved message rows, never a request-selected extractor.
|
|
480
482
|
"""
|
|
481
483
|
from ..lifecycle.exclusions import excluded_record_ids
|
|
482
484
|
|
|
@@ -487,6 +489,8 @@ def extract_rules_facts(
|
|
|
487
489
|
table = str(row.get("_table") or "")
|
|
488
490
|
record_id = row.get("record_id") or row.get("message_id") or row.get("id")
|
|
489
491
|
extractor = _EXTRACTORS.get(table)
|
|
492
|
+
if message_extractor is not None and table in ("conversation_messages", "ai_chat_messages"):
|
|
493
|
+
extractor = lambda item, db: message_extractor(item, db, table=table)
|
|
490
494
|
if extractor is None or str(record_id or "") in excluded_records:
|
|
491
495
|
stats["rows_skipped"] = stats.get("rows_skipped", 0) + 1
|
|
492
496
|
continue
|
|
@@ -329,6 +329,9 @@ class BlackholeStore:
|
|
|
329
329
|
if existing:
|
|
330
330
|
# Idempotent: already protected. Refresh the mutable bits, do not
|
|
331
331
|
# restart a rebuild that may already have completed.
|
|
332
|
+
# A re-flag must not forget owner-saved aliases when the entity was
|
|
333
|
+
# reaped or its current resolver inventory has become narrower.
|
|
334
|
+
aliases_json = json.dumps(sorted(set(existing["aliases"]) | set(_normalized_aliases(aliases_json))))
|
|
332
335
|
with with_db_write():
|
|
333
336
|
self._conn.execute(
|
|
334
337
|
"""
|
|
@@ -272,6 +272,48 @@ class BlackholeGuard:
|
|
|
272
272
|
kept.append(row)
|
|
273
273
|
return kept
|
|
274
274
|
|
|
275
|
+
def filter_observed_canonical_rows(self, rows, *, canonical_table):
|
|
276
|
+
"""Veto observed identity/contact/context on legacy canonical reads.
|
|
277
|
+
|
|
278
|
+
The owner retains access. Unsupported or unavailable protection context
|
|
279
|
+
withholds; this never confers a grant or certifies semantic absence.
|
|
280
|
+
A fresh boundary is used for each call, not cached between DB snapshots.
|
|
281
|
+
"""
|
|
282
|
+
if self.sees_everything:
|
|
283
|
+
return list(rows)
|
|
284
|
+
from ...permissions_v2.canonical import PolicyError
|
|
285
|
+
from ...permissions_v2.entity_boundary import EntityBoundary
|
|
286
|
+
from contextlib import closing, nullcontext
|
|
287
|
+
from urllib.parse import quote
|
|
288
|
+
|
|
289
|
+
try:
|
|
290
|
+
# Check existing protection state as the old guard did; required
|
|
291
|
+
# entity/record schemas are still checked in the fresh snapshot.
|
|
292
|
+
# Do not trust request-local cached ids at egress.
|
|
293
|
+
_ = self.active
|
|
294
|
+
path = self._conn.execute("PRAGMA database_list").fetchone()[2]
|
|
295
|
+
own_snapshot = bool(path) and not self._conn.in_transaction
|
|
296
|
+
context = (closing(sqlite3.connect("file:" + quote(path, safe="/") + "?mode=ro", uri=True))
|
|
297
|
+
if own_snapshot else nullcontext(self._conn))
|
|
298
|
+
with context as conn:
|
|
299
|
+
if own_snapshot:
|
|
300
|
+
conn.execute("BEGIN")
|
|
301
|
+
boundary = EntityBoundary(conn)
|
|
302
|
+
blocked = {str(row[0]) for row in conn.execute("SELECT record_id FROM owner_only_records")}
|
|
303
|
+
result = []
|
|
304
|
+
for row in rows:
|
|
305
|
+
try:
|
|
306
|
+
if any(str(row.get(key) or "") in blocked for key in
|
|
307
|
+
("record_id", "message_id", "id", "event_id", "entry_id", "transaction_id", "segment_id", "contact_id")):
|
|
308
|
+
continue
|
|
309
|
+
if not boundary.legacy_veto(canonical_table, row):
|
|
310
|
+
result.append(row)
|
|
311
|
+
except (PolicyError, sqlite3.Error, TypeError, ValueError, RecursionError):
|
|
312
|
+
continue
|
|
313
|
+
return result
|
|
314
|
+
except (PolicyError, sqlite3.Error, TypeError, ValueError, RecursionError):
|
|
315
|
+
return []
|
|
316
|
+
|
|
275
317
|
# ------------------------------------------------- free-text egress scan
|
|
276
318
|
|
|
277
319
|
def text_mentions_blackholed(self, text: Optional[str]) -> bool:
|