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.
- {virtual_context-0.3.2 → virtual_context-0.3.4}/.gitignore +5 -0
- virtual_context-0.3.4/CLAUDE.md +16 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/PKG-INFO +6 -5
- {virtual_context-0.3.2 → virtual_context-0.3.4}/README.md +5 -4
- {virtual_context-0.3.2 → virtual_context-0.3.4}/models.yaml +2 -2
- {virtual_context-0.3.2 → virtual_context-0.3.4}/pyproject.toml +2 -1
- virtual_context-0.3.4/scripts/install.ps1 +64 -0
- virtual_context-0.3.4/scripts/install.sh +70 -0
- virtual_context-0.3.4/specs/cache-aware-compaction.md +573 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_budget_enforcement.py +53 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_compaction_commit_prune.py +12 -3
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_config.py +2 -2
- virtual_context-0.3.4/tests/test_deferred_payload_compaction.py +365 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_embedding_tag_generator.py +55 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_engine_lookback.py +25 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_paging.py +43 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_presets.py +2 -2
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_provider_adapters.py +13 -12
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy.py +356 -11
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy_dashboard.py +8 -7
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy_formats.py +159 -20
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_request_captures_persistence.py +10 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_retriever.py +45 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_session_state.py +126 -0
- virtual_context-0.3.4/tests/test_store_recovery.py +389 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tag_generator.py +71 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tool_loop.py +50 -11
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_turn_tag_index.py +12 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual-context.yaml +3 -3
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/__init__.py +1 -1
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/cli/main.py +396 -43
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/config.py +2 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/assembler.py +60 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/compaction_pipeline.py +36 -13
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/composite_store.py +3 -0
- virtual_context-0.3.4/virtual_context/core/embedding_tag_generator.py +252 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/hint_builder.py +12 -3
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/model_catalog.py +15 -3
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/monitor.py +28 -8
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/protocols.py +1 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/provider_adapters.py +40 -13
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/retrieval_assembler.py +164 -13
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/retrieval_scoring.py +84 -5
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/retriever.py +90 -11
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/store.py +31 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tag_generator.py +144 -10
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tagging_pipeline.py +148 -12
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tool_query.py +6 -5
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/turn_tag_index.py +8 -0
- virtual_context-0.3.4/virtual_context/data/models.yaml +207 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/engine.py +85 -3
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/presets/agentic.py +6 -6
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/presets/coding.py +6 -6
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/dashboard.html +3 -3
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/dashboard.py +4 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/formats.py +218 -34
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/handlers.py +160 -1
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/helpers.py +1 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/message_filter.py +488 -173
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/metrics.py +30 -21
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/server.py +782 -138
- virtual_context-0.3.4/virtual_context/proxy/session_state.py +870 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/state.py +363 -51
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/filesystem.py +5 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/postgres.py +62 -17
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/sqlite.py +11 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/types.py +20 -6
- virtual_context-0.3.2/tests/test_store_recovery.py +0 -192
- virtual_context-0.3.2/virtual_context/core/embedding_tag_generator.py +0 -122
- virtual_context-0.3.2/virtual_context/proxy/session_state.py +0 -413
- {virtual_context-0.3.2 → virtual_context-0.3.4}/LICENSE +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/README-draft.md +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/README.md.backup +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/assets/dashboard.png +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/assets/hero.png +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/REGRESSION_MAP.md +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/conftest.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/docker-compose.test.yml +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/haiku/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/haiku/conftest.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/haiku/test_compaction.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/haiku/test_retrieval.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/haiku/test_tagging.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/conftest.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/test_compactor.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/test_pipeline.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/test_provider.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/ollama/test_tag_generator.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/proxy/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/proxy/test_dashboard_cors.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/proxy/test_metrics.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_assembler.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_backend_integration.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_cli_init.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_compactor.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_compactor_concurrent.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_composite_store.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_context_bleed.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_conversation_identity.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_conversation_lifecycle.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_conversation_scoping.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_empty_turn_skip.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_engine_integration.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_engine_state.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_engine_sync_turns.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_enrichment.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_graph_integration.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_link_checker.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_link_query.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_link_types.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_links_sqlite.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fact_redesign.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_fill_pass.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_find_quote.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_format_agnostic.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_headless.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_history_filter.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_idf_retrieval.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_ingest_index_integrity.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_longmemeval_auth.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_mcp_server.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_media.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_message_filter.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_metrics_persistence.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_model_catalog.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_model_limits.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_monitor.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_multi_instance.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_noop_fact_link_store.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_openrouter_provider.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_passthrough_filter.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_prev_context_leak.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy_message_filter.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy_session.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_proxy_streaming.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_raw_content.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_recall_all.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_registry_lifecycle.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_rrf_scoring.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_segmenter.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_semantic_search.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_sender_identity.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_session_cache.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_session_date.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_storage_protocols.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_store_sqlite.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_stub_turn_handling.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_supersession.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_supersession_migration.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tag_canonicalizer.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tag_consolidator.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tag_splitter.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_telemetry.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_telemetry_integration.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tool_output_interceptor.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tool_result_filter.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tool_tags.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_tui.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_turn_grouping.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_unified_budget.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_upstream_trim.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_vcattach.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/tests/test_verb_expansion.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual-context.yaml.example +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/cli/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/conversation_identity.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/compactor.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/conversation_store.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/embedding_provider.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/engine_utils.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/fact_query.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/fts_preprocessor.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/llm_utils.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/math_utils.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/paging_manager.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/quote_search.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/search_engine.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/segmenter.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/semantic_search.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tag_canonicalizer.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tag_consolidator.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tag_scoring.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tag_splitter.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/telemetry.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/temporal_resolver.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/core/tool_loop.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/data/anthropic-tokenizer/tokenizer.json +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/ingest/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/ingest/curator.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/ingest/date_resolver.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/ingest/parsers.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/ingest/supersession.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/mcp/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/mcp/server.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/model_limits.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/openclaw/virtual-context.mjs +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/patterns.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/presets/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/presets/base.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/providers/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/providers/anthropic.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/providers/base.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/providers/generic_openai.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/providers/ollama_native.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/_envelope.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/media.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/multi.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/registry.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/session_cache.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/android-chrome-192x192.png +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/android-chrome-512x512.png +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/apple-touch-icon.png +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/favicon-16x16.png +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/favicon-32x32.png +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/favicon.ico +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/static/site.webmanifest +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/tool_output_interceptor.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/proxy/vcattach.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/falkordb.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/helpers.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/neo4j.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/storage/noop_fact_link_store.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/token_counter.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/app.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/chat.tcss +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/chat_provider.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/headless.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/modals/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/modals/turn_inspector.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/state.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/__init__.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/budget_bar.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/chat_view.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/input_box.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/tag_panel.py +0 -0
- {virtual_context-0.3.2 → virtual_context-0.3.4}/virtual_context/tui/widgets/turn_list.py +0 -0
|
@@ -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.
|
|
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 --
|
|
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 [--
|
|
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
|
|
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 --
|
|
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 [--
|
|
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
|
|
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
|
|
200
|
+
# Local LLM (free)
|
|
201
201
|
# ---------------------------------------------------------------------------
|
|
202
202
|
qwen3:4b-instruct-2507-fp16:
|
|
203
|
-
provider:
|
|
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.
|
|
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 "$@"
|