virtual-context 0.5__tar.gz → 0.6__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.
Files changed (882) hide show
  1. virtual_context-0.6/.gitignore +86 -0
  2. virtual_context-0.6/PKG-INFO +269 -0
  3. virtual_context-0.6/README.md +195 -0
  4. virtual_context-0.6/bugs.md +88 -0
  5. virtual_context-0.6/pyproject.toml +98 -0
  6. virtual_context-0.6/scripts/apply_canonical_repair_artifact_20260802.py +2498 -0
  7. virtual_context-0.6/scripts/check_contracts.py +91 -0
  8. virtual_context-0.6/scripts/export_discord_guild_transcript_20260802.py +565 -0
  9. virtual_context-0.6/scripts/extend_men_vast_disposition_20260802.py +352 -0
  10. virtual_context-0.6/scripts/install.ps1 +64 -0
  11. virtual_context-0.6/scripts/install.sh +70 -0
  12. virtual_context-0.6/scripts/rebuild_men_canonical_from_discord_20260802.py +1401 -0
  13. virtual_context-0.6/scripts/smoke_recommended.py +194 -0
  14. virtual_context-0.6/scripts/smoke_recommended.sh +32 -0
  15. virtual_context-0.6/tests/REGRESSION_MAP.md +1391 -0
  16. virtual_context-0.6/tests/conftest.py +194 -0
  17. virtual_context-0.6/tests/paging_sources.py +55 -0
  18. virtual_context-0.6/tests/proxy_http_helpers.py +28 -0
  19. virtual_context-0.6/tests/test_actor_attribution.py +989 -0
  20. virtual_context-0.6/tests/test_actor_backfills.py +513 -0
  21. virtual_context-0.6/tests/test_actor_card_admission_quality.py +183 -0
  22. virtual_context-0.6/tests/test_actor_card_assembly.py +394 -0
  23. virtual_context-0.6/tests/test_actor_card_commitment_policy.py +251 -0
  24. virtual_context-0.6/tests/test_actor_card_commitment_rebuild.py +133 -0
  25. virtual_context-0.6/tests/test_actor_card_curation_shape.py +108 -0
  26. virtual_context-0.6/tests/test_actor_card_named_provider.py +49 -0
  27. virtual_context-0.6/tests/test_actor_card_resource_preferences.py +311 -0
  28. virtual_context-0.6/tests/test_actor_card_source_time_evidence.py +130 -0
  29. virtual_context-0.6/tests/test_actor_card_style_evidence.py +351 -0
  30. virtual_context-0.6/tests/test_actor_card_validity.py +266 -0
  31. virtual_context-0.6/tests/test_actor_card_validity_postgres.py +66 -0
  32. virtual_context-0.6/tests/test_actor_cards.py +4295 -0
  33. virtual_context-0.6/tests/test_actor_cards_postgres.py +592 -0
  34. virtual_context-0.6/tests/test_actor_fact_attribution.py +95 -0
  35. virtual_context-0.6/tests/test_actor_search_time_window.py +222 -0
  36. virtual_context-0.6/tests/test_admin_backfill_session_state_markers.py +461 -0
  37. virtual_context-0.6/tests/test_admin_consolidate_tags.py +219 -0
  38. virtual_context-0.6/tests/test_admin_setup_contracts.py +92 -0
  39. virtual_context-0.6/tests/test_agent_authored_quote_guard.py +559 -0
  40. virtual_context-0.6/tests/test_agent_outbound_ids_metadata.py +170 -0
  41. virtual_context-0.6/tests/test_agent_outbound_outcome_returned.py +105 -0
  42. virtual_context-0.6/tests/test_assembler.py +433 -0
  43. virtual_context-0.6/tests/test_assistant_audience_stamping.py +207 -0
  44. virtual_context-0.6/tests/test_assistant_channel_enrichment.py +430 -0
  45. virtual_context-0.6/tests/test_assistant_channel_enrichment_cli.py +158 -0
  46. virtual_context-0.6/tests/test_assistant_channel_enrichment_integration.py +211 -0
  47. virtual_context-0.6/tests/test_assistant_channel_enrichment_postgres.py +384 -0
  48. virtual_context-0.6/tests/test_audience_reassignment.py +679 -0
  49. virtual_context-0.6/tests/test_audience_reassignment_cli.py +252 -0
  50. virtual_context-0.6/tests/test_audience_reassignment_postgres.py +244 -0
  51. virtual_context-0.6/tests/test_backfill_sender_profiles.py +136 -0
  52. virtual_context-0.6/tests/test_backlog_sweeper_claim.py +491 -0
  53. virtual_context-0.6/tests/test_backlog_sweeper_detection.py +486 -0
  54. virtual_context-0.6/tests/test_benchmark_cache_manifest.py +177 -0
  55. virtual_context-0.6/tests/test_benchmark_retrieval_authority.py +63 -0
  56. virtual_context-0.6/tests/test_bot_outbound_message_ledger_postgres.py +655 -0
  57. virtual_context-0.6/tests/test_budget_enforcement_order.py +60 -0
  58. virtual_context-0.6/tests/test_canonical_admission_parity.py +129 -0
  59. virtual_context-0.6/tests/test_canonical_pagination_identity.py +127 -0
  60. virtual_context-0.6/tests/test_canonical_repair_evidence_plan.py +103 -0
  61. virtual_context-0.6/tests/test_canonical_source_admission.py +1057 -0
  62. virtual_context-0.6/tests/test_canonical_source_admission_postgres.py +596 -0
  63. virtual_context-0.6/tests/test_canonical_tagging_integrity.py +1115 -0
  64. virtual_context-0.6/tests/test_canonical_tagging_integrity_postgres.py +224 -0
  65. virtual_context-0.6/tests/test_canonical_turn_host_timestamp.py +24 -0
  66. virtual_context-0.6/tests/test_card_availability_and_adjudication.py +423 -0
  67. virtual_context-0.6/tests/test_channel_attribution.py +1118 -0
  68. virtual_context-0.6/tests/test_channel_backfill.py +725 -0
  69. virtual_context-0.6/tests/test_channel_backfill_receipts.py +240 -0
  70. virtual_context-0.6/tests/test_channel_quote_search.py +672 -0
  71. virtual_context-0.6/tests/test_chat_context_placement.py +41 -0
  72. virtual_context-0.6/tests/test_codex_harness_prompt_envelope.py +90 -0
  73. virtual_context-0.6/tests/test_compaction_caller_wiring.py +852 -0
  74. virtual_context-0.6/tests/test_compaction_commit_prune.py +69 -0
  75. virtual_context-0.6/tests/test_compaction_community_services.py +244 -0
  76. virtual_context-0.6/tests/test_compaction_fence_inspector.py +807 -0
  77. virtual_context-0.6/tests/test_compaction_fence_modes.py +1015 -0
  78. virtual_context-0.6/tests/test_compaction_lifecycle.py +170 -0
  79. virtual_context-0.6/tests/test_compaction_lifecycle_wiring.py +192 -0
  80. virtual_context-0.6/tests/test_compaction_merge_speaker_identity.py +446 -0
  81. virtual_context-0.6/tests/test_compactor.py +3223 -0
  82. virtual_context-0.6/tests/test_completed_assistant_channel.py +222 -0
  83. virtual_context-0.6/tests/test_completed_turn_reservation.py +73 -0
  84. virtual_context-0.6/tests/test_completion_audience_stamp.py +81 -0
  85. virtual_context-0.6/tests/test_composite_store_forwarding.py +77 -0
  86. virtual_context-0.6/tests/test_config.py +459 -0
  87. virtual_context-0.6/tests/test_config_key_paths.py +85 -0
  88. virtual_context-0.6/tests/test_context_budget_contract.py +123 -0
  89. virtual_context-0.6/tests/test_context_cache_prefix.py +286 -0
  90. virtual_context-0.6/tests/test_context_hint_no_inline_rebuild.py +104 -0
  91. virtual_context-0.6/tests/test_context_resource_harness.py +22 -0
  92. virtual_context-0.6/tests/test_curation_memo.py +89 -0
  93. virtual_context-0.6/tests/test_current_attachments_preserved.py +120 -0
  94. virtual_context-0.6/tests/test_discord_snowflake.py +92 -0
  95. virtual_context-0.6/tests/test_drop_compacted_in_tool_loop.py +58 -0
  96. virtual_context-0.6/tests/test_embedding_memory_shape.py +160 -0
  97. virtual_context-0.6/tests/test_embedding_model_device.py +34 -0
  98. virtual_context-0.6/tests/test_engagement_broader.py +141 -0
  99. virtual_context-0.6/tests/test_engagement_continuation.py +433 -0
  100. virtual_context-0.6/tests/test_engagement_fidelity_injection.py +238 -0
  101. virtual_context-0.6/tests/test_engagement_history.py +427 -0
  102. virtual_context-0.6/tests/test_engagement_history_postgres.py +1030 -0
  103. virtual_context-0.6/tests/test_engagement_live_source.py +247 -0
  104. virtual_context-0.6/tests/test_engagement_pipeline.py +308 -0
  105. virtual_context-0.6/tests/test_engagement_poster.py +601 -0
  106. virtual_context-0.6/tests/test_engagement_publish_separation.py +99 -0
  107. virtual_context-0.6/tests/test_engagement_repaste_filter.py +147 -0
  108. virtual_context-0.6/tests/test_engagement_runner.py +582 -0
  109. virtual_context-0.6/tests/test_engagement_schedule.py +152 -0
  110. virtual_context-0.6/tests/test_engagement_selection.py +804 -0
  111. virtual_context-0.6/tests/test_engagement_sources.py +247 -0
  112. virtual_context-0.6/tests/test_engine_alias_resolution.py +2535 -0
  113. virtual_context-0.6/tests/test_engine_sync_turns.py +844 -0
  114. virtual_context-0.6/tests/test_export_discord_guild_transcript.py +68 -0
  115. virtual_context-0.6/tests/test_fact_audit_upgrade.py +78 -0
  116. virtual_context-0.6/tests/test_fact_dense_retrieval.py +1152 -0
  117. virtual_context-0.6/tests/test_fact_dense_search.py +123 -0
  118. virtual_context-0.6/tests/test_fact_dense_search_postgres.py +98 -0
  119. virtual_context-0.6/tests/test_fact_enrichment.py +1169 -0
  120. virtual_context-0.6/tests/test_fact_graph_integration.py +77 -0
  121. virtual_context-0.6/tests/test_fact_lifecycle_contracts.py +358 -0
  122. virtual_context-0.6/tests/test_fact_link_checker.py +164 -0
  123. virtual_context-0.6/tests/test_fact_query_constraints.py +89 -0
  124. virtual_context-0.6/tests/test_fact_write_log_identifies_segment.py +67 -0
  125. virtual_context-0.6/tests/test_facts_block_budget.py +245 -0
  126. virtual_context-0.6/tests/test_filesystem_embedding_pages.py +85 -0
  127. virtual_context-0.6/tests/test_filesystem_store_compaction_compat.py +204 -0
  128. virtual_context-0.6/tests/test_fill_pass.py +244 -0
  129. virtual_context-0.6/tests/test_filter_keeps_paired_over_unanswered.py +41 -0
  130. virtual_context-0.6/tests/test_find_quote.py +2401 -0
  131. virtual_context-0.6/tests/test_find_quote_request_scope.py +266 -0
  132. virtual_context-0.6/tests/test_flush_gate_turn_memo.py +46 -0
  133. virtual_context-0.6/tests/test_handle_prepare_payload.py +732 -0
  134. virtual_context-0.6/tests/test_history_catchup.py +218 -0
  135. virtual_context-0.6/tests/test_history_tagging_index_postgres.py +218 -0
  136. virtual_context-0.6/tests/test_history_widening_guard.py +129 -0
  137. virtual_context-0.6/tests/test_host_replay_expansion.py +180 -0
  138. virtual_context-0.6/tests/test_ingest_audience_attribution.py +249 -0
  139. virtual_context-0.6/tests/test_ingest_reconciler_epoch.py +153 -0
  140. virtual_context-0.6/tests/test_ingest_single_tail_pair.py +356 -0
  141. virtual_context-0.6/tests/test_ingestion_db_sweep_catchup.py +222 -0
  142. virtual_context-0.6/tests/test_ingestion_episode_crud.py +198 -0
  143. virtual_context-0.6/tests/test_ingestion_progress_event.py +75 -0
  144. virtual_context-0.6/tests/test_ingestion_regression_resume.py +473 -0
  145. virtual_context-0.6/tests/test_ingestion_watermark_atomicity.py +438 -0
  146. virtual_context-0.6/tests/test_jev_client_retry.py +27 -0
  147. virtual_context-0.6/tests/test_jev_fact_curation_batches.py +65 -0
  148. virtual_context-0.6/tests/test_jev_harness_smoke.py +60 -0
  149. virtual_context-0.6/tests/test_judgment_admission.py +139 -0
  150. virtual_context-0.6/tests/test_judgment_config.py +57 -0
  151. virtual_context-0.6/tests/test_judgment_engine_install.py +73 -0
  152. virtual_context-0.6/tests/test_judgment_rerank.py +96 -0
  153. virtual_context-0.6/tests/test_judgment_runtime.py +179 -0
  154. virtual_context-0.6/tests/test_judgment_runtime_threading.py +89 -0
  155. virtual_context-0.6/tests/test_judgment_seams.py +129 -0
  156. virtual_context-0.6/tests/test_judgment_seams_v2.py +290 -0
  157. virtual_context-0.6/tests/test_judgment_seams_v2_hosts.py +273 -0
  158. virtual_context-0.6/tests/test_judgment_topic_select.py +205 -0
  159. virtual_context-0.6/tests/test_legacy_ingestion_lease_ownership.py +1117 -0
  160. virtual_context-0.6/tests/test_lifecycle_epoch_start_postgres.py +162 -0
  161. virtual_context-0.6/tests/test_live_turn_restore.py +63 -0
  162. virtual_context-0.6/tests/test_mark_canonical_turns_compacted_all_halves.py +228 -0
  163. virtual_context-0.6/tests/test_mcp_server.py +140 -0
  164. virtual_context-0.6/tests/test_multi_worker_sliding_window.py +253 -0
  165. virtual_context-0.6/tests/test_native_semantic_search.py +294 -0
  166. virtual_context-0.6/tests/test_noop_ingest_skips_whole_conversation_passes.py +54 -0
  167. virtual_context-0.6/tests/test_one_turn_per_message.py +127 -0
  168. virtual_context-0.6/tests/test_orphaned_compaction_operation.py +69 -0
  169. virtual_context-0.6/tests/test_orphaned_compaction_operation_postgres.py +79 -0
  170. virtual_context-0.6/tests/test_out_of_band_route_audience.py +80 -0
  171. virtual_context-0.6/tests/test_owner_conversation_authority.py +84 -0
  172. virtual_context-0.6/tests/test_paging.py +1724 -0
  173. virtual_context-0.6/tests/test_paging_transactions.py +44 -0
  174. virtual_context-0.6/tests/test_pending_compaction_reads.py +113 -0
  175. virtual_context-0.6/tests/test_pending_exchange_guard_lookup.py +44 -0
  176. virtual_context-0.6/tests/test_pgvector_storage_postgres.py +192 -0
  177. virtual_context-0.6/tests/test_pgvector_storage_shapes.py +174 -0
  178. virtual_context-0.6/tests/test_pool_fill_measurement.py +88 -0
  179. virtual_context-0.6/tests/test_postgres_fact_mutation_atomicity.py +111 -0
  180. virtual_context-0.6/tests/test_postgres_fleet_sentinel.py +220 -0
  181. virtual_context-0.6/tests/test_postgres_read_index_migration.py +74 -0
  182. virtual_context-0.6/tests/test_postgres_store.py +815 -0
  183. virtual_context-0.6/tests/test_prepare_user_message_strip.py +93 -0
  184. virtual_context-0.6/tests/test_process_tag_vector_cache.py +79 -0
  185. virtual_context-0.6/tests/test_progress_snapshot_postgres.py +395 -0
  186. virtual_context-0.6/tests/test_protected_window_host_speaker_dedup.py +72 -0
  187. virtual_context-0.6/tests/test_protected_zone_media_size.py +58 -0
  188. virtual_context-0.6/tests/test_provider_adapters.py +603 -0
  189. virtual_context-0.6/tests/test_provider_request_timeout.py +45 -0
  190. virtual_context-0.6/tests/test_proxy.py +2143 -0
  191. virtual_context-0.6/tests/test_proxy_collect_undeclared_sse.py +115 -0
  192. virtual_context-0.6/tests/test_proxy_dashboard.py +1093 -0
  193. virtual_context-0.6/tests/test_proxy_durable_continuation.py +545 -0
  194. virtual_context-0.6/tests/test_proxy_formats.py +2821 -0
  195. virtual_context-0.6/tests/test_proxy_handler_public_text.py +142 -0
  196. virtual_context-0.6/tests/test_proxy_request_content_encoding.py +169 -0
  197. virtual_context-0.6/tests/test_proxy_review_invariants.py +255 -0
  198. virtual_context-0.6/tests/test_proxy_session.py +1664 -0
  199. virtual_context-0.6/tests/test_proxy_streaming.py +1311 -0
  200. virtual_context-0.6/tests/test_proxy_upstream_cookies.py +22 -0
  201. virtual_context-0.6/tests/test_query_facts_speaker_selection.py +266 -0
  202. virtual_context-0.6/tests/test_raw_content.py +292 -0
  203. virtual_context-0.6/tests/test_rebuild_log_rejection_format.py +49 -0
  204. virtual_context-0.6/tests/test_recall_all.py +129 -0
  205. virtual_context-0.6/tests/test_recommended_preset.py +61 -0
  206. virtual_context-0.6/tests/test_reconcile_lock_timeout.py +98 -0
  207. virtual_context-0.6/tests/test_reindex_canonical_turn_embeddings.py +263 -0
  208. virtual_context-0.6/tests/test_relational_contracts.py +99 -0
  209. virtual_context-0.6/tests/test_render_escape_host_attribution.py +277 -0
  210. virtual_context-0.6/tests/test_rendered_memory_paging.py +75 -0
  211. virtual_context-0.6/tests/test_rendered_tag_budget.py +129 -0
  212. virtual_context-0.6/tests/test_reply_participant_continuity.py +373 -0
  213. virtual_context-0.6/tests/test_responses_context_in_tool_loop.py +69 -0
  214. virtual_context-0.6/tests/test_responses_context_placement.py +76 -0
  215. virtual_context-0.6/tests/test_responses_custom_tool_outputs.py +200 -0
  216. virtual_context-0.6/tests/test_responses_host_context_items.py +67 -0
  217. virtual_context-0.6/tests/test_rest_phase_lifecycle.py +131 -0
  218. virtual_context-0.6/tests/test_restore_tool_after_safety_valve.py +41 -0
  219. virtual_context-0.6/tests/test_resummarize_cmd.py +518 -0
  220. virtual_context-0.6/tests/test_retag_canonical_turns.py +346 -0
  221. virtual_context-0.6/tests/test_retrieval_context_is_worker_independent.py +63 -0
  222. virtual_context-0.6/tests/test_retrieval_memo.py +98 -0
  223. virtual_context-0.6/tests/test_schema_ddl_guards.py +251 -0
  224. virtual_context-0.6/tests/test_segment_refs_filter.py +165 -0
  225. virtual_context-0.6/tests/test_segment_summary_chunk.py +86 -0
  226. virtual_context-0.6/tests/test_segmenter.py +873 -0
  227. virtual_context-0.6/tests/test_sender_attribution.py +644 -0
  228. virtual_context-0.6/tests/test_sender_identity.py +354 -0
  229. virtual_context-0.6/tests/test_sender_summarization.py +416 -0
  230. virtual_context-0.6/tests/test_session_date.py +604 -0
  231. virtual_context-0.6/tests/test_session_state.py +761 -0
  232. virtual_context-0.6/tests/test_session_state_version_roundtrip.py +83 -0
  233. virtual_context-0.6/tests/test_session_tombstone_probe.py +96 -0
  234. virtual_context-0.6/tests/test_shared_embedding_model_cache.py +136 -0
  235. virtual_context-0.6/tests/test_source_event_times.py +228 -0
  236. virtual_context-0.6/tests/test_source_event_times_postgres.py +84 -0
  237. virtual_context-0.6/tests/test_speaker_acceptance.py +316 -0
  238. virtual_context-0.6/tests/test_speaker_actor_secrecy.py +204 -0
  239. virtual_context-0.6/tests/test_speaker_context_threading.py +722 -0
  240. virtual_context-0.6/tests/test_speaker_gate_routing.py +227 -0
  241. virtual_context-0.6/tests/test_speaker_labels.py +569 -0
  242. virtual_context-0.6/tests/test_speaker_only.py +581 -0
  243. virtual_context-0.6/tests/test_speaker_quote_dedupe.py +198 -0
  244. virtual_context-0.6/tests/test_speaker_result_serialization.py +473 -0
  245. virtual_context-0.6/tests/test_speaker_roster.py +675 -0
  246. virtual_context-0.6/tests/test_speaker_roster_budget.py +548 -0
  247. virtual_context-0.6/tests/test_speaker_rows_lean.py +182 -0
  248. virtual_context-0.6/tests/test_speaker_scoping_refusal.py +176 -0
  249. virtual_context-0.6/tests/test_speaker_semantic_projection.py +438 -0
  250. virtual_context-0.6/tests/test_speaker_storage_provenance.py +436 -0
  251. virtual_context-0.6/tests/test_speaker_store_seams.py +312 -0
  252. virtual_context-0.6/tests/test_sqlite_bootstrap_serialization.py +108 -0
  253. virtual_context-0.6/tests/test_sqlite_maintenance_cli.py +124 -0
  254. virtual_context-0.6/tests/test_sqlite_reconcile_transactions.py +93 -0
  255. virtual_context-0.6/tests/test_storage_bounded_contracts.py +151 -0
  256. virtual_context-0.6/tests/test_storage_domain_contracts.py +423 -0
  257. virtual_context-0.6/tests/test_storage_upsert_integrity.py +128 -0
  258. virtual_context-0.6/tests/test_store_recovery.py +739 -0
  259. virtual_context-0.6/tests/test_store_sqlite.py +540 -0
  260. virtual_context-0.6/tests/test_streaming_semantic_search.py +135 -0
  261. virtual_context-0.6/tests/test_strict_history_indexing.py +354 -0
  262. virtual_context-0.6/tests/test_structured_summary_migration.py +1588 -0
  263. virtual_context-0.6/tests/test_structured_summary_storage.py +277 -0
  264. virtual_context-0.6/tests/test_summary_identity.py +181 -0
  265. virtual_context-0.6/tests/test_supersession.py +406 -0
  266. virtual_context-0.6/tests/test_supersession_migration.py +44 -0
  267. virtual_context-0.6/tests/test_tag_alias_folding.py +194 -0
  268. virtual_context-0.6/tests/test_tag_consolidation_apply.py +130 -0
  269. virtual_context-0.6/tests/test_tag_consolidation_safety.py +384 -0
  270. virtual_context-0.6/tests/test_tag_consolidation_scale.py +132 -0
  271. virtual_context-0.6/tests/test_tag_consolidator.py +369 -0
  272. virtual_context-0.6/tests/test_tag_embedding_runtime_cap.py +78 -0
  273. virtual_context-0.6/tests/test_tag_index_restore_without_state.py +64 -0
  274. virtual_context-0.6/tests/test_tag_select_seam.py +184 -0
  275. virtual_context-0.6/tests/test_tag_summary_backfill.py +666 -0
  276. virtual_context-0.6/tests/test_tag_summary_embedding_snapshot_freshness.py +89 -0
  277. virtual_context-0.6/tests/test_tag_turn_persists_under_signal.py +25 -0
  278. virtual_context-0.6/tests/test_tagger_loop.py +295 -0
  279. virtual_context-0.6/tests/test_temporal_resolver.py +1539 -0
  280. virtual_context-0.6/tests/test_temporal_status_cessation.py +155 -0
  281. virtual_context-0.6/tests/test_tool_loop.py +1903 -0
  282. virtual_context-0.6/tests/test_unreplied_turns_compaction.py +79 -0
  283. virtual_context-0.6/tests/test_vcattach.py +1527 -0
  284. virtual_context-0.6/tests/test_vcattach_marker_write.py +496 -0
  285. virtual_context-0.6/tests/test_verb_expansion.py +586 -0
  286. virtual_context-0.6/uv.lock +2698 -0
  287. virtual_context-0.6/virtual-context.yaml.example +391 -0
  288. virtual_context-0.6/virtual_context/__init__.py +31 -0
  289. virtual_context-0.6/virtual_context/actor_card_validity.py +64 -0
  290. virtual_context-0.6/virtual_context/cli/assistant_channel_enrichment_cmd.py +108 -0
  291. virtual_context-0.6/virtual_context/cli/audience_reassignment_cmd.py +142 -0
  292. virtual_context-0.6/virtual_context/cli/main.py +3751 -0
  293. virtual_context-0.6/virtual_context/cli/resummarize_cmd.py +960 -0
  294. virtual_context-0.6/virtual_context/cli/structured_summary_migration_cmd.py +2969 -0
  295. virtual_context-0.6/virtual_context/config.py +897 -0
  296. virtual_context-0.6/virtual_context/core/__init__.py +0 -0
  297. virtual_context-0.6/virtual_context/core/assembler.py +2043 -0
  298. virtual_context-0.6/virtual_context/core/canonical_turns.py +228 -0
  299. virtual_context-0.6/virtual_context/core/chat_context.py +51 -0
  300. virtual_context-0.6/virtual_context/core/community/__init__.py +1 -0
  301. virtual_context-0.6/virtual_context/core/community/actor_card_admission.py +525 -0
  302. virtual_context-0.6/virtual_context/core/community/actor_card_curation.py +441 -0
  303. virtual_context-0.6/virtual_context/core/community/actor_card_evidence.py +307 -0
  304. virtual_context-0.6/virtual_context/core/community/actor_card_policy.py +315 -0
  305. virtual_context-0.6/virtual_context/core/community/actor_card_rebuild.py +1199 -0
  306. virtual_context-0.6/virtual_context/core/community/attribution.py +468 -0
  307. virtual_context-0.6/virtual_context/core/community/canonical_sources.py +99 -0
  308. virtual_context-0.6/virtual_context/core/community/evidence_manifest.py +47 -0
  309. virtual_context-0.6/virtual_context/core/compaction_pipeline.py +2060 -0
  310. virtual_context-0.6/virtual_context/core/compactor.py +2842 -0
  311. virtual_context-0.6/virtual_context/core/composite_store.py +2760 -0
  312. virtual_context-0.6/virtual_context/core/conversation_store.py +123 -0
  313. virtual_context-0.6/virtual_context/core/discord_snowflake.py +57 -0
  314. virtual_context-0.6/virtual_context/core/embedding_provider.py +143 -0
  315. virtual_context-0.6/virtual_context/core/embedding_tag_generator.py +331 -0
  316. virtual_context-0.6/virtual_context/core/engagement/__init__.py +194 -0
  317. virtual_context-0.6/virtual_context/core/engagement/allowlist.py +80 -0
  318. virtual_context-0.6/virtual_context/core/engagement/broader.py +147 -0
  319. virtual_context-0.6/virtual_context/core/engagement/candidates.py +125 -0
  320. virtual_context-0.6/virtual_context/core/engagement/channels.py +60 -0
  321. virtual_context-0.6/virtual_context/core/engagement/compose.py +214 -0
  322. virtual_context-0.6/virtual_context/core/engagement/continuation.py +166 -0
  323. virtual_context-0.6/virtual_context/core/engagement/fidelity.py +468 -0
  324. virtual_context-0.6/virtual_context/core/engagement/history.py +703 -0
  325. virtual_context-0.6/virtual_context/core/engagement/live_source.py +164 -0
  326. virtual_context-0.6/virtual_context/core/engagement/poster.py +240 -0
  327. virtual_context-0.6/virtual_context/core/engagement/report.py +196 -0
  328. virtual_context-0.6/virtual_context/core/engagement/runner.py +293 -0
  329. virtual_context-0.6/virtual_context/core/engagement/schedule.py +112 -0
  330. virtual_context-0.6/virtual_context/core/engagement/select.py +222 -0
  331. virtual_context-0.6/virtual_context/core/engagement/sources.py +68 -0
  332. virtual_context-0.6/virtual_context/core/engagement/timing.py +82 -0
  333. virtual_context-0.6/virtual_context/core/engagement/verify.py +120 -0
  334. virtual_context-0.6/virtual_context/core/exceptions.py +242 -0
  335. virtual_context-0.6/virtual_context/core/fact_lifecycle.py +171 -0
  336. virtual_context-0.6/virtual_context/core/fact_query.py +383 -0
  337. virtual_context-0.6/virtual_context/core/hint_builder.py +493 -0
  338. virtual_context-0.6/virtual_context/core/history_catchup.py +147 -0
  339. virtual_context-0.6/virtual_context/core/ingest_reconciler.py +3235 -0
  340. virtual_context-0.6/virtual_context/core/judgment.py +1448 -0
  341. virtual_context-0.6/virtual_context/core/paging_manager.py +224 -0
  342. virtual_context-0.6/virtual_context/core/protected_window.py +654 -0
  343. virtual_context-0.6/virtual_context/core/protocols.py +766 -0
  344. virtual_context-0.6/virtual_context/core/provider_adapters.py +989 -0
  345. virtual_context-0.6/virtual_context/core/quote_search.py +3682 -0
  346. virtual_context-0.6/virtual_context/core/render_escape.py +81 -0
  347. virtual_context-0.6/virtual_context/core/rendered_memory.py +81 -0
  348. virtual_context-0.6/virtual_context/core/reply_context.py +93 -0
  349. virtual_context-0.6/virtual_context/core/responses_context.py +89 -0
  350. virtual_context-0.6/virtual_context/core/retrieval_assembler.py +1348 -0
  351. virtual_context-0.6/virtual_context/core/retrieval_scoring.py +536 -0
  352. virtual_context-0.6/virtual_context/core/retriever.py +1187 -0
  353. virtual_context-0.6/virtual_context/core/search_engine.py +271 -0
  354. virtual_context-0.6/virtual_context/core/segment_summary_chunks.py +51 -0
  355. virtual_context-0.6/virtual_context/core/segmenter.py +822 -0
  356. virtual_context-0.6/virtual_context/core/semantic_search.py +1011 -0
  357. virtual_context-0.6/virtual_context/core/speaker_labels.py +391 -0
  358. virtual_context-0.6/virtual_context/core/speaker_roster.py +449 -0
  359. virtual_context-0.6/virtual_context/core/state_recovery.py +349 -0
  360. virtual_context-0.6/virtual_context/core/store.py +2401 -0
  361. virtual_context-0.6/virtual_context/core/store_capabilities.py +49 -0
  362. virtual_context-0.6/virtual_context/core/structured_summary.py +717 -0
  363. virtual_context-0.6/virtual_context/core/summary_identity.py +405 -0
  364. virtual_context-0.6/virtual_context/core/sweeper_backlog.py +205 -0
  365. virtual_context-0.6/virtual_context/core/tag_canonicalizer.py +184 -0
  366. virtual_context-0.6/virtual_context/core/tag_consolidator.py +554 -0
  367. virtual_context-0.6/virtual_context/core/tag_generator.py +1021 -0
  368. virtual_context-0.6/virtual_context/core/tag_splitter.py +190 -0
  369. virtual_context-0.6/virtual_context/core/tagging_pipeline.py +2270 -0
  370. virtual_context-0.6/virtual_context/core/telemetry.py +162 -0
  371. virtual_context-0.6/virtual_context/core/temporal_resolver.py +2812 -0
  372. virtual_context-0.6/virtual_context/core/tool_loop.py +2503 -0
  373. virtual_context-0.6/virtual_context/engine.py +5170 -0
  374. virtual_context-0.6/virtual_context/ingest/curator.py +110 -0
  375. virtual_context-0.6/virtual_context/ingest/date_resolver.py +255 -0
  376. virtual_context-0.6/virtual_context/ingest/parsers.py +69 -0
  377. virtual_context-0.6/virtual_context/ingest/supersession.py +883 -0
  378. virtual_context-0.6/virtual_context/mcp/server.py +420 -0
  379. virtual_context-0.6/virtual_context/presets/__init__.py +8 -0
  380. virtual_context-0.6/virtual_context/presets/base.py +30 -0
  381. virtual_context-0.6/virtual_context/presets/recommended.py +176 -0
  382. virtual_context-0.6/virtual_context/providers/anthropic.py +76 -0
  383. virtual_context-0.6/virtual_context/providers/base.py +231 -0
  384. virtual_context-0.6/virtual_context/proxy/_envelope.py +484 -0
  385. virtual_context-0.6/virtual_context/proxy/continuation.py +550 -0
  386. virtual_context-0.6/virtual_context/proxy/dashboard.py +1182 -0
  387. virtual_context-0.6/virtual_context/proxy/flush_gate.py +36 -0
  388. virtual_context-0.6/virtual_context/proxy/formats.py +3990 -0
  389. virtual_context-0.6/virtual_context/proxy/handlers.py +2290 -0
  390. virtual_context-0.6/virtual_context/proxy/helpers.py +693 -0
  391. virtual_context-0.6/virtual_context/proxy/host_replay.py +158 -0
  392. virtual_context-0.6/virtual_context/proxy/media.py +331 -0
  393. virtual_context-0.6/virtual_context/proxy/message_filter.py +3664 -0
  394. virtual_context-0.6/virtual_context/proxy/metrics.py +916 -0
  395. virtual_context-0.6/virtual_context/proxy/registry.py +395 -0
  396. virtual_context-0.6/virtual_context/proxy/request_context.py +65 -0
  397. virtual_context-0.6/virtual_context/proxy/response_codec.py +302 -0
  398. virtual_context-0.6/virtual_context/proxy/server.py +3477 -0
  399. virtual_context-0.6/virtual_context/proxy/session_state.py +1845 -0
  400. virtual_context-0.6/virtual_context/proxy/state.py +4662 -0
  401. virtual_context-0.6/virtual_context/proxy/turn_progress.py +136 -0
  402. virtual_context-0.6/virtual_context/proxy/vcattach.py +603 -0
  403. virtual_context-0.6/virtual_context/storage/actor_card_transition_guards.py +197 -0
  404. virtual_context-0.6/virtual_context/storage/assistant_channel_enrichment.py +676 -0
  405. virtual_context-0.6/virtual_context/storage/audience_proof.py +88 -0
  406. virtual_context-0.6/virtual_context/storage/audience_reassignment.py +779 -0
  407. virtual_context-0.6/virtual_context/storage/channel_enrichment_guards.py +125 -0
  408. virtual_context-0.6/virtual_context/storage/compaction_reads.py +225 -0
  409. virtual_context-0.6/virtual_context/storage/fact_mutations.py +489 -0
  410. virtual_context-0.6/virtual_context/storage/falkordb.py +466 -0
  411. virtual_context-0.6/virtual_context/storage/filesystem.py +1546 -0
  412. virtual_context-0.6/virtual_context/storage/maintenance.py +100 -0
  413. virtual_context-0.6/virtual_context/storage/neo4j.py +501 -0
  414. virtual_context-0.6/virtual_context/storage/postgres.py +16453 -0
  415. virtual_context-0.6/virtual_context/storage/postgres_maintenance.py +52 -0
  416. virtual_context-0.6/virtual_context/storage/postgres_vectors.py +488 -0
  417. virtual_context-0.6/virtual_context/storage/receipted_source_rows.py +44 -0
  418. virtual_context-0.6/virtual_context/storage/relational.py +424 -0
  419. virtual_context-0.6/virtual_context/storage/source_event_times.py +257 -0
  420. virtual_context-0.6/virtual_context/storage/sqlite.py +16088 -0
  421. virtual_context-0.6/virtual_context/token_counter.py +96 -0
  422. virtual_context-0.6/virtual_context/tui/headless.py +277 -0
  423. virtual_context-0.6/virtual_context/types.py +3582 -0
  424. virtual_context-0.5/.gitignore +0 -75
  425. virtual_context-0.5/OVERNIGHT_ASSUMPTIONS.md +0 -92
  426. virtual_context-0.5/PKG-INFO +0 -586
  427. virtual_context-0.5/README.md +0 -537
  428. virtual_context-0.5/pyproject.toml +0 -103
  429. virtual_context-0.5/scripts/install.ps1 +0 -64
  430. virtual_context-0.5/scripts/install.sh +0 -70
  431. virtual_context-0.5/tests/REGRESSION_MAP.md +0 -599
  432. virtual_context-0.5/tests/conftest.py +0 -177
  433. virtual_context-0.5/tests/test_actor_attribution.py +0 -937
  434. virtual_context-0.5/tests/test_actor_backfills.py +0 -394
  435. virtual_context-0.5/tests/test_actor_card_assembly.py +0 -352
  436. virtual_context-0.5/tests/test_actor_cards.py +0 -3576
  437. virtual_context-0.5/tests/test_actor_cards_postgres.py +0 -486
  438. virtual_context-0.5/tests/test_actor_fact_attribution.py +0 -91
  439. virtual_context-0.5/tests/test_admin_backfill_session_state_markers.py +0 -313
  440. virtual_context-0.5/tests/test_assembler.py +0 -286
  441. virtual_context-0.5/tests/test_backfill_sender_profiles.py +0 -136
  442. virtual_context-0.5/tests/test_backlog_sweeper_claim.py +0 -459
  443. virtual_context-0.5/tests/test_backlog_sweeper_detection.py +0 -451
  444. virtual_context-0.5/tests/test_canonical_admission_parity.py +0 -129
  445. virtual_context-0.5/tests/test_channel_attribution.py +0 -1116
  446. virtual_context-0.5/tests/test_channel_backfill.py +0 -724
  447. virtual_context-0.5/tests/test_channel_quote_search.py +0 -666
  448. virtual_context-0.5/tests/test_compaction_caller_wiring.py +0 -848
  449. virtual_context-0.5/tests/test_compaction_commit_prune.py +0 -67
  450. virtual_context-0.5/tests/test_compaction_fence_inspector.py +0 -762
  451. virtual_context-0.5/tests/test_compaction_fence_modes.py +0 -1017
  452. virtual_context-0.5/tests/test_compaction_lifecycle.py +0 -170
  453. virtual_context-0.5/tests/test_compaction_lifecycle_wiring.py +0 -170
  454. virtual_context-0.5/tests/test_compactor.py +0 -607
  455. virtual_context-0.5/tests/test_config.py +0 -453
  456. virtual_context-0.5/tests/test_engine_alias_resolution.py +0 -2509
  457. virtual_context-0.5/tests/test_engine_sync_turns.py +0 -844
  458. virtual_context-0.5/tests/test_fact_dense_retrieval.py +0 -1136
  459. virtual_context-0.5/tests/test_fact_enrichment.py +0 -1173
  460. virtual_context-0.5/tests/test_fact_graph_integration.py +0 -78
  461. virtual_context-0.5/tests/test_fact_link_checker.py +0 -146
  462. virtual_context-0.5/tests/test_filesystem_store_compaction_compat.py +0 -172
  463. virtual_context-0.5/tests/test_fill_pass.py +0 -274
  464. virtual_context-0.5/tests/test_find_quote.py +0 -2210
  465. virtual_context-0.5/tests/test_handle_prepare_payload.py +0 -723
  466. virtual_context-0.5/tests/test_ingest_audience_attribution.py +0 -244
  467. virtual_context-0.5/tests/test_ingest_reconciler_epoch.py +0 -142
  468. virtual_context-0.5/tests/test_ingest_single_tail_pair.py +0 -247
  469. virtual_context-0.5/tests/test_ingestion_db_sweep_catchup.py +0 -222
  470. virtual_context-0.5/tests/test_ingestion_episode_crud.py +0 -198
  471. virtual_context-0.5/tests/test_ingestion_progress_event.py +0 -75
  472. virtual_context-0.5/tests/test_ingestion_regression_resume.py +0 -471
  473. virtual_context-0.5/tests/test_legacy_ingestion_lease_ownership.py +0 -1095
  474. virtual_context-0.5/tests/test_mark_canonical_turns_compacted_all_halves.py +0 -194
  475. virtual_context-0.5/tests/test_mcp_server.py +0 -129
  476. virtual_context-0.5/tests/test_multi_worker_sliding_window.py +0 -247
  477. virtual_context-0.5/tests/test_paging.py +0 -1808
  478. virtual_context-0.5/tests/test_postgres_fleet_sentinel.py +0 -218
  479. virtual_context-0.5/tests/test_postgres_store.py +0 -304
  480. virtual_context-0.5/tests/test_progress_snapshot_postgres.py +0 -335
  481. virtual_context-0.5/tests/test_provider_adapters.py +0 -657
  482. virtual_context-0.5/tests/test_proxy.py +0 -2146
  483. virtual_context-0.5/tests/test_proxy_dashboard.py +0 -1092
  484. virtual_context-0.5/tests/test_proxy_formats.py +0 -2811
  485. virtual_context-0.5/tests/test_proxy_session.py +0 -1647
  486. virtual_context-0.5/tests/test_proxy_streaming.py +0 -1311
  487. virtual_context-0.5/tests/test_query_facts_speaker_selection.py +0 -160
  488. virtual_context-0.5/tests/test_raw_content.py +0 -292
  489. virtual_context-0.5/tests/test_recall_all.py +0 -118
  490. virtual_context-0.5/tests/test_reconcile_lock_timeout.py +0 -96
  491. virtual_context-0.5/tests/test_reindex_canonical_turn_embeddings.py +0 -262
  492. virtual_context-0.5/tests/test_resummarize_cmd.py +0 -259
  493. virtual_context-0.5/tests/test_retag_canonical_turns.py +0 -296
  494. virtual_context-0.5/tests/test_segmenter.py +0 -552
  495. virtual_context-0.5/tests/test_sender_attribution.py +0 -636
  496. virtual_context-0.5/tests/test_sender_identity.py +0 -352
  497. virtual_context-0.5/tests/test_sender_summarization.py +0 -313
  498. virtual_context-0.5/tests/test_session_date.py +0 -599
  499. virtual_context-0.5/tests/test_session_state.py +0 -361
  500. virtual_context-0.5/tests/test_speaker_acceptance.py +0 -313
  501. virtual_context-0.5/tests/test_speaker_actor_secrecy.py +0 -186
  502. virtual_context-0.5/tests/test_speaker_context_threading.py +0 -725
  503. virtual_context-0.5/tests/test_speaker_gate_routing.py +0 -143
  504. virtual_context-0.5/tests/test_speaker_labels.py +0 -510
  505. virtual_context-0.5/tests/test_speaker_only.py +0 -425
  506. virtual_context-0.5/tests/test_speaker_quote_dedupe.py +0 -195
  507. virtual_context-0.5/tests/test_speaker_result_serialization.py +0 -565
  508. virtual_context-0.5/tests/test_speaker_roster.py +0 -626
  509. virtual_context-0.5/tests/test_speaker_roster_budget.py +0 -542
  510. virtual_context-0.5/tests/test_speaker_semantic_projection.py +0 -431
  511. virtual_context-0.5/tests/test_speaker_storage_provenance.py +0 -435
  512. virtual_context-0.5/tests/test_speaker_store_seams.py +0 -289
  513. virtual_context-0.5/tests/test_store_recovery.py +0 -390
  514. virtual_context-0.5/tests/test_store_sqlite.py +0 -525
  515. virtual_context-0.5/tests/test_supersession.py +0 -390
  516. virtual_context-0.5/tests/test_supersession_migration.py +0 -46
  517. virtual_context-0.5/tests/test_tag_consolidator.py +0 -336
  518. virtual_context-0.5/tests/test_tag_summary_backfill.py +0 -636
  519. virtual_context-0.5/tests/test_tagger_loop.py +0 -231
  520. virtual_context-0.5/tests/test_temporal_resolver.py +0 -1488
  521. virtual_context-0.5/tests/test_tool_loop.py +0 -2031
  522. virtual_context-0.5/tests/test_vcattach.py +0 -1512
  523. virtual_context-0.5/tests/test_vcattach_marker_write.py +0 -435
  524. virtual_context-0.5/tests/test_verb_expansion.py +0 -585
  525. virtual_context-0.5/virtual-context.yaml.example +0 -383
  526. virtual_context-0.5/virtual_context/__init__.py +0 -31
  527. virtual_context-0.5/virtual_context/cli/main.py +0 -3256
  528. virtual_context-0.5/virtual_context/cli/resummarize_cmd.py +0 -540
  529. virtual_context-0.5/virtual_context/config.py +0 -732
  530. virtual_context-0.5/virtual_context/core/assembler.py +0 -1261
  531. virtual_context-0.5/virtual_context/core/canonical_turns.py +0 -218
  532. virtual_context-0.5/virtual_context/core/compaction_pipeline.py +0 -3823
  533. virtual_context-0.5/virtual_context/core/compactor.py +0 -1523
  534. virtual_context-0.5/virtual_context/core/composite_store.py +0 -2142
  535. virtual_context-0.5/virtual_context/core/conversation_store.py +0 -116
  536. virtual_context-0.5/virtual_context/core/embedding_provider.py +0 -96
  537. virtual_context-0.5/virtual_context/core/embedding_tag_generator.py +0 -321
  538. virtual_context-0.5/virtual_context/core/exceptions.py +0 -198
  539. virtual_context-0.5/virtual_context/core/fact_query.py +0 -351
  540. virtual_context-0.5/virtual_context/core/hint_builder.py +0 -502
  541. virtual_context-0.5/virtual_context/core/ingest_reconciler.py +0 -2177
  542. virtual_context-0.5/virtual_context/core/paging_manager.py +0 -196
  543. virtual_context-0.5/virtual_context/core/protected_window.py +0 -654
  544. virtual_context-0.5/virtual_context/core/protocols.py +0 -615
  545. virtual_context-0.5/virtual_context/core/provider_adapters.py +0 -1058
  546. virtual_context-0.5/virtual_context/core/quote_search.py +0 -3468
  547. virtual_context-0.5/virtual_context/core/retrieval_assembler.py +0 -1166
  548. virtual_context-0.5/virtual_context/core/retrieval_scoring.py +0 -536
  549. virtual_context-0.5/virtual_context/core/retriever.py +0 -769
  550. virtual_context-0.5/virtual_context/core/search_engine.py +0 -220
  551. virtual_context-0.5/virtual_context/core/segmenter.py +0 -686
  552. virtual_context-0.5/virtual_context/core/semantic_search.py +0 -927
  553. virtual_context-0.5/virtual_context/core/speaker_labels.py +0 -367
  554. virtual_context-0.5/virtual_context/core/speaker_roster.py +0 -422
  555. virtual_context-0.5/virtual_context/core/state_recovery.py +0 -327
  556. virtual_context-0.5/virtual_context/core/store.py +0 -1933
  557. virtual_context-0.5/virtual_context/core/sweeper_backlog.py +0 -172
  558. virtual_context-0.5/virtual_context/core/tag_canonicalizer.py +0 -139
  559. virtual_context-0.5/virtual_context/core/tag_consolidator.py +0 -368
  560. virtual_context-0.5/virtual_context/core/tag_generator.py +0 -830
  561. virtual_context-0.5/virtual_context/core/tag_splitter.py +0 -166
  562. virtual_context-0.5/virtual_context/core/tagging_pipeline.py +0 -2053
  563. virtual_context-0.5/virtual_context/core/telemetry.py +0 -162
  564. virtual_context-0.5/virtual_context/core/temporal_resolver.py +0 -2713
  565. virtual_context-0.5/virtual_context/core/tool_loop.py +0 -2274
  566. virtual_context-0.5/virtual_context/engine.py +0 -4560
  567. virtual_context-0.5/virtual_context/ingest/curator.py +0 -96
  568. virtual_context-0.5/virtual_context/ingest/date_resolver.py +0 -255
  569. virtual_context-0.5/virtual_context/ingest/parsers.py +0 -70
  570. virtual_context-0.5/virtual_context/ingest/supersession.py +0 -1005
  571. virtual_context-0.5/virtual_context/mcp/server.py +0 -338
  572. virtual_context-0.5/virtual_context/presets/__init__.py +0 -7
  573. virtual_context-0.5/virtual_context/presets/base.py +0 -28
  574. virtual_context-0.5/virtual_context/providers/anthropic.py +0 -65
  575. virtual_context-0.5/virtual_context/providers/base.py +0 -226
  576. virtual_context-0.5/virtual_context/proxy/_envelope.py +0 -398
  577. virtual_context-0.5/virtual_context/proxy/dashboard.py +0 -1184
  578. virtual_context-0.5/virtual_context/proxy/formats.py +0 -3815
  579. virtual_context-0.5/virtual_context/proxy/handlers.py +0 -2888
  580. virtual_context-0.5/virtual_context/proxy/helpers.py +0 -561
  581. virtual_context-0.5/virtual_context/proxy/media.py +0 -333
  582. virtual_context-0.5/virtual_context/proxy/message_filter.py +0 -3194
  583. virtual_context-0.5/virtual_context/proxy/metrics.py +0 -917
  584. virtual_context-0.5/virtual_context/proxy/registry.py +0 -395
  585. virtual_context-0.5/virtual_context/proxy/server.py +0 -3255
  586. virtual_context-0.5/virtual_context/proxy/session_state.py +0 -1087
  587. virtual_context-0.5/virtual_context/proxy/state.py +0 -4129
  588. virtual_context-0.5/virtual_context/proxy/vcattach.py +0 -528
  589. virtual_context-0.5/virtual_context/storage/falkordb.py +0 -464
  590. virtual_context-0.5/virtual_context/storage/filesystem.py +0 -1299
  591. virtual_context-0.5/virtual_context/storage/neo4j.py +0 -497
  592. virtual_context-0.5/virtual_context/storage/postgres.py +0 -13358
  593. virtual_context-0.5/virtual_context/storage/sqlite.py +0 -13473
  594. virtual_context-0.5/virtual_context/token_counter.py +0 -96
  595. virtual_context-0.5/virtual_context/tui/headless.py +0 -277
  596. virtual_context-0.5/virtual_context/types.py +0 -2810
  597. {virtual_context-0.5 → virtual_context-0.6}/LICENSE +0 -0
  598. {virtual_context-0.5 → virtual_context-0.6}/assets/dashboard.png +0 -0
  599. {virtual_context-0.5 → virtual_context-0.6}/assets/hero.png +0 -0
  600. /virtual_context-0.5/tests/ollama/__init__.py → /virtual_context-0.6/benchmarks/jev/cache/.gitkeep +0 -0
  601. {virtual_context-0.5 → virtual_context-0.6}/models.yaml +0 -0
  602. {virtual_context-0.5 → virtual_context-0.6}/tests/docker-compose.test.yml +0 -0
  603. {virtual_context-0.5 → virtual_context-0.6}/tests/fixtures/reserved_seats_diag_ctx.json +0 -0
  604. {virtual_context-0.5 → virtual_context-0.6}/tests/fixtures/target_baseline_redis.json +0 -0
  605. {virtual_context-0.5 → virtual_context-0.6}/tests/haiku/__init__.py +0 -0
  606. {virtual_context-0.5 → virtual_context-0.6}/tests/haiku/conftest.py +0 -0
  607. {virtual_context-0.5 → virtual_context-0.6}/tests/haiku/test_compaction.py +0 -0
  608. {virtual_context-0.5 → virtual_context-0.6}/tests/haiku/test_retrieval.py +0 -0
  609. {virtual_context-0.5 → virtual_context-0.6}/tests/haiku/test_tagging.py +0 -0
  610. {virtual_context-0.5/tests/proxy → virtual_context-0.6/tests/ollama}/__init__.py +0 -0
  611. {virtual_context-0.5 → virtual_context-0.6}/tests/ollama/conftest.py +0 -0
  612. {virtual_context-0.5 → virtual_context-0.6}/tests/ollama/test_compactor.py +0 -0
  613. {virtual_context-0.5 → virtual_context-0.6}/tests/ollama/test_pipeline.py +0 -0
  614. {virtual_context-0.5 → virtual_context-0.6}/tests/ollama/test_provider.py +0 -0
  615. {virtual_context-0.5 → virtual_context-0.6}/tests/ollama/test_tag_generator.py +0 -0
  616. {virtual_context-0.5 → virtual_context-0.6}/tests/pg_helpers.py +0 -0
  617. {virtual_context-0.5/virtual_context/cli → virtual_context-0.6/tests/proxy}/__init__.py +0 -0
  618. {virtual_context-0.5 → virtual_context-0.6}/tests/proxy/test_dashboard_cors.py +0 -0
  619. {virtual_context-0.5 → virtual_context-0.6}/tests/proxy/test_metrics.py +0 -0
  620. {virtual_context-0.5 → virtual_context-0.6}/tests/test_active_compaction_op_invariants.py +0 -0
  621. {virtual_context-0.5 → virtual_context-0.6}/tests/test_actor_id_normalization_postgres.py +0 -0
  622. {virtual_context-0.5 → virtual_context-0.6}/tests/test_actor_identity.py +0 -0
  623. {virtual_context-0.5 → virtual_context-0.6}/tests/test_admin_authority_catalogue.py +0 -0
  624. {virtual_context-0.5 → virtual_context-0.6}/tests/test_admin_backfill_cli.py +0 -0
  625. {virtual_context-0.5 → virtual_context-0.6}/tests/test_anchor_concurrency_postgres.py +0 -0
  626. {virtual_context-0.5 → virtual_context-0.6}/tests/test_backend_integration.py +0 -0
  627. {virtual_context-0.5 → virtual_context-0.6}/tests/test_backlog_sweeper_claim_postgres.py +0 -0
  628. {virtual_context-0.5 → virtual_context-0.6}/tests/test_backlog_sweeper_detection_postgres.py +0 -0
  629. {virtual_context-0.5 → virtual_context-0.6}/tests/test_backlog_sweeper_dispatch.py +0 -0
  630. {virtual_context-0.5 → virtual_context-0.6}/tests/test_backlog_sweeper_phase2_helpers.py +0 -0
  631. {virtual_context-0.5 → virtual_context-0.6}/tests/test_beam_judge.py +0 -0
  632. {virtual_context-0.5 → virtual_context-0.6}/tests/test_budget_enforcement.py +0 -0
  633. {virtual_context-0.5 → virtual_context-0.6}/tests/test_canonical_resequence.py +0 -0
  634. {virtual_context-0.5 → virtual_context-0.6}/tests/test_canonical_row_epoch_guards.py +0 -0
  635. {virtual_context-0.5 → virtual_context-0.6}/tests/test_canonical_row_epoch_guards_postgres.py +0 -0
  636. {virtual_context-0.5 → virtual_context-0.6}/tests/test_canonical_turn_grouping.py +0 -0
  637. {virtual_context-0.5 → virtual_context-0.6}/tests/test_canonical_turn_id_stamping.py +0 -0
  638. {virtual_context-0.5 → virtual_context-0.6}/tests/test_canonical_turns_schema.py +0 -0
  639. {virtual_context-0.5 → virtual_context-0.6}/tests/test_canonical_turns_schema_postgres.py +0 -0
  640. {virtual_context-0.5 → virtual_context-0.6}/tests/test_channel_attribution_postgres.py +0 -0
  641. {virtual_context-0.5 → virtual_context-0.6}/tests/test_claim_compaction_lease_signature.py +0 -0
  642. {virtual_context-0.5 → virtual_context-0.6}/tests/test_claim_compaction_lease_signature_postgres.py +0 -0
  643. {virtual_context-0.5 → virtual_context-0.6}/tests/test_cleanup_abandoned_compaction.py +0 -0
  644. {virtual_context-0.5 → virtual_context-0.6}/tests/test_cleanup_abandoned_compaction_postgres.py +0 -0
  645. {virtual_context-0.5 → virtual_context-0.6}/tests/test_cli.py +0 -0
  646. {virtual_context-0.5 → virtual_context-0.6}/tests/test_cli_init.py +0 -0
  647. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compacting_phase_takeover.py +0 -0
  648. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_begin_with_lock.py +0 -0
  649. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_c2r_gate.py +0 -0
  650. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_cleanup_extension.py +0 -0
  651. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_cleanup_extension_postgres.py +0 -0
  652. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_drain_fence.py +0 -0
  653. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_fence_schema.py +0 -0
  654. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_fence_schema_postgres.py +0 -0
  655. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_heartbeat_sidecar.py +0 -0
  656. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_lease_lost_abort.py +0 -0
  657. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_lifecycle_contract.py +0 -0
  658. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_operation.py +0 -0
  659. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_operation_crud.py +0 -0
  660. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_operation_crud_postgres.py +0 -0
  661. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_operation_id_uuid.py +0 -0
  662. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_operation_postgres.py +0 -0
  663. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_ownership_guards.py +0 -0
  664. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_per_write_fence.py +0 -0
  665. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_per_write_fence_postgres.py +0 -0
  666. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_pipeline_timestamps.py +0 -0
  667. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_progress_event.py +0 -0
  668. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_resume_e2e_postgres.py +0 -0
  669. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_resume_schema_migration.py +0 -0
  670. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compaction_resume_schema_migration_postgres.py +0 -0
  671. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compactor_concurrent.py +0 -0
  672. {virtual_context-0.5 → virtual_context-0.6}/tests/test_compactor_fallback_characterization.py +0 -0
  673. {virtual_context-0.5 → virtual_context-0.6}/tests/test_composite_store.py +0 -0
  674. {virtual_context-0.5 → virtual_context-0.6}/tests/test_context_bleed.py +0 -0
  675. {virtual_context-0.5 → virtual_context-0.6}/tests/test_context_hint_prewarm.py +0 -0
  676. {virtual_context-0.5 → virtual_context-0.6}/tests/test_context_hint_prewarm_postgres.py +0 -0
  677. {virtual_context-0.5 → virtual_context-0.6}/tests/test_conversation_coverage_report.py +0 -0
  678. {virtual_context-0.5 → virtual_context-0.6}/tests/test_conversation_identity.py +0 -0
  679. {virtual_context-0.5 → virtual_context-0.6}/tests/test_conversation_lifecycle.py +0 -0
  680. {virtual_context-0.5 → virtual_context-0.6}/tests/test_conversation_schema.py +0 -0
  681. {virtual_context-0.5 → virtual_context-0.6}/tests/test_conversation_schema_postgres.py +0 -0
  682. {virtual_context-0.5 → virtual_context-0.6}/tests/test_conversation_scoping.py +0 -0
  683. {virtual_context-0.5 → virtual_context-0.6}/tests/test_conversation_unification_admin.py +0 -0
  684. {virtual_context-0.5 → virtual_context-0.6}/tests/test_conversations_tenant_id_backfill_postgres.py +0 -0
  685. {virtual_context-0.5 → virtual_context-0.6}/tests/test_conversations_tenant_id_propagation.py +0 -0
  686. {virtual_context-0.5 → virtual_context-0.6}/tests/test_deferred_payload_compaction.py +0 -0
  687. {virtual_context-0.5 → virtual_context-0.6}/tests/test_delete_resurrect_epoch_races.py +0 -0
  688. {virtual_context-0.5 → virtual_context-0.6}/tests/test_embedding_context_guard.py +0 -0
  689. {virtual_context-0.5 → virtual_context-0.6}/tests/test_embedding_disablement.py +0 -0
  690. {virtual_context-0.5 → virtual_context-0.6}/tests/test_embedding_reserved_seats.py +0 -0
  691. {virtual_context-0.5 → virtual_context-0.6}/tests/test_embedding_tag_generator.py +0 -0
  692. {virtual_context-0.5 → virtual_context-0.6}/tests/test_empty_turn_skip.py +0 -0
  693. {virtual_context-0.5 → virtual_context-0.6}/tests/test_engine_event_bus.py +0 -0
  694. {virtual_context-0.5 → virtual_context-0.6}/tests/test_engine_init_tier1.py +0 -0
  695. {virtual_context-0.5 → virtual_context-0.6}/tests/test_engine_integration.py +0 -0
  696. {virtual_context-0.5 → virtual_context-0.6}/tests/test_engine_lifecycle_epoch.py +0 -0
  697. {virtual_context-0.5 → virtual_context-0.6}/tests/test_engine_lookback.py +0 -0
  698. {virtual_context-0.5 → virtual_context-0.6}/tests/test_engine_state.py +0 -0
  699. {virtual_context-0.5 → virtual_context-0.6}/tests/test_engine_state_schema_postgres.py +0 -0
  700. {virtual_context-0.5 → virtual_context-0.6}/tests/test_fact_link_query.py +0 -0
  701. {virtual_context-0.5 → virtual_context-0.6}/tests/test_fact_link_types.py +0 -0
  702. {virtual_context-0.5 → virtual_context-0.6}/tests/test_fact_links_sqlite.py +0 -0
  703. {virtual_context-0.5 → virtual_context-0.6}/tests/test_fact_redesign.py +0 -0
  704. {virtual_context-0.5 → virtual_context-0.6}/tests/test_find_idle_deletable_conversations.py +0 -0
  705. {virtual_context-0.5 → virtual_context-0.6}/tests/test_find_stale_lease_helpers.py +0 -0
  706. {virtual_context-0.5 → virtual_context-0.6}/tests/test_format_agnostic.py +0 -0
  707. {virtual_context-0.5 → virtual_context-0.6}/tests/test_headless.py +0 -0
  708. {virtual_context-0.5 → virtual_context-0.6}/tests/test_hint_strict_budget.py +0 -0
  709. {virtual_context-0.5 → virtual_context-0.6}/tests/test_history_filter.py +0 -0
  710. {virtual_context-0.5 → virtual_context-0.6}/tests/test_idf_retrieval.py +0 -0
  711. {virtual_context-0.5 → virtual_context-0.6}/tests/test_import_adapters.py +0 -0
  712. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingest_anchor_incremental.py +0 -0
  713. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingest_index_integrity.py +0 -0
  714. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingest_projected_rows.py +0 -0
  715. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingest_reconciler_append_fastpath.py +0 -0
  716. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingest_reply_target_embedding.py +0 -0
  717. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingest_sort_key_rebalance.py +0 -0
  718. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingestion_compaction_full_cycle.py +0 -0
  719. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingestion_episode.py +0 -0
  720. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingestion_episode_crud_postgres.py +0 -0
  721. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingestion_episode_postgres.py +0 -0
  722. {virtual_context-0.5 → virtual_context-0.6}/tests/test_ingestion_finalize_self_heal.py +0 -0
  723. {virtual_context-0.5 → virtual_context-0.6}/tests/test_lifecycle_epoch.py +0 -0
  724. {virtual_context-0.5 → virtual_context-0.6}/tests/test_lifecycle_epoch_store.py +0 -0
  725. {virtual_context-0.5 → virtual_context-0.6}/tests/test_lifecycle_epoch_store_postgres.py +0 -0
  726. {virtual_context-0.5 → virtual_context-0.6}/tests/test_link_predecessor.py +0 -0
  727. {virtual_context-0.5 → virtual_context-0.6}/tests/test_longmemeval_auth.py +0 -0
  728. {virtual_context-0.5 → virtual_context-0.6}/tests/test_media.py +0 -0
  729. {virtual_context-0.5 → virtual_context-0.6}/tests/test_message_filter.py +0 -0
  730. {virtual_context-0.5 → virtual_context-0.6}/tests/test_metrics_persistence.py +0 -0
  731. {virtual_context-0.5 → virtual_context-0.6}/tests/test_model_catalog.py +0 -0
  732. {virtual_context-0.5 → virtual_context-0.6}/tests/test_model_limits.py +0 -0
  733. {virtual_context-0.5 → virtual_context-0.6}/tests/test_monitor.py +0 -0
  734. {virtual_context-0.5 → virtual_context-0.6}/tests/test_multi_instance.py +0 -0
  735. {virtual_context-0.5 → virtual_context-0.6}/tests/test_neo4j_falkordb_compaction_compat.py +0 -0
  736. {virtual_context-0.5 → virtual_context-0.6}/tests/test_noncontiguous_compaction_provenance.py +0 -0
  737. {virtual_context-0.5 → virtual_context-0.6}/tests/test_noop_fact_link_store.py +0 -0
  738. {virtual_context-0.5 → virtual_context-0.6}/tests/test_normalize_messages_preserves_provider.py +0 -0
  739. {virtual_context-0.5 → virtual_context-0.6}/tests/test_normalize_request_turn_collision.py +0 -0
  740. {virtual_context-0.5 → virtual_context-0.6}/tests/test_openrouter_provider.py +0 -0
  741. {virtual_context-0.5 → virtual_context-0.6}/tests/test_orphan_compacting_repair.py +0 -0
  742. {virtual_context-0.5 → virtual_context-0.6}/tests/test_passthrough_filter.py +0 -0
  743. {virtual_context-0.5 → virtual_context-0.6}/tests/test_passthrough_gate_criterion.py +0 -0
  744. {virtual_context-0.5 → virtual_context-0.6}/tests/test_pg_helpers.py +0 -0
  745. {virtual_context-0.5 → virtual_context-0.6}/tests/test_phase_transition_events.py +0 -0
  746. {virtual_context-0.5 → virtual_context-0.6}/tests/test_postgres_mirror_store_methods.py +0 -0
  747. {virtual_context-0.5 → virtual_context-0.6}/tests/test_presence_flag_postgres.py +0 -0
  748. {virtual_context-0.5 → virtual_context-0.6}/tests/test_presets.py +0 -0
  749. {virtual_context-0.5 → virtual_context-0.6}/tests/test_prev_context_leak.py +0 -0
  750. {virtual_context-0.5 → virtual_context-0.6}/tests/test_progress_event_bus.py +0 -0
  751. {virtual_context-0.5 → virtual_context-0.6}/tests/test_progress_events.py +0 -0
  752. {virtual_context-0.5 → virtual_context-0.6}/tests/test_progress_snapshot.py +0 -0
  753. {virtual_context-0.5 → virtual_context-0.6}/tests/test_protected_window_gate.py +0 -0
  754. {virtual_context-0.5 → virtual_context-0.6}/tests/test_proxy_message_filter.py +0 -0
  755. {virtual_context-0.5 → virtual_context-0.6}/tests/test_proxy_metrics_event_cap.py +0 -0
  756. {virtual_context-0.5 → virtual_context-0.6}/tests/test_quoted_reference_carrier.py +0 -0
  757. {virtual_context-0.5 → virtual_context-0.6}/tests/test_recent_conversation_assembly.py +0 -0
  758. {virtual_context-0.5 → virtual_context-0.6}/tests/test_recent_conversation_delivery_metadata.py +0 -0
  759. {virtual_context-0.5 → virtual_context-0.6}/tests/test_refresh_compaction_heartbeat.py +0 -0
  760. {virtual_context-0.5 → virtual_context-0.6}/tests/test_registry_lifecycle.py +0 -0
  761. {virtual_context-0.5 → virtual_context-0.6}/tests/test_request_captures_persistence.py +0 -0
  762. {virtual_context-0.5 → virtual_context-0.6}/tests/test_request_metadata.py +0 -0
  763. {virtual_context-0.5 → virtual_context-0.6}/tests/test_request_metadata_postgres.py +0 -0
  764. {virtual_context-0.5 → virtual_context-0.6}/tests/test_resummarize_postgres.py +0 -0
  765. {virtual_context-0.5 → virtual_context-0.6}/tests/test_retrieval_assembler_post_compaction.py +0 -0
  766. {virtual_context-0.5 → virtual_context-0.6}/tests/test_retrieval_assembler_protected_window_merge.py +0 -0
  767. {virtual_context-0.5 → virtual_context-0.6}/tests/test_retriever.py +0 -0
  768. {virtual_context-0.5 → virtual_context-0.6}/tests/test_rrf_scoring.py +0 -0
  769. {virtual_context-0.5 → virtual_context-0.6}/tests/test_schema_bootstrap_postgres.py +0 -0
  770. {virtual_context-0.5 → virtual_context-0.6}/tests/test_segment_repair.py +0 -0
  771. {virtual_context-0.5 → virtual_context-0.6}/tests/test_semantic_search.py +0 -0
  772. {virtual_context-0.5 → virtual_context-0.6}/tests/test_sender_attribution_postgres.py +0 -0
  773. {virtual_context-0.5 → virtual_context-0.6}/tests/test_sender_backfill.py +0 -0
  774. {virtual_context-0.5 → virtual_context-0.6}/tests/test_sender_quote_search.py +0 -0
  775. {virtual_context-0.5 → virtual_context-0.6}/tests/test_session_cache.py +0 -0
  776. {virtual_context-0.5 → virtual_context-0.6}/tests/test_session_state_provider_get_marker.py +0 -0
  777. {virtual_context-0.5 → virtual_context-0.6}/tests/test_sort_key_shift_postgres.py +0 -0
  778. {virtual_context-0.5 → virtual_context-0.6}/tests/test_speaker_affinity.py +0 -0
  779. {virtual_context-0.5 → virtual_context-0.6}/tests/test_speaker_handle_schema.py +0 -0
  780. {virtual_context-0.5 → virtual_context-0.6}/tests/test_speaker_handles.py +0 -0
  781. {virtual_context-0.5 → virtual_context-0.6}/tests/test_speaker_quote_annotation.py +0 -0
  782. {virtual_context-0.5 → virtual_context-0.6}/tests/test_speaker_request_context.py +0 -0
  783. {virtual_context-0.5 → virtual_context-0.6}/tests/test_speaker_retrieval_context.py +0 -0
  784. {virtual_context-0.5 → virtual_context-0.6}/tests/test_sqlite_mirror_store_methods.py +0 -0
  785. {virtual_context-0.5 → virtual_context-0.6}/tests/test_sqlite_schema_add_column_race.py +0 -0
  786. {virtual_context-0.5 → virtual_context-0.6}/tests/test_sqlite_store.py +0 -0
  787. {virtual_context-0.5 → virtual_context-0.6}/tests/test_storage_protocols.py +0 -0
  788. {virtual_context-0.5 → virtual_context-0.6}/tests/test_storage_protocols_cross_channel_mirror.py +0 -0
  789. {virtual_context-0.5 → virtual_context-0.6}/tests/test_strict_tagging_tagged_rows.py +0 -0
  790. {virtual_context-0.5 → virtual_context-0.6}/tests/test_stub_turn_handling.py +0 -0
  791. {virtual_context-0.5 → virtual_context-0.6}/tests/test_tag_canonicalizer.py +0 -0
  792. {virtual_context-0.5 → virtual_context-0.6}/tests/test_tag_generator.py +0 -0
  793. {virtual_context-0.5 → virtual_context-0.6}/tests/test_tag_splitter.py +0 -0
  794. {virtual_context-0.5 → virtual_context-0.6}/tests/test_tag_summary_materialization.py +0 -0
  795. {virtual_context-0.5 → virtual_context-0.6}/tests/test_telemetry.py +0 -0
  796. {virtual_context-0.5 → virtual_context-0.6}/tests/test_telemetry_integration.py +0 -0
  797. {virtual_context-0.5 → virtual_context-0.6}/tests/test_tool_guard.py +0 -0
  798. {virtual_context-0.5 → virtual_context-0.6}/tests/test_tool_output_interceptor.py +0 -0
  799. {virtual_context-0.5 → virtual_context-0.6}/tests/test_tool_result_filter.py +0 -0
  800. {virtual_context-0.5 → virtual_context-0.6}/tests/test_tool_tags.py +0 -0
  801. {virtual_context-0.5 → virtual_context-0.6}/tests/test_tui.py +0 -0
  802. {virtual_context-0.5 → virtual_context-0.6}/tests/test_turn_grouping.py +0 -0
  803. {virtual_context-0.5 → virtual_context-0.6}/tests/test_turn_tag_index.py +0 -0
  804. {virtual_context-0.5 → virtual_context-0.6}/tests/test_turn_tag_index_lru.py +0 -0
  805. {virtual_context-0.5 → virtual_context-0.6}/tests/test_turn_tag_index_memory_regression.py +0 -0
  806. {virtual_context-0.5 → virtual_context-0.6}/tests/test_unified_budget.py +0 -0
  807. {virtual_context-0.5 → virtual_context-0.6}/tests/test_upstream_trim.py +0 -0
  808. {virtual_context-0.5 → virtual_context-0.6}/tests/test_vcmerge_body_method.py +0 -0
  809. {virtual_context-0.5 → virtual_context-0.6}/tests/test_vcmerge_body_method_postgres.py +0 -0
  810. {virtual_context-0.5 → virtual_context-0.6}/tests/test_vcmerge_composite_forwarders.py +0 -0
  811. {virtual_context-0.5 → virtual_context-0.6}/tests/test_vcmerge_dual_handler_refuse.py +0 -0
  812. {virtual_context-0.5 → virtual_context-0.6}/tests/test_vcmerge_schema.py +0 -0
  813. {virtual_context-0.5 → virtual_context-0.6}/tests/test_vcmerge_schema_postgres.py +0 -0
  814. {virtual_context-0.5 → virtual_context-0.6}/tests/test_vcmerge_storage.py +0 -0
  815. {virtual_context-0.5/virtual_context/core → virtual_context-0.6/virtual_context/cli}/__init__.py +0 -0
  816. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/cli/import_cmd.py +0 -0
  817. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/conversation_identity.py +0 -0
  818. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/alias_resolution.py +0 -0
  819. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/canonical_resequence.py +0 -0
  820. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/compaction_fence.py +0 -0
  821. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/coverage_report.py +0 -0
  822. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/engine_utils.py +0 -0
  823. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/event_bus.py +0 -0
  824. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/fts_preprocessor.py +0 -0
  825. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/lifecycle_epoch.py +0 -0
  826. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/llm_utils.py +0 -0
  827. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/math_utils.py +0 -0
  828. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/model_catalog.py +0 -0
  829. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/monitor.py +0 -0
  830. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/progress_events.py +0 -0
  831. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/progress_snapshot.py +0 -0
  832. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/segment_repair.py +0 -0
  833. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/tag_scoring.py +0 -0
  834. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/tool_guard.py +0 -0
  835. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/tool_query.py +0 -0
  836. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/core/turn_tag_index.py +0 -0
  837. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/data/anthropic-tokenizer/tokenizer.json +0 -0
  838. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/data/models.yaml +0 -0
  839. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/import_adapters/__init__.py +0 -0
  840. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/import_adapters/base.py +0 -0
  841. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/import_adapters/chatgpt.py +0 -0
  842. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/import_adapters/claude.py +0 -0
  843. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/import_adapters/grok.py +0 -0
  844. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/import_adapters/loader.py +0 -0
  845. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/ingest/__init__.py +0 -0
  846. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/mcp/__init__.py +0 -0
  847. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/model_limits.py +0 -0
  848. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/openclaw/virtual-context.mjs +0 -0
  849. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/patterns.py +0 -0
  850. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/presets/agentic.py +0 -0
  851. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/presets/coding.py +0 -0
  852. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/providers/__init__.py +0 -0
  853. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/providers/generic_openai.py +0 -0
  854. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/providers/ollama_native.py +0 -0
  855. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/__init__.py +0 -0
  856. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/dashboard.html +0 -0
  857. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/multi.py +0 -0
  858. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/session_cache.py +0 -0
  859. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/static/android-chrome-192x192.png +0 -0
  860. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/static/android-chrome-512x512.png +0 -0
  861. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/static/apple-touch-icon.png +0 -0
  862. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/static/favicon-16x16.png +0 -0
  863. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/static/favicon-32x32.png +0 -0
  864. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/static/favicon.ico +0 -0
  865. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/static/site.webmanifest +0 -0
  866. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/proxy/tool_output_interceptor.py +0 -0
  867. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/storage/__init__.py +0 -0
  868. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/storage/helpers.py +0 -0
  869. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/storage/noop_fact_link_store.py +0 -0
  870. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/__init__.py +0 -0
  871. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/app.py +0 -0
  872. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/chat.tcss +0 -0
  873. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/chat_provider.py +0 -0
  874. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/modals/__init__.py +0 -0
  875. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/modals/turn_inspector.py +0 -0
  876. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/state.py +0 -0
  877. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/widgets/__init__.py +0 -0
  878. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/widgets/budget_bar.py +0 -0
  879. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/widgets/chat_view.py +0 -0
  880. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/widgets/input_box.py +0 -0
  881. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/widgets/tag_panel.py +0 -0
  882. {virtual_context-0.5 → virtual_context-0.6}/virtual_context/tui/widgets/turn_list.py +0 -0
@@ -0,0 +1,86 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ dist/
6
+ build/
7
+
8
+ # Virtual environment
9
+ .venv/
10
+
11
+ # Infrastructure configs (contains secrets — never commit)
12
+ infrastructure/
13
+
14
+ # Testing
15
+ .pytest_cache/
16
+
17
+ # IDE / tools
18
+ .claude/
19
+ .idea/
20
+ .vscode/
21
+ *.swp
22
+ *.swo
23
+
24
+ # Runtime data
25
+ .virtualcontext/
26
+ .virtualcontext-*/
27
+
28
+ # Local scripts / experiments
29
+ scripts/*
30
+ !scripts/install.ps1
31
+ !scripts/install.sh
32
+ !scripts/check_contracts.py
33
+ !scripts/smoke_recommended.py
34
+ !scripts/smoke_recommended.sh
35
+ !scripts/apply_canonical_repair_artifact_20260802.py
36
+ !scripts/export_discord_guild_transcript_20260802.py
37
+ !scripts/extend_men_vast_disposition_20260802.py
38
+ !scripts/rebuild_men_canonical_from_discord_20260802.py
39
+
40
+ # Environment files (API keys)
41
+ .env
42
+
43
+ # Config files (may contain API keys)
44
+ virtual-context-*.yaml
45
+ !virtual-context.yaml.example
46
+
47
+ # Internal docs
48
+ CHANGELOG.md
49
+ CLAUDE.md
50
+ docs/superpowers/
51
+ docs/competitive-analysis.md
52
+ diagnostics/
53
+ specs/
54
+ tests_timing_report.md
55
+ tests_by_section.sh
56
+ extraneous/paper/virtual_context_paper_latest.md
57
+ extraneous/paper/data/
58
+ extraneous/paper/*.zip
59
+ extraneous/paper/*.png
60
+
61
+ # Worktrees
62
+ .worktrees/
63
+
64
+ # Scratch / temporary files
65
+ *.bak
66
+ *.json
67
+ !pyproject.toml
68
+ !package.json
69
+ !tests/fixtures/*.json
70
+ *.autopsy.md
71
+
72
+ # OS
73
+ .DS_Store
74
+ .agent-prompt.md
75
+
76
+ # Riptide artifacts (cloud-synced)
77
+ .humanlayer/tasks/
78
+
79
+ # Unrelated local content kept in the working tree, never packaged
80
+ discord-native-poker/
81
+ discord-native-poker.zip
82
+
83
+ # jev harness: cache and result files are local artifacts
84
+ benchmarks/jev/cache/*
85
+ !benchmarks/jev/cache/.gitkeep
86
+ benchmarks/jev/results/*.json
@@ -0,0 +1,269 @@
1
+ Metadata-Version: 2.5
2
+ Name: virtual-context
3
+ Version: 0.6
4
+ Summary: OS-style virtual memory for LLM session context management
5
+ Project-URL: Homepage, https://virtual-context.com
6
+ Project-URL: Repository, https://github.com/virtual-context/virtual-context
7
+ Project-URL: Documentation, https://virtual-context.com/docs
8
+ Author: Y. Ahmed Kidwai
9
+ License-Expression: AGPL-3.0-or-later
10
+ License-File: LICENSE
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
15
+ Requires-Python: >=3.11
16
+ Requires-Dist: dateparser>=1.2
17
+ Requires-Dist: httpx[http2]>=0.27
18
+ Requires-Dist: pyyaml>=6.0
19
+ Requires-Dist: tiktoken>=0.7
20
+ Provides-Extra: all
21
+ Requires-Dist: anthropic>=0.40; extra == 'all'
22
+ Requires-Dist: falkordb>=1.0; extra == 'all'
23
+ Requires-Dist: fastapi>=0.115; extra == 'all'
24
+ Requires-Dist: mcp>=1.0; extra == 'all'
25
+ Requires-Dist: neo4j>=5.0; extra == 'all'
26
+ Requires-Dist: openai>=1.50; extra == 'all'
27
+ Requires-Dist: pillow>=10.0; extra == 'all'
28
+ Requires-Dist: psycopg-pool>=3.1; extra == 'all'
29
+ Requires-Dist: psycopg[binary]>=3.1; extra == 'all'
30
+ Requires-Dist: redis>=5.0; extra == 'all'
31
+ Requires-Dist: rich>=13.0; extra == 'all'
32
+ Requires-Dist: sentence-transformers>=3.0; extra == 'all'
33
+ Requires-Dist: textual>=3.0; extra == 'all'
34
+ Requires-Dist: torch>=2.0; extra == 'all'
35
+ Requires-Dist: uvicorn>=0.30; extra == 'all'
36
+ Requires-Dist: zstandard>=0.22; extra == 'all'
37
+ Provides-Extra: bridge
38
+ Requires-Dist: fastapi>=0.115; extra == 'bridge'
39
+ Requires-Dist: pillow>=10.0; extra == 'bridge'
40
+ Requires-Dist: uvicorn>=0.30; extra == 'bridge'
41
+ Requires-Dist: zstandard>=0.22; extra == 'bridge'
42
+ Provides-Extra: dev
43
+ Requires-Dist: pytest-timeout>=2.3; extra == 'dev'
44
+ Requires-Dist: pytest-xdist>=3.5; extra == 'dev'
45
+ Requires-Dist: pytest>=8.0; extra == 'dev'
46
+ Requires-Dist: ruff>=0.8; extra == 'dev'
47
+ Provides-Extra: embeddings
48
+ Requires-Dist: sentence-transformers>=3.0; extra == 'embeddings'
49
+ Requires-Dist: torch>=2.0; extra == 'embeddings'
50
+ Provides-Extra: falkordb
51
+ Requires-Dist: falkordb>=1.0; extra == 'falkordb'
52
+ Provides-Extra: mcp
53
+ Requires-Dist: mcp>=1.0; extra == 'mcp'
54
+ Provides-Extra: neo4j
55
+ Requires-Dist: neo4j>=5.0; extra == 'neo4j'
56
+ Provides-Extra: postgres
57
+ Requires-Dist: psycopg-pool>=3.1; extra == 'postgres'
58
+ Requires-Dist: psycopg[binary]>=3.1; extra == 'postgres'
59
+ Provides-Extra: providers
60
+ Requires-Dist: anthropic>=0.40; extra == 'providers'
61
+ Requires-Dist: openai>=1.50; extra == 'providers'
62
+ Provides-Extra: proxy
63
+ Requires-Dist: fastapi>=0.115; extra == 'proxy'
64
+ Requires-Dist: pillow>=10.0; extra == 'proxy'
65
+ Requires-Dist: uvicorn>=0.30; extra == 'proxy'
66
+ Requires-Dist: zstandard>=0.22; extra == 'proxy'
67
+ Provides-Extra: redis
68
+ Requires-Dist: redis>=5.0; extra == 'redis'
69
+ Provides-Extra: tiktoken
70
+ Provides-Extra: tui
71
+ Requires-Dist: rich>=13.0; extra == 'tui'
72
+ Requires-Dist: textual>=3.0; extra == 'tui'
73
+ Description-Content-Type: text/markdown
74
+
75
+ [![PyPI](https://img.shields.io/pypi/v/virtual-context.svg)](https://pypi.org/project/virtual-context/)
76
+ [![Python](https://img.shields.io/pypi/pyversions/virtual-context.svg)](https://pypi.org/project/virtual-context/)
77
+ [![Downloads](https://img.shields.io/pypi/dm/virtual-context.svg)](https://pypistats.org/packages/virtual-context)
78
+ [![License](https://img.shields.io/badge/license-AGPL--3.0-blue.svg)](https://github.com/virtual-context/virtual-context/blob/main/LICENSE)
79
+ [![Discord](https://img.shields.io/badge/Discord-Chat%20with%20us-5865F2?logo=discord&logoColor=white)](https://discord.gg/kGJva2D8Ej)
80
+ [![Twitter](https://img.shields.io/badge/Twitter-Follow-1DA1F2?logo=x&logoColor=white)](https://x.com/virtualctx)
81
+
82
+ <p align="center">
83
+ <a href="assets/dashboard.png">
84
+ <img src="assets/dashboard.png" alt="virtual-context dashboard" width="800">
85
+ </a>
86
+ </p>
87
+ <p align="center"><sub>virtual-context cloud: a 3 million token virtual window served at 80K real tokens</sub></p>
88
+
89
+ # virtual-context
90
+
91
+ **Virtual memory for LLM context. Give your agent a context window of tens or hundreds of millions of tokens; the model only ever sees the part that matters.**
92
+
93
+ Your client sets `contextWindow: 20000000` (or 200,000,000). Your model's real window is 200K. virtual-context sits between them and makes it work, the same way an operating system lets a process address more memory than physically exists. The client keeps sending its whole conversation; virtual-context stores all of it, organizes it by topic, and forwards the model a compact window of what matters for the current turn, at a size you choose. Nothing is discarded, and anything older can be paged back in at full fidelity. The dashboard above shows a live 3 million token conversation served at 80K real tokens.
94
+
95
+ It runs as an HTTP proxy, so integration is a base-URL change; a Python SDK and an MCP server are there for direct use.
96
+
97
+ ## Why
98
+
99
+ - **Memory that lasts.** What the user said at turn 12 is still recallable at turn 1,000, across sessions, clients and models.
100
+ - **Better answers from less context.** A focused window of relevant summaries and facts beats a raw window of everything, where the one fact you need is buried.
101
+ - **Lower cost.** Smaller payloads, arranged to keep providers' prompt caches warm.
102
+ - **Group chats that know who said what.** Every message keeps its sender, facts keep their author, and search can be scoped to one person.
103
+ - **One memory everywhere.** Build context in Claude Code, continue it from Telegram, query it from Cursor.
104
+
105
+ ## How it works
106
+
107
+ ```
108
+ client ──> virtual-context proxy ──> model provider
109
+ │ before the call: retrieve topics and facts for this turn,
110
+ │ assemble a bounded window
111
+ │ after the call: store the turn, tag it, compact when needed
112
+ v
113
+ store (SQLite or PostgreSQL)
114
+ canonical turns every message verbatim, with sender and channel
115
+ segments + facts per-topic summaries and structured facts
116
+ topic summaries one digest per topic, the bird's-eye view
117
+ ```
118
+
119
+ Recent turns stay verbatim. Older turns are grouped by topic, summarized and mined for facts. Each turn, the model gets recent turns plus the topics and facts relevant to the question, and a topic index telling it what else it can open with built-in tools (`vc_expand_topic`, `vc_find_quote`, `vc_recall_all`, and others).
120
+
121
+ ## Quick start
122
+
123
+ ```bash
124
+ pip install "virtual-context[proxy,embeddings]" # Python 3.11+
125
+ ```
126
+
127
+ virtual-context uses a language model of your choice to tag turns and write summaries. Pick where it runs:
128
+
129
+ ```bash
130
+ # A local model server (Ollama, LM Studio, llama.cpp, vLLM): nothing leaves your machine
131
+ virtual-context init recommended-local
132
+
133
+ # Or a hosted model through OpenRouter
134
+ virtual-context init recommended
135
+ export OPENROUTER_API_KEY=...
136
+ ```
137
+
138
+ Either writes `virtual-context.yaml`; set `tag_generator.model` and `summarization.model` to the model you want. Then start the proxy and point your client at `http://127.0.0.1:5757` instead of the provider:
139
+
140
+ ```bash
141
+ virtual-context proxy --upstream https://api.anthropic.com
142
+ ```
143
+
144
+ A dashboard runs at `http://127.0.0.1:5757/dashboard`.
145
+
146
+ The two presets are the hosted service's configuration on one machine and differ only in where the model runs: SQLite storage, paging tools on, fact curation on. Answer quality depends on the model you pick. `scripts/smoke_recommended.sh` checks a preset end to end from a clean install. The optional parts (PostgreSQL vector search, the judgment layer, group attribution) are each a section of [docs/configuration.md](docs/configuration.md); `virtual-context presets list` shows every preset, and [docs/install.md](docs/install.md) covers install options and running it as a service.
147
+
148
+ The proxy accepts Anthropic Messages, OpenAI Responses, OpenAI Chat Completions and Gemini requests. The paging tools are injected for Anthropic, OpenAI Responses and Gemini; Chat Completions clients get retrieved context but no tools.
149
+
150
+ **Hosted:** [virtual-context.com](https://virtual-context.com) runs the same engine as a service with the dashboard and cost reports; you change your base URL and nothing else.
151
+
152
+ ## Integrations
153
+
154
+ **Claude Code**
155
+
156
+ ```bash
157
+ export ANTHROPIC_BASE_URL=http://127.0.0.1:5757
158
+ ```
159
+
160
+ Tool output (file reads, searches, command results) is collapsed into restorable stubs, and when Claude Code trims its own history, the missing turns are restored from storage.
161
+
162
+ **Any client with a base URL** (Cursor, Continue, your own app)
163
+
164
+ ```python
165
+ client = anthropic.Anthropic(base_url="http://127.0.0.1:5757")
166
+ client = OpenAI(base_url="http://127.0.0.1:5757/v1")
167
+ ```
168
+
169
+ **OpenClaw:** use the [OpenClaw plugin](https://github.com/virtual-context/openclaw-plugin). Settings for direct proxy use are in [docs/install.md](docs/install.md).
170
+
171
+ **Python SDK**
172
+
173
+ ```python
174
+ from virtual_context import VirtualContextEngine
175
+
176
+ engine = VirtualContextEngine(config_path="./virtual-context.yaml")
177
+ assembled = engine.on_message_inbound(message=user_message, conversation_history=messages) # before the LLM call
178
+ report = engine.on_turn_complete(messages) # after it
179
+ ```
180
+
181
+ **MCP server:** eight tools (`recall_context`, `compact_context`, `expand_topic`, `recall_all`, `remember_when`, `find_quote`, `search_summaries`, `domain_status`) plus topic resources, for Claude Desktop, Cursor or any MCP client.
182
+
183
+ ## Features
184
+
185
+ | Feature | What it does | Docs |
186
+ |---|---|---|
187
+ | Topic memory | Each turn is tagged by topic; older turns become per-topic segment summaries and one digest per topic. Tags converge on an existing vocabulary instead of piling up synonyms. | [engine](docs/engine.md) |
188
+ | Structured facts | Compaction extracts facts (subject, verb, object, status, time, source turns). Newer facts supersede older ones, and facts can be retrieved by topic and by meaning. | [fact lifecycle](docs/fact-lifecycle.md) |
189
+ | Retrieval | Topics are ranked by tag overlap, full-text match and embedding similarity, with full-text and semantic search over stored turns as a fallback. | [engine](docs/engine.md) |
190
+ | Demand paging | The model sees topic digests for cold topics and segment summaries for relevant ones, and opens full text through tools when it needs detail. | [engine](docs/engine.md) |
191
+ | Time-scoped recall | "What changed between June and July?" resolves by date math on stored timestamps, not by model guessing. | [engine](docs/engine.md) |
192
+ | Group memory | Sender and channel are stored on every message, facts keep their author, members get person cards, and search can be scoped to one speaker. Direct-message content never appears in a server's context. Off by default. | [attribution](docs/attribution.md) |
193
+ | Tool and media compression | Finished tool exchanges become stubs restorable with `vc_restore_tool`; screenshots are recompressed with originals kept. | [proxy](docs/proxy.md) |
194
+ | Prompt-cache aware | Injected context sits after a cache breakpoint, and payload rewrites wait until the provider's cache would have expired anyway. | [engine](docs/engine.md) |
195
+ | A ceiling you choose | Set `context_window` to any size; the virtual window the client sees is independent of it. | [configuration](docs/configuration.md) |
196
+ | Truncation recovery | When a client trims its own history, the missing turns are restored from storage. | [proxy](docs/proxy.md) |
197
+ | History import | ChatGPT, Claude and Grok exports arrive tagged and searchable (`virtual-context import`). | [commands](docs/commands.md) |
198
+ | Native vector search | On PostgreSQL with pgvector, quote search, segment candidates and fact search rank inside the database instead of in each worker. | [native vector search](docs/native-vector-search.md) |
199
+ | Judgment layer (optional) | A typed judgment model can make individual decisions: which topics and segments to retrieve, which facts to keep, which existing tags a turn belongs to, and more. Each decision runs in `legacy`, `shadow` (logged side by side) or `jev` mode and falls back to the built-in behavior on any failure. Needs a TypeSafe API key. | [configuration](docs/configuration.md#judgment) |
200
+
201
+ ## Commands in any conversation
202
+
203
+ Type these as ordinary messages in a connected client; the proxy handles them without calling the model.
204
+
205
+ | Command | What it does |
206
+ |---|---|
207
+ | `VCATTACH <label\|id>` | Reattach this client to another stored conversation |
208
+ | `VCLABEL <name>` | Set the conversation label (no argument shows it) |
209
+ | `VCSTATUS` | Conversation id, label, turns, segments, active topics |
210
+ | `VCRECALL <query>` | Search stored context and bring matching topics into the next turn |
211
+ | `VCCOMPACT` | Compact now |
212
+ | `VCLIST` | List conversations with labels and turn counts |
213
+ | `VCFORGET <tag>` | Delete a topic's segments and summaries |
214
+ | `VCMERGE INTO <label\|id>` | Merge this conversation's stored data into another |
215
+
216
+ `VCATTACH` is a durable redirect: nothing is deleted and old references keep resolving, so two clients (or two agents) can share one memory. Details: [docs/commands.md](docs/commands.md).
217
+
218
+ ## Running it in production
219
+
220
+ - **Storage:** SQLite by default; PostgreSQL (`pip install "virtual-context[postgres]"`) for multi-worker deployments. With pgvector installed, `virtual-context admin migrate-semantic-vectors` prepares in-database vector search.
221
+ - **Multi-worker safety:** compactions run under leased, fenced operations, lifecycle changes are epoch-guarded, and a backlog sweeper compacts conversations whose traffic never triggers it inline.
222
+ - **Operator tooling:** `virtual-context admin` has 27 guarded backfill, repair and migration commands with dry-run modes.
223
+ - **Security:** dashboard endpoints are open until you set `VC_DASHBOARD_TOKEN`; the default bind is loopback only.
224
+ - **Observability:** per-stage timing logs, request captures in the dashboard, and per-call cost telemetry.
225
+
226
+ Architecture, including the canonical-turn model and the REST prepare/ingest surface: [docs/architecture.md](docs/architecture.md).
227
+
228
+ ## Benchmarks
229
+
230
+ On 100 questions from [LongMemEval-500](https://github.com/xiaowu0162/LongMemEval), with the same reader model (Claude Sonnet 4.5):
231
+
232
+ | | virtual-context | Full raw history |
233
+ |---|---|---|
234
+ | Correct | 95/100 | 33/100 |
235
+ | Tokens per question | 52,347 | 117,582 |
236
+ | Cost per question | $0.16 | $0.36 |
237
+
238
+ These are **historical results**: the original run's provenance is incomplete and they are not a measurement of the current pipeline. Configuration, results by category, the per-question table and how new runs are recorded: [docs/benchmarks.md](docs/benchmarks.md).
239
+
240
+ ## Documentation
241
+
242
+ | Page | Covers |
243
+ |---|---|
244
+ | [architecture.md](docs/architecture.md) | Memory model, request pipeline, multi-worker coordination, identity |
245
+ | [engine.md](docs/engine.md) | Compaction, tagging, retrieval, code mode, cache awareness |
246
+ | [fact-lifecycle.md](docs/fact-lifecycle.md) | How facts are extracted, superseded and retrieved |
247
+ | [attribution.md](docs/attribution.md) | Group conversations: who said what, person cards, speaker search |
248
+ | [proxy.md](docs/proxy.md) | Proxy internals, routing, dashboard, streaming, endpoints |
249
+ | [native-vector-search.md](docs/native-vector-search.md) | PostgreSQL + pgvector ranking and its migration |
250
+ | [configuration.md](docs/configuration.md) | Every config key with its default, including the judgment layer |
251
+ | [commands.md](docs/commands.md) | In-conversation commands, the CLI, import, admin tooling |
252
+ | [install.md](docs/install.md) | Install paths, daemons, multi-instance setups |
253
+ | [design.md](docs/design.md) | Why it is built this way, and how it compares with RAG and plain compaction |
254
+ | [benchmarks.md](docs/benchmarks.md) | Suites, results, how to run them |
255
+
256
+ ## Development
257
+
258
+ ```bash
259
+ git clone https://github.com/virtual-context/virtual-context.git
260
+ cd virtual-context
261
+ python -m venv .venv && source .venv/bin/activate
262
+ python -m pip install uv==0.9.30
263
+ uv sync --locked --extra all --extra dev
264
+ .venv/bin/python scripts/check_contracts.py
265
+ ```
266
+
267
+ ## License
268
+
269
+ AGPL-3.0, Copyright Y. Ahmed Kidwai. For commercial licensing: ahmed@kidw.ai
@@ -0,0 +1,195 @@
1
+ [![PyPI](https://img.shields.io/pypi/v/virtual-context.svg)](https://pypi.org/project/virtual-context/)
2
+ [![Python](https://img.shields.io/pypi/pyversions/virtual-context.svg)](https://pypi.org/project/virtual-context/)
3
+ [![Downloads](https://img.shields.io/pypi/dm/virtual-context.svg)](https://pypistats.org/packages/virtual-context)
4
+ [![License](https://img.shields.io/badge/license-AGPL--3.0-blue.svg)](https://github.com/virtual-context/virtual-context/blob/main/LICENSE)
5
+ [![Discord](https://img.shields.io/badge/Discord-Chat%20with%20us-5865F2?logo=discord&logoColor=white)](https://discord.gg/kGJva2D8Ej)
6
+ [![Twitter](https://img.shields.io/badge/Twitter-Follow-1DA1F2?logo=x&logoColor=white)](https://x.com/virtualctx)
7
+
8
+ <p align="center">
9
+ <a href="assets/dashboard.png">
10
+ <img src="assets/dashboard.png" alt="virtual-context dashboard" width="800">
11
+ </a>
12
+ </p>
13
+ <p align="center"><sub>virtual-context cloud: a 3 million token virtual window served at 80K real tokens</sub></p>
14
+
15
+ # virtual-context
16
+
17
+ **Virtual memory for LLM context. Give your agent a context window of tens or hundreds of millions of tokens; the model only ever sees the part that matters.**
18
+
19
+ Your client sets `contextWindow: 20000000` (or 200,000,000). Your model's real window is 200K. virtual-context sits between them and makes it work, the same way an operating system lets a process address more memory than physically exists. The client keeps sending its whole conversation; virtual-context stores all of it, organizes it by topic, and forwards the model a compact window of what matters for the current turn, at a size you choose. Nothing is discarded, and anything older can be paged back in at full fidelity. The dashboard above shows a live 3 million token conversation served at 80K real tokens.
20
+
21
+ It runs as an HTTP proxy, so integration is a base-URL change; a Python SDK and an MCP server are there for direct use.
22
+
23
+ ## Why
24
+
25
+ - **Memory that lasts.** What the user said at turn 12 is still recallable at turn 1,000, across sessions, clients and models.
26
+ - **Better answers from less context.** A focused window of relevant summaries and facts beats a raw window of everything, where the one fact you need is buried.
27
+ - **Lower cost.** Smaller payloads, arranged to keep providers' prompt caches warm.
28
+ - **Group chats that know who said what.** Every message keeps its sender, facts keep their author, and search can be scoped to one person.
29
+ - **One memory everywhere.** Build context in Claude Code, continue it from Telegram, query it from Cursor.
30
+
31
+ ## How it works
32
+
33
+ ```
34
+ client ──> virtual-context proxy ──> model provider
35
+ │ before the call: retrieve topics and facts for this turn,
36
+ │ assemble a bounded window
37
+ │ after the call: store the turn, tag it, compact when needed
38
+ v
39
+ store (SQLite or PostgreSQL)
40
+ canonical turns every message verbatim, with sender and channel
41
+ segments + facts per-topic summaries and structured facts
42
+ topic summaries one digest per topic, the bird's-eye view
43
+ ```
44
+
45
+ Recent turns stay verbatim. Older turns are grouped by topic, summarized and mined for facts. Each turn, the model gets recent turns plus the topics and facts relevant to the question, and a topic index telling it what else it can open with built-in tools (`vc_expand_topic`, `vc_find_quote`, `vc_recall_all`, and others).
46
+
47
+ ## Quick start
48
+
49
+ ```bash
50
+ pip install "virtual-context[proxy,embeddings]" # Python 3.11+
51
+ ```
52
+
53
+ virtual-context uses a language model of your choice to tag turns and write summaries. Pick where it runs:
54
+
55
+ ```bash
56
+ # A local model server (Ollama, LM Studio, llama.cpp, vLLM): nothing leaves your machine
57
+ virtual-context init recommended-local
58
+
59
+ # Or a hosted model through OpenRouter
60
+ virtual-context init recommended
61
+ export OPENROUTER_API_KEY=...
62
+ ```
63
+
64
+ Either writes `virtual-context.yaml`; set `tag_generator.model` and `summarization.model` to the model you want. Then start the proxy and point your client at `http://127.0.0.1:5757` instead of the provider:
65
+
66
+ ```bash
67
+ virtual-context proxy --upstream https://api.anthropic.com
68
+ ```
69
+
70
+ A dashboard runs at `http://127.0.0.1:5757/dashboard`.
71
+
72
+ The two presets are the hosted service's configuration on one machine and differ only in where the model runs: SQLite storage, paging tools on, fact curation on. Answer quality depends on the model you pick. `scripts/smoke_recommended.sh` checks a preset end to end from a clean install. The optional parts (PostgreSQL vector search, the judgment layer, group attribution) are each a section of [docs/configuration.md](docs/configuration.md); `virtual-context presets list` shows every preset, and [docs/install.md](docs/install.md) covers install options and running it as a service.
73
+
74
+ The proxy accepts Anthropic Messages, OpenAI Responses, OpenAI Chat Completions and Gemini requests. The paging tools are injected for Anthropic, OpenAI Responses and Gemini; Chat Completions clients get retrieved context but no tools.
75
+
76
+ **Hosted:** [virtual-context.com](https://virtual-context.com) runs the same engine as a service with the dashboard and cost reports; you change your base URL and nothing else.
77
+
78
+ ## Integrations
79
+
80
+ **Claude Code**
81
+
82
+ ```bash
83
+ export ANTHROPIC_BASE_URL=http://127.0.0.1:5757
84
+ ```
85
+
86
+ Tool output (file reads, searches, command results) is collapsed into restorable stubs, and when Claude Code trims its own history, the missing turns are restored from storage.
87
+
88
+ **Any client with a base URL** (Cursor, Continue, your own app)
89
+
90
+ ```python
91
+ client = anthropic.Anthropic(base_url="http://127.0.0.1:5757")
92
+ client = OpenAI(base_url="http://127.0.0.1:5757/v1")
93
+ ```
94
+
95
+ **OpenClaw:** use the [OpenClaw plugin](https://github.com/virtual-context/openclaw-plugin). Settings for direct proxy use are in [docs/install.md](docs/install.md).
96
+
97
+ **Python SDK**
98
+
99
+ ```python
100
+ from virtual_context import VirtualContextEngine
101
+
102
+ engine = VirtualContextEngine(config_path="./virtual-context.yaml")
103
+ assembled = engine.on_message_inbound(message=user_message, conversation_history=messages) # before the LLM call
104
+ report = engine.on_turn_complete(messages) # after it
105
+ ```
106
+
107
+ **MCP server:** eight tools (`recall_context`, `compact_context`, `expand_topic`, `recall_all`, `remember_when`, `find_quote`, `search_summaries`, `domain_status`) plus topic resources, for Claude Desktop, Cursor or any MCP client.
108
+
109
+ ## Features
110
+
111
+ | Feature | What it does | Docs |
112
+ |---|---|---|
113
+ | Topic memory | Each turn is tagged by topic; older turns become per-topic segment summaries and one digest per topic. Tags converge on an existing vocabulary instead of piling up synonyms. | [engine](docs/engine.md) |
114
+ | Structured facts | Compaction extracts facts (subject, verb, object, status, time, source turns). Newer facts supersede older ones, and facts can be retrieved by topic and by meaning. | [fact lifecycle](docs/fact-lifecycle.md) |
115
+ | Retrieval | Topics are ranked by tag overlap, full-text match and embedding similarity, with full-text and semantic search over stored turns as a fallback. | [engine](docs/engine.md) |
116
+ | Demand paging | The model sees topic digests for cold topics and segment summaries for relevant ones, and opens full text through tools when it needs detail. | [engine](docs/engine.md) |
117
+ | Time-scoped recall | "What changed between June and July?" resolves by date math on stored timestamps, not by model guessing. | [engine](docs/engine.md) |
118
+ | Group memory | Sender and channel are stored on every message, facts keep their author, members get person cards, and search can be scoped to one speaker. Direct-message content never appears in a server's context. Off by default. | [attribution](docs/attribution.md) |
119
+ | Tool and media compression | Finished tool exchanges become stubs restorable with `vc_restore_tool`; screenshots are recompressed with originals kept. | [proxy](docs/proxy.md) |
120
+ | Prompt-cache aware | Injected context sits after a cache breakpoint, and payload rewrites wait until the provider's cache would have expired anyway. | [engine](docs/engine.md) |
121
+ | A ceiling you choose | Set `context_window` to any size; the virtual window the client sees is independent of it. | [configuration](docs/configuration.md) |
122
+ | Truncation recovery | When a client trims its own history, the missing turns are restored from storage. | [proxy](docs/proxy.md) |
123
+ | History import | ChatGPT, Claude and Grok exports arrive tagged and searchable (`virtual-context import`). | [commands](docs/commands.md) |
124
+ | Native vector search | On PostgreSQL with pgvector, quote search, segment candidates and fact search rank inside the database instead of in each worker. | [native vector search](docs/native-vector-search.md) |
125
+ | Judgment layer (optional) | A typed judgment model can make individual decisions: which topics and segments to retrieve, which facts to keep, which existing tags a turn belongs to, and more. Each decision runs in `legacy`, `shadow` (logged side by side) or `jev` mode and falls back to the built-in behavior on any failure. Needs a TypeSafe API key. | [configuration](docs/configuration.md#judgment) |
126
+
127
+ ## Commands in any conversation
128
+
129
+ Type these as ordinary messages in a connected client; the proxy handles them without calling the model.
130
+
131
+ | Command | What it does |
132
+ |---|---|
133
+ | `VCATTACH <label\|id>` | Reattach this client to another stored conversation |
134
+ | `VCLABEL <name>` | Set the conversation label (no argument shows it) |
135
+ | `VCSTATUS` | Conversation id, label, turns, segments, active topics |
136
+ | `VCRECALL <query>` | Search stored context and bring matching topics into the next turn |
137
+ | `VCCOMPACT` | Compact now |
138
+ | `VCLIST` | List conversations with labels and turn counts |
139
+ | `VCFORGET <tag>` | Delete a topic's segments and summaries |
140
+ | `VCMERGE INTO <label\|id>` | Merge this conversation's stored data into another |
141
+
142
+ `VCATTACH` is a durable redirect: nothing is deleted and old references keep resolving, so two clients (or two agents) can share one memory. Details: [docs/commands.md](docs/commands.md).
143
+
144
+ ## Running it in production
145
+
146
+ - **Storage:** SQLite by default; PostgreSQL (`pip install "virtual-context[postgres]"`) for multi-worker deployments. With pgvector installed, `virtual-context admin migrate-semantic-vectors` prepares in-database vector search.
147
+ - **Multi-worker safety:** compactions run under leased, fenced operations, lifecycle changes are epoch-guarded, and a backlog sweeper compacts conversations whose traffic never triggers it inline.
148
+ - **Operator tooling:** `virtual-context admin` has 27 guarded backfill, repair and migration commands with dry-run modes.
149
+ - **Security:** dashboard endpoints are open until you set `VC_DASHBOARD_TOKEN`; the default bind is loopback only.
150
+ - **Observability:** per-stage timing logs, request captures in the dashboard, and per-call cost telemetry.
151
+
152
+ Architecture, including the canonical-turn model and the REST prepare/ingest surface: [docs/architecture.md](docs/architecture.md).
153
+
154
+ ## Benchmarks
155
+
156
+ On 100 questions from [LongMemEval-500](https://github.com/xiaowu0162/LongMemEval), with the same reader model (Claude Sonnet 4.5):
157
+
158
+ | | virtual-context | Full raw history |
159
+ |---|---|---|
160
+ | Correct | 95/100 | 33/100 |
161
+ | Tokens per question | 52,347 | 117,582 |
162
+ | Cost per question | $0.16 | $0.36 |
163
+
164
+ These are **historical results**: the original run's provenance is incomplete and they are not a measurement of the current pipeline. Configuration, results by category, the per-question table and how new runs are recorded: [docs/benchmarks.md](docs/benchmarks.md).
165
+
166
+ ## Documentation
167
+
168
+ | Page | Covers |
169
+ |---|---|
170
+ | [architecture.md](docs/architecture.md) | Memory model, request pipeline, multi-worker coordination, identity |
171
+ | [engine.md](docs/engine.md) | Compaction, tagging, retrieval, code mode, cache awareness |
172
+ | [fact-lifecycle.md](docs/fact-lifecycle.md) | How facts are extracted, superseded and retrieved |
173
+ | [attribution.md](docs/attribution.md) | Group conversations: who said what, person cards, speaker search |
174
+ | [proxy.md](docs/proxy.md) | Proxy internals, routing, dashboard, streaming, endpoints |
175
+ | [native-vector-search.md](docs/native-vector-search.md) | PostgreSQL + pgvector ranking and its migration |
176
+ | [configuration.md](docs/configuration.md) | Every config key with its default, including the judgment layer |
177
+ | [commands.md](docs/commands.md) | In-conversation commands, the CLI, import, admin tooling |
178
+ | [install.md](docs/install.md) | Install paths, daemons, multi-instance setups |
179
+ | [design.md](docs/design.md) | Why it is built this way, and how it compares with RAG and plain compaction |
180
+ | [benchmarks.md](docs/benchmarks.md) | Suites, results, how to run them |
181
+
182
+ ## Development
183
+
184
+ ```bash
185
+ git clone https://github.com/virtual-context/virtual-context.git
186
+ cd virtual-context
187
+ python -m venv .venv && source .venv/bin/activate
188
+ python -m pip install uv==0.9.30
189
+ uv sync --locked --extra all --extra dev
190
+ .venv/bin/python scripts/check_contracts.py
191
+ ```
192
+
193
+ ## License
194
+
195
+ AGPL-3.0, Copyright Y. Ahmed Kidwai. For commercial licensing: ahmed@kidw.ai