virtual-context 0.3.2__tar.gz → 0.3.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. {virtual_context-0.3.2 → virtual_context-0.3.4}/.gitignore +5 -0
  2. virtual_context-0.3.4/CLAUDE.md +16 -0
  3. {virtual_context-0.3.2 → virtual_context-0.3.4}/PKG-INFO +6 -5
  4. {virtual_context-0.3.2 → virtual_context-0.3.4}/README.md +5 -4
  5. {virtual_context-0.3.2 → virtual_context-0.3.4}/models.yaml +2 -2
  6. {virtual_context-0.3.2 → virtual_context-0.3.4}/pyproject.toml +2 -1
  7. virtual_context-0.3.4/scripts/install.ps1 +64 -0
  8. virtual_context-0.3.4/scripts/install.sh +70 -0
  9. virtual_context-0.3.4/specs/cache-aware-compaction.md +573 -0
  10. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_budget_enforcement.py +53 -0
  11. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_compaction_commit_prune.py +12 -3
  12. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_config.py +2 -2
  13. virtual_context-0.3.4/tests/test_deferred_payload_compaction.py +365 -0
  14. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_embedding_tag_generator.py +55 -0
  15. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_engine_lookback.py +25 -0
  16. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_paging.py +43 -0
  17. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_presets.py +2 -2
  18. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_provider_adapters.py +13 -12
  19. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy.py +356 -11
  20. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy_dashboard.py +8 -7
  21. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy_formats.py +159 -20
  22. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_request_captures_persistence.py +10 -0
  23. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_retriever.py +45 -0
  24. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_session_state.py +126 -0
  25. virtual_context-0.3.4/tests/test_store_recovery.py +389 -0
  26. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tag_generator.py +71 -0
  27. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tool_loop.py +50 -11
  28. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_turn_tag_index.py +12 -0
  29. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual-context.yaml +3 -3
  30. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/__init__.py +1 -1
  31. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/cli/main.py +396 -43
  32. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/config.py +2 -0
  33. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/assembler.py +60 -0
  34. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/compaction_pipeline.py +36 -13
  35. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/composite_store.py +3 -0
  36. virtual_context-0.3.4/virtual_context/core/embedding_tag_generator.py +252 -0
  37. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/hint_builder.py +12 -3
  38. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/model_catalog.py +15 -3
  39. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/monitor.py +28 -8
  40. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/protocols.py +1 -0
  41. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/provider_adapters.py +40 -13
  42. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/retrieval_assembler.py +164 -13
  43. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/retrieval_scoring.py +84 -5
  44. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/retriever.py +90 -11
  45. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/store.py +31 -0
  46. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tag_generator.py +144 -10
  47. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tagging_pipeline.py +148 -12
  48. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tool_query.py +6 -5
  49. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/turn_tag_index.py +8 -0
  50. virtual_context-0.3.4/virtual_context/data/models.yaml +207 -0
  51. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/engine.py +85 -3
  52. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/presets/agentic.py +6 -6
  53. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/presets/coding.py +6 -6
  54. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/dashboard.html +3 -3
  55. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/dashboard.py +4 -0
  56. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/formats.py +218 -34
  57. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/handlers.py +160 -1
  58. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/helpers.py +1 -0
  59. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/message_filter.py +488 -173
  60. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/metrics.py +30 -21
  61. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/server.py +782 -138
  62. virtual_context-0.3.4/virtual_context/proxy/session_state.py +870 -0
  63. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/state.py +363 -51
  64. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/filesystem.py +5 -0
  65. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/postgres.py +62 -17
  66. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/sqlite.py +11 -0
  67. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/types.py +20 -6
  68. virtual_context-0.3.2/tests/test_store_recovery.py +0 -192
  69. virtual_context-0.3.2/virtual_context/core/embedding_tag_generator.py +0 -122
  70. virtual_context-0.3.2/virtual_context/proxy/session_state.py +0 -413
  71. {virtual_context-0.3.2 → virtual_context-0.3.4}/LICENSE +0 -0
  72. {virtual_context-0.3.2 → virtual_context-0.3.4}/README-draft.md +0 -0
  73. {virtual_context-0.3.2 → virtual_context-0.3.4}/README.md.backup +0 -0
  74. {virtual_context-0.3.2 → virtual_context-0.3.4}/assets/dashboard.png +0 -0
  75. {virtual_context-0.3.2 → virtual_context-0.3.4}/assets/hero.png +0 -0
  76. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/REGRESSION_MAP.md +0 -0
  77. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/conftest.py +0 -0
  78. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/docker-compose.test.yml +0 -0
  79. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/haiku/__init__.py +0 -0
  80. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/haiku/conftest.py +0 -0
  81. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/haiku/test_compaction.py +0 -0
  82. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/haiku/test_retrieval.py +0 -0
  83. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/haiku/test_tagging.py +0 -0
  84. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/__init__.py +0 -0
  85. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/conftest.py +0 -0
  86. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/test_compactor.py +0 -0
  87. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/test_pipeline.py +0 -0
  88. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/test_provider.py +0 -0
  89. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/test_tag_generator.py +0 -0
  90. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/proxy/__init__.py +0 -0
  91. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/proxy/test_dashboard_cors.py +0 -0
  92. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/proxy/test_metrics.py +0 -0
  93. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_assembler.py +0 -0
  94. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_backend_integration.py +0 -0
  95. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_cli_init.py +0 -0
  96. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_compactor.py +0 -0
  97. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_compactor_concurrent.py +0 -0
  98. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_composite_store.py +0 -0
  99. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_context_bleed.py +0 -0
  100. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_conversation_identity.py +0 -0
  101. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_conversation_lifecycle.py +0 -0
  102. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_conversation_scoping.py +0 -0
  103. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_empty_turn_skip.py +0 -0
  104. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_engine_integration.py +0 -0
  105. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_engine_state.py +0 -0
  106. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_engine_sync_turns.py +0 -0
  107. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_enrichment.py +0 -0
  108. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_graph_integration.py +0 -0
  109. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_link_checker.py +0 -0
  110. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_link_query.py +0 -0
  111. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_link_types.py +0 -0
  112. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_links_sqlite.py +0 -0
  113. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_redesign.py +0 -0
  114. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fill_pass.py +0 -0
  115. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_find_quote.py +0 -0
  116. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_format_agnostic.py +0 -0
  117. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_headless.py +0 -0
  118. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_history_filter.py +0 -0
  119. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_idf_retrieval.py +0 -0
  120. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_ingest_index_integrity.py +0 -0
  121. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_longmemeval_auth.py +0 -0
  122. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_mcp_server.py +0 -0
  123. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_media.py +0 -0
  124. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_message_filter.py +0 -0
  125. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_metrics_persistence.py +0 -0
  126. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_model_catalog.py +0 -0
  127. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_model_limits.py +0 -0
  128. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_monitor.py +0 -0
  129. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_multi_instance.py +0 -0
  130. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_noop_fact_link_store.py +0 -0
  131. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_openrouter_provider.py +0 -0
  132. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_passthrough_filter.py +0 -0
  133. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_prev_context_leak.py +0 -0
  134. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy_message_filter.py +0 -0
  135. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy_session.py +0 -0
  136. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy_streaming.py +0 -0
  137. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_raw_content.py +0 -0
  138. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_recall_all.py +0 -0
  139. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_registry_lifecycle.py +0 -0
  140. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_rrf_scoring.py +0 -0
  141. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_segmenter.py +0 -0
  142. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_semantic_search.py +0 -0
  143. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_sender_identity.py +0 -0
  144. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_session_cache.py +0 -0
  145. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_session_date.py +0 -0
  146. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_storage_protocols.py +0 -0
  147. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_store_sqlite.py +0 -0
  148. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_stub_turn_handling.py +0 -0
  149. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_supersession.py +0 -0
  150. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_supersession_migration.py +0 -0
  151. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tag_canonicalizer.py +0 -0
  152. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tag_consolidator.py +0 -0
  153. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tag_splitter.py +0 -0
  154. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_telemetry.py +0 -0
  155. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_telemetry_integration.py +0 -0
  156. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tool_output_interceptor.py +0 -0
  157. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tool_result_filter.py +0 -0
  158. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tool_tags.py +0 -0
  159. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tui.py +0 -0
  160. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_turn_grouping.py +0 -0
  161. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_unified_budget.py +0 -0
  162. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_upstream_trim.py +0 -0
  163. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_vcattach.py +0 -0
  164. {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_verb_expansion.py +0 -0
  165. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual-context.yaml.example +0 -0
  166. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/cli/__init__.py +0 -0
  167. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/conversation_identity.py +0 -0
  168. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/__init__.py +0 -0
  169. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/compactor.py +0 -0
  170. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/conversation_store.py +0 -0
  171. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/embedding_provider.py +0 -0
  172. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/engine_utils.py +0 -0
  173. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/fact_query.py +0 -0
  174. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/fts_preprocessor.py +0 -0
  175. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/llm_utils.py +0 -0
  176. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/math_utils.py +0 -0
  177. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/paging_manager.py +0 -0
  178. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/quote_search.py +0 -0
  179. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/search_engine.py +0 -0
  180. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/segmenter.py +0 -0
  181. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/semantic_search.py +0 -0
  182. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tag_canonicalizer.py +0 -0
  183. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tag_consolidator.py +0 -0
  184. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tag_scoring.py +0 -0
  185. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tag_splitter.py +0 -0
  186. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/telemetry.py +0 -0
  187. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/temporal_resolver.py +0 -0
  188. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tool_loop.py +0 -0
  189. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/data/anthropic-tokenizer/tokenizer.json +0 -0
  190. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/ingest/__init__.py +0 -0
  191. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/ingest/curator.py +0 -0
  192. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/ingest/date_resolver.py +0 -0
  193. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/ingest/parsers.py +0 -0
  194. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/ingest/supersession.py +0 -0
  195. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/mcp/__init__.py +0 -0
  196. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/mcp/server.py +0 -0
  197. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/model_limits.py +0 -0
  198. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/openclaw/virtual-context.mjs +0 -0
  199. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/patterns.py +0 -0
  200. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/presets/__init__.py +0 -0
  201. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/presets/base.py +0 -0
  202. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/providers/__init__.py +0 -0
  203. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/providers/anthropic.py +0 -0
  204. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/providers/base.py +0 -0
  205. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/providers/generic_openai.py +0 -0
  206. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/providers/ollama_native.py +0 -0
  207. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/__init__.py +0 -0
  208. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/_envelope.py +0 -0
  209. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/media.py +0 -0
  210. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/multi.py +0 -0
  211. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/registry.py +0 -0
  212. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/session_cache.py +0 -0
  213. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/android-chrome-192x192.png +0 -0
  214. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/android-chrome-512x512.png +0 -0
  215. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/apple-touch-icon.png +0 -0
  216. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/favicon-16x16.png +0 -0
  217. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/favicon-32x32.png +0 -0
  218. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/favicon.ico +0 -0
  219. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/site.webmanifest +0 -0
  220. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/tool_output_interceptor.py +0 -0
  221. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/vcattach.py +0 -0
  222. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/__init__.py +0 -0
  223. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/falkordb.py +0 -0
  224. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/helpers.py +0 -0
  225. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/neo4j.py +0 -0
  226. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/noop_fact_link_store.py +0 -0
  227. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/token_counter.py +0 -0
  228. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/__init__.py +0 -0
  229. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/app.py +0 -0
  230. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/chat.tcss +0 -0
  231. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/chat_provider.py +0 -0
  232. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/headless.py +0 -0
  233. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/modals/__init__.py +0 -0
  234. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/modals/turn_inspector.py +0 -0
  235. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/state.py +0 -0
  236. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/__init__.py +0 -0
  237. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/budget_bar.py +0 -0
  238. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/chat_view.py +0 -0
  239. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/input_box.py +0 -0
  240. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/tag_panel.py +0 -0
  241. {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/turn_list.py +0 -0
@@ -22,6 +22,11 @@ build/
22
22
  .virtualcontext/
23
23
  .virtualcontext-*/
24
24
 
25
+ # Local scripts / experiments
26
+ scripts/*
27
+ !scripts/install.ps1
28
+ !scripts/install.sh
29
+
25
30
  # Config files (may contain API keys)
26
31
  virtual-context-*.yaml
27
32
  !virtual-context.yaml.example
@@ -0,0 +1,16 @@
1
+ # Virtual Context
2
+
3
+ ## Environment
4
+
5
+ Always run tests with `.venv/bin/pytest`. Always use `.venv/bin/python` for any Python commands. The project venv must be used for all operations.
6
+
7
+ ```bash
8
+ # Run tests
9
+ .venv/bin/pytest tests/
10
+
11
+ # Run a specific test
12
+ .venv/bin/pytest tests/test_foo.py -k "test_name"
13
+
14
+ # Install dependencies
15
+ .venv/bin/pip install -e ".[dev]"
16
+ ```
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtual-context
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: OS-style virtual memory for LLM session context management
5
5
  Project-URL: Homepage, https://virtual-context.com
6
6
  Project-URL: Repository, https://github.com/virtual-context/virtual-context
@@ -69,10 +69,11 @@ Your client sets `contextWindow: 20000000` (20 million). Your model's real windo
69
69
 
70
70
  Virtualizing the context window has many advantages:
71
71
 
72
- - **Compression**: Topic-level summarization with structured fact extraction. A 937K-token payload collapses to ~65K. Everything is stored, indexed, and recoverable at full fidelity.
72
+ - **Compression**: Topic-level summarization with structured fact extraction, tool chain stubbing (52 tool call/response pairs collapse to a single retrievable stub), and image scaling (a 391KB base64 screenshot becomes ~40KB, cutting payload size by ~90%). A 937K-token payload collapses to ~65K. Everything is stored, indexed, and recoverable at full fidelity.
73
73
  - **Memory**: Your agent recalls what the user said at turn 12 when it reaches turn 1000. Facts, preferences, and decisions persist across the full conversation, not just what fits in the raw window.
74
74
  - **Reasoning quality**: A curated 60K window of dense signal produces measurably better answers than a raw 200K window full of noise. The model reasons over what matters, not over everything.
75
75
  - **Cost**: Smaller payloads, fewer tokens billed. A conversation running at a 1M-token virtual window regularly produces 60-90K actual payloads, a fraction of the raw cost. The payload is organized to maximize prompt cache hits, so even compressed conversations achieve significant caching in most cases.
76
+ - **Cache-Aware Payload Compaction**: VC compacts conversations in the background but defers rewriting the request payload until the provider's prompt cache has expired or the context window is nearly full. This preserves the byte-identical prefix that providers use for cache hits, giving you compaction savings without sacrificing cached-token discounts. You get full compaction savings when they're free and full cache savings when they matter.
76
77
  - **Collaboration**: VCATTACH lets agents share memory across platforms and sessions. Custom agents, local tools, and API clients can all work from the same context. Multiple agents collaborate through shared memory. Conversations survive client restarts, platform switches, and session boundaries.
77
78
 
78
79
  This is what makes virtual-context fundamentally different from memory systems that bolt a vector database onto your LLM. Those systems are *additive*: they retrieve chunks and compete for the context window your agent is working in right now. They do nothing to evict or curate what's already there.
@@ -223,7 +224,7 @@ proxy:
223
224
 
224
225
  ```bash
225
226
  virtual-context daemon install --upstream https://api.anthropic.com
226
- virtual-context onboard --wizard --install-daemon
227
+ virtual-context onboard --install-daemon
227
228
  ```
228
229
 
229
230
  Daemon lifecycle: `daemon status | start | stop | restart | uninstall`
@@ -406,7 +407,7 @@ virtual-context transform -m "What about auth?" # tag + retrieve + assemble
406
407
  virtual-context compact -i msgs.json # manual compaction
407
408
  virtual-context aliases list|suggest|add # tag alias management
408
409
  virtual-context init coding # create config from preset
409
- virtual-context onboard [--wizard] # guided setup
410
+ virtual-context onboard [--upstream URL] # guided setup (interactive wizard)
410
411
  virtual-context daemon install|status|start|stop # background service
411
412
  virtual-context config validate # check config syntax
412
413
  virtual-context telemetry [--verbose] [--json] # cost, tokens, timing
@@ -573,7 +574,7 @@ cd virtual-context
573
574
  python -m venv .venv && source .venv/bin/activate
574
575
  pip install -e ".[dev]"
575
576
  python -m pytest tests/ -v --ignore=tests/ollama # ~1500 unit tests
576
- python -m pytest tests/ollama/ -v -m ollama # integration (requires Ollama)
577
+ python -m pytest tests/ollama/ -v -m ollama # integration (requires local LLM)
577
578
  ```
578
579
 
579
580
  ## License
@@ -22,10 +22,11 @@ Your client sets `contextWindow: 20000000` (20 million). Your model's real windo
22
22
 
23
23
  Virtualizing the context window has many advantages:
24
24
 
25
- - **Compression**: Topic-level summarization with structured fact extraction. A 937K-token payload collapses to ~65K. Everything is stored, indexed, and recoverable at full fidelity.
25
+ - **Compression**: Topic-level summarization with structured fact extraction, tool chain stubbing (52 tool call/response pairs collapse to a single retrievable stub), and image scaling (a 391KB base64 screenshot becomes ~40KB, cutting payload size by ~90%). A 937K-token payload collapses to ~65K. Everything is stored, indexed, and recoverable at full fidelity.
26
26
  - **Memory**: Your agent recalls what the user said at turn 12 when it reaches turn 1000. Facts, preferences, and decisions persist across the full conversation, not just what fits in the raw window.
27
27
  - **Reasoning quality**: A curated 60K window of dense signal produces measurably better answers than a raw 200K window full of noise. The model reasons over what matters, not over everything.
28
28
  - **Cost**: Smaller payloads, fewer tokens billed. A conversation running at a 1M-token virtual window regularly produces 60-90K actual payloads, a fraction of the raw cost. The payload is organized to maximize prompt cache hits, so even compressed conversations achieve significant caching in most cases.
29
+ - **Cache-Aware Payload Compaction**: VC compacts conversations in the background but defers rewriting the request payload until the provider's prompt cache has expired or the context window is nearly full. This preserves the byte-identical prefix that providers use for cache hits, giving you compaction savings without sacrificing cached-token discounts. You get full compaction savings when they're free and full cache savings when they matter.
29
30
  - **Collaboration**: VCATTACH lets agents share memory across platforms and sessions. Custom agents, local tools, and API clients can all work from the same context. Multiple agents collaborate through shared memory. Conversations survive client restarts, platform switches, and session boundaries.
30
31
 
31
32
  This is what makes virtual-context fundamentally different from memory systems that bolt a vector database onto your LLM. Those systems are *additive*: they retrieve chunks and compete for the context window your agent is working in right now. They do nothing to evict or curate what's already there.
@@ -176,7 +177,7 @@ proxy:
176
177
 
177
178
  ```bash
178
179
  virtual-context daemon install --upstream https://api.anthropic.com
179
- virtual-context onboard --wizard --install-daemon
180
+ virtual-context onboard --install-daemon
180
181
  ```
181
182
 
182
183
  Daemon lifecycle: `daemon status | start | stop | restart | uninstall`
@@ -359,7 +360,7 @@ virtual-context transform -m "What about auth?" # tag + retrieve + assemble
359
360
  virtual-context compact -i msgs.json # manual compaction
360
361
  virtual-context aliases list|suggest|add # tag alias management
361
362
  virtual-context init coding # create config from preset
362
- virtual-context onboard [--wizard] # guided setup
363
+ virtual-context onboard [--upstream URL] # guided setup (interactive wizard)
363
364
  virtual-context daemon install|status|start|stop # background service
364
365
  virtual-context config validate # check config syntax
365
366
  virtual-context telemetry [--verbose] [--json] # cost, tokens, timing
@@ -526,7 +527,7 @@ cd virtual-context
526
527
  python -m venv .venv && source .venv/bin/activate
527
528
  pip install -e ".[dev]"
528
529
  python -m pytest tests/ -v --ignore=tests/ollama # ~1500 unit tests
529
- python -m pytest tests/ollama/ -v -m ollama # integration (requires Ollama)
530
+ python -m pytest tests/ollama/ -v -m ollama # integration (requires local LLM)
530
531
  ```
531
532
 
532
533
  ## License
@@ -197,10 +197,10 @@ models:
197
197
  aliases: [mimo, mimo-flash]
198
198
 
199
199
  # ---------------------------------------------------------------------------
200
- # Local / Ollama (free)
200
+ # Local LLM (free)
201
201
  # ---------------------------------------------------------------------------
202
202
  qwen3:4b-instruct-2507-fp16:
203
- provider: ollama
203
+ provider: local
204
204
  input_per_mtok: 0.00
205
205
  output_per_mtok: 0.00
206
206
  context_window: 32768
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "virtual-context"
7
- version = "0.3.2"
7
+ version = "0.3.4"
8
8
  description = "OS-style virtual memory for LLM session context management"
9
9
  readme = "README.md"
10
10
  license = "AGPL-3.0-or-later"
@@ -71,6 +71,7 @@ exclude = [
71
71
  artifacts = [
72
72
  "virtual_context/proxy/static/*",
73
73
  "virtual_context/data/anthropic-tokenizer/tokenizer.json",
74
+ "virtual_context/data/models.yaml",
74
75
  ]
75
76
 
76
77
  [tool.hatch.build.targets.wheel]
@@ -0,0 +1,64 @@
1
+ $ErrorActionPreference = "Stop"
2
+
3
+ $PackageName = "virtual-context"
4
+
5
+ function Write-Info {
6
+ param([string]$Message)
7
+ Write-Host "[virtual-context] $Message"
8
+ }
9
+
10
+ function Test-Command {
11
+ param([string]$Name)
12
+ return [bool](Get-Command $Name -ErrorAction SilentlyContinue)
13
+ }
14
+
15
+ function Install-WithPipx {
16
+ if (Test-Command pipx) {
17
+ Write-Info "Installing with pipx..."
18
+ pipx install --force $PackageName
19
+ return $true
20
+ }
21
+
22
+ if (Test-Command py) {
23
+ Write-Info "pipx not found. Installing pipx with py -m pip --user..."
24
+ py -m pip install --user pipx
25
+ py -m pipx ensurepath | Out-Null
26
+ if (py -m pipx --version) {
27
+ py -m pipx install --force $PackageName
28
+ return $true
29
+ }
30
+ }
31
+
32
+ return $false
33
+ }
34
+
35
+ function Install-WithPipUser {
36
+ if (Test-Command py) {
37
+ Write-Info "Falling back to py -m pip --user install..."
38
+ py -m pip install --user --upgrade $PackageName
39
+ return $true
40
+ }
41
+ return $false
42
+ }
43
+
44
+ Write-Info "Installing $PackageName"
45
+
46
+ if (-not (Install-WithPipx)) {
47
+ if (-not (Install-WithPipUser)) {
48
+ throw "Installation failed: need Python launcher 'py' and pip, or pipx"
49
+ }
50
+ }
51
+
52
+ if (-not (Test-Command virtual-context)) {
53
+ Write-Info "Installed, but 'virtual-context' is not on PATH yet."
54
+ Write-Info "Open a new PowerShell session, then run: virtual-context --help"
55
+ exit 0
56
+ }
57
+
58
+ Write-Info "Install complete"
59
+ Write-Info "Next:"
60
+ Write-Info " 1) virtual-context onboard --wizard # guided setup (config + proxy instances + daemon)"
61
+ Write-Info " Or manual setup:"
62
+ Write-Info " 1) virtual-context init coding"
63
+ Write-Info " 2) virtual-context config validate"
64
+ Write-Info " 3) virtual-context proxy --upstream https://api.anthropic.com"
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ PACKAGE_NAME="virtual-context"
5
+
6
+ log() {
7
+ printf "[virtual-context] %s\n" "$*"
8
+ }
9
+
10
+ need_cmd() {
11
+ command -v "$1" >/dev/null 2>&1
12
+ }
13
+
14
+ install_with_pipx() {
15
+ if need_cmd pipx; then
16
+ log "Installing with pipx..."
17
+ pipx install --force "$PACKAGE_NAME"
18
+ return 0
19
+ fi
20
+
21
+ if need_cmd python3; then
22
+ log "pipx not found. Installing pipx via python3 --user..."
23
+ python3 -m pip install --user pipx
24
+ python3 -m pipx ensurepath >/dev/null 2>&1 || true
25
+
26
+ # shellcheck disable=SC2016
27
+ log 'If this is your first pipx install, restart your shell and rerun this script.'
28
+ if python3 -m pipx --version >/dev/null 2>&1; then
29
+ python3 -m pipx install --force "$PACKAGE_NAME"
30
+ return 0
31
+ fi
32
+ fi
33
+
34
+ return 1
35
+ }
36
+
37
+ install_with_pip_user() {
38
+ if ! need_cmd python3; then
39
+ return 1
40
+ fi
41
+ log "Falling back to python3 -m pip --user install..."
42
+ python3 -m pip install --user --upgrade "$PACKAGE_NAME"
43
+ }
44
+
45
+ main() {
46
+ log "Installing $PACKAGE_NAME"
47
+
48
+ if install_with_pipx; then
49
+ :
50
+ elif install_with_pip_user; then
51
+ :
52
+ else
53
+ log "Installation failed: need python3 (and pip) or pipx"
54
+ exit 1
55
+ fi
56
+
57
+ if ! need_cmd virtual-context; then
58
+ log "Installed, but 'virtual-context' is not on PATH yet."
59
+ log "Open a new shell, then run: virtual-context --help"
60
+ exit 0
61
+ fi
62
+
63
+ log "Install complete"
64
+ log "Next:"
65
+ log " 1) virtual-context daemon install --upstream https://api.anthropic.com"
66
+ log " (creates ~/.virtualcontext/ with config + data, installs + starts daemon)"
67
+ log " Or: virtual-context onboard --wizard # interactive multi-instance setup"
68
+ }
69
+
70
+ main "$@"