synapse-cli-agent 0.1.35__tar.gz → 0.1.37__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.
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.github/workflows/native-compression-wheels.yml +20 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.github/workflows/release.yml +2 -1
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/AGENTS.md +3 -3
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/CHANGELOG.md +27 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/PKG-INFO +2 -1
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/pyproject.toml +3 -1
- synapse_cli_agent-0.1.37/release_body.md +9 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/Cargo.lock +1 -1
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/Cargo.toml +1 -1
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/pyproject.toml +1 -1
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/app/agent.py +17 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/app/agent_assembly.py +9 -0
- synapse_cli_agent-0.1.37/src/synapse/integrations/turbo.py +222 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/config.py +2 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/profile.py +7 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/registry.py +59 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/settings/schema.py +8 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/__init__.py +5 -0
- synapse_cli_agent-0.1.37/src/synapse/ui/bottombar/components/turbo.py +39 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/context.py +3 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/chrome/controller.py +3 -4
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/image_render.py +48 -3
- synapse_cli_agent-0.1.37/src/synapse/ui/image_viewer.py +301 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/mermaid_image.py +12 -4
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/rendering.py +90 -21
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript_blocks.py +5 -1
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_image_render.py +75 -5
- synapse_cli_agent-0.1.37/tests/test_image_viewer.py +231 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_mermaid_image.py +47 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/uv.lock +8 -1
- synapse_cli_agent-0.1.35/release_body.md +0 -22
- synapse_cli_agent-0.1.35/src/synapse/ui/image_viewer.py +0 -105
- synapse_cli_agent-0.1.35/tests/test_image_viewer.py +0 -40
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.dockerignore +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.github/workflows/ci.yml +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.github/workflows/docs.yml +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.github/workflows/native-core-tool-wheels.yml +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.gitignore +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.python-version +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.readthedocs.yaml +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.zed/settings.json +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/Dockerfile.web +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/LICENSE +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/README.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/README.zh-CN.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/agent_upstream.txt +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/assets/demo.gif +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/assets/synapse-logo.svg +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/assets/tui-preview.png +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/cli_upstream.txt +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/debug_compact.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/decode_screenshot.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/capability-matrix.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/decisions.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/index.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-0-protocol-baseline.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-1-core-transport.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-2-prompt-semantics.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-3-permissions.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-4-session-lifecycle.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-5-session-mcp.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-6-client-services.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-7-advanced-capabilities.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-8-compliance.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/progress.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-development-guide.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/baseline-report.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/decisions.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/index.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/migration.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-0-baseline.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-1-streaming-core.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-2-turn-runtime.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-3-tui-cutover.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-4-session-runtime.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-5-multi-session.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-6-project-runtime.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-7-global-control-plane.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-8-hardening.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/post-review-fix-plan.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/progress.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/architecture-flow.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/architecture.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/cli.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/codex-session-discovery-phase-1.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/codex-session-import-phase-2.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/config.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/design.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/docker-web.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/index.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/install.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/math-formulas-test.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/mcp.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/models.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/native-compression-core.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/native-core-tool.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/permissions.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/quickstart.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/sessions.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/skills.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/smith_output.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/subagents.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/tool-output-transform.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/tui-cursor-refactor.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/tutorial.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/x-agent-development-guide.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/examples/mcp.example.json +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/examples/models.example.json +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/examples/settings.example.json +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/middleware_upstream.txt +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/mkdocs.yml +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/Cargo.lock +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/Cargo.toml +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/LICENSE +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/NOTICE +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/README.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/pyproject.toml +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/python/synapse_core_tool/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/src/file_access.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/src/file_tools.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/src/lib.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/src/math_render.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/src/search.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/uv.lock +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/LICENSE +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/NOTICE +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/README.md +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/python/synapse_tool_compress_core/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/ccr.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/ccr_in_memory.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/mod.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/relevance/base.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/relevance/bm25.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/signals/keyword_detector.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/signals/line_importance.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/adaptive_sizer.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/anchor_selector.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/code_compressor.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/diff_compressor.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/log_compressor.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/search_compressor.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/analyzer.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/anchors.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/builder.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/classifier.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/classifier.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/compactor.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/formatter.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/ir.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/mod.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/walker.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/config.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/constraints.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crusher.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crushers.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/error_keywords.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/field_detect.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/hashing.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/mod.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/observer.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/orchestration.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/outliers.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/planning.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/statistics.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/stats_math.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/traits.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/types.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/lib.rs +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/scripts/install.ps1 +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/scripts/release.ps1 +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/scripts/serve_web.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/slash_cmds_upstream.txt +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/__main__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/agent.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/client_services.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/content.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/events.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/lifecycle.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/mcp.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/permissions.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/server.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/sessions.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/updates.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/app/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/app/agent_md.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/cli.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/compression.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/goal.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/helpers.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/mcp.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/model.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/result.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/sessions.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/slash_cmds.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/slash_complete.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/theme.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/config.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/content/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/content/input_history.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/content/multimodal.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/content/prompts.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/content/skills_catalog.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/entry.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/model.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/runtime.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/steering.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/store.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/tools.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/checkpoint_seed.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/codex_config.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/codex_history.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/codex_import.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/codex_sessions.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/describe_image.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/herdr.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/http_clients.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/llm_openai_compat.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/llm_openai_websocket.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/mcp_client.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/openai_oauth.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/openai_oauth_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/openai_usage.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/vision_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/memory/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/memory/auto_recorder.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/memory/embedder.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/memory/long_term.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/helpers.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/persist.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/providers.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models_registry.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/debug_inspector.html +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/debug_server.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/exit_trace.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/heap_dump.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/llm_debug.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/startup_trace.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/planner/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/planner/task_planner.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/projects/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/projects/catalog.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/rag/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/rag/knowledge_base.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/agent_loop/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/agent_loop/model.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/agent_loop/request.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/agent_loop/turn.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/async_runtime.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/backends.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/cancellation.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/context_compact.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/debug_capture_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/execute_capture.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/filesystem_tool_prompt_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/fs_permissions.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/harness.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/hitl.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/interaction_ledger.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/model_request_compression_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/pathing.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/projects/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/projects/identity.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/projects/runtime.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/safety.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/session_prewarm.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/events.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/manager.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/persistence.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/ref.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/runtime.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/steer.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/accumulator.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/adapters.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/events.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/parser.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/protocol.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/runtime.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/stream_events.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/tool_model.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/subagent_config_persist.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/subagent_specs.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/subagents.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/timeline.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/token_rate.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/tool_ignore.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/tool_output_eval.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/tool_output_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/tool_output_usage_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/tool_response_truncate_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/cancel_repair.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/search_index.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/store.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/summary.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/transcript.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/transcript_migration.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/transcript_projection.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/settings/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/settings/config_paths.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/subagents.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/detection.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/metrics.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/models.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/pipeline.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/repository.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/transformers.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tools/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tools/describe_image.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tools/filesystem_patch.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tools/filesystem_search.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tools/session_tools.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/agent_lifecycle.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/answer_divider.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/codex_usage.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/fast.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/goal.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/key_hints.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/mcp.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/mode.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/model.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/thread.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/turn_stats.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/core.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/chrome/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/clipboard.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/active_session_switcher.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/base.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/codex_config_import.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/codex_reset.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/codex_session_list.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/compression_diagnostics.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/git_explore.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/mcp_panel.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/model_form.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/model_manager.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/model_picker.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/provider_catalog.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/safety_panel.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/session_list.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/subagent_config.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/theme_designer.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/theme_picker.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/drawer.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/formatters.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/git_explore/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/git_explore/engine.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/git_explore/provider.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/git_explore/unified.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/image_preview.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/math_image.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/prompt_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/selectable_static.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/selectable_text.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/sink.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/status_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/steer_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/steer_widget.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/stream.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/stream_events.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/stream_runtime.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/textual_lifecycle.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/textual_stream_sink.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/theme.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/theme_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/timeline.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/tool_blocks.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/branch.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/title.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/tool_output.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/usage.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/workspace.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/context.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/core.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/git_changes_popover.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/git_chrome.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/tool_output_popover.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/widget.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript/controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript/factory.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript/history.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript/state.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/tui.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/tui_launch.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/tui_styles.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/event_bridge.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/event_renderer.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/persistence.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/request.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn_rail.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn_rail_widgets.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/user_turn.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/user_turn_block.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/welcome.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/web.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/synapse.cmd +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/__init__.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/acp/initialize.jsonl +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/agent_stream/core_scenarios.json +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/duplicate_response_item.jsonl +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/incomplete_and_aborted.jsonl +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/legacy_compaction.jsonl +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/normal_completed.jsonl +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/replacement_history.jsonl +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/rollback.jsonl +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/unsupported_replacement.jsonl +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/sample_repo/calculator.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/sample_repo/test_calculator.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/tool_output_eval.json +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p0_baseline.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p1_core.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p1_transport.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p2_content.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p2_events.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p2_updates.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p3_agent.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p3_permissions.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p4_history.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p4_lifecycle.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p5_mcp.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p6_client_services.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p8_compliance.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_agent_factory.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_agent_lifecycle.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_agent_turn_runtime.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_async_checkpointer.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_backends.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_bottombar_registry.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_cancel_repair.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_capabilities.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_checkpoint_seed.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_chrome_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_cli.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_cli_codex_import.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_clipboard.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_codex_config.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_codex_history.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_codex_import.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_codex_sessions.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_codex_sessions_windows.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_compact_tool_descriptions.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_config.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_context_compact.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_context_window.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_debug_capture_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_debug_inspector.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_describe_image.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_dialogs.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_entry.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_filesystem_patch_tool.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_filesystem_search_tools.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_git_changes_popover.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_git_chrome.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_git_explore.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_goal_live_tui.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_goals.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_heap_dump.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_herdr_integration.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_http_clients.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_input_history.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_iteration_abc.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_layered_config.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_math_image_render.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_mcp_schema.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_mermaid_render.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_middleware_async.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_model_dialogs.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_model_providers.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_model_request_compression_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_model_retry.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_models_persist.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_multimodal.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_native_math_render.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_openai_compat_reasoning.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_openai_oauth.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_openai_oauth_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_openai_usage.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_openai_websocket.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_pathing.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_project_catalog.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_project_drawer.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_project_runtime.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_project_switch.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_prompt_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_prompts.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_runtime_hardening.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_runtime_manager.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_runtime_streaming.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_safety.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_search_index.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_session_prewarm.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_session_runtime.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_session_store.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_session_summary.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_slash_and_mcp.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_slash_complete.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_slash_effects.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_startup_defer.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_startup_trace.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_steer.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_steer_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_stream_cancel.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_stream_semantic_fixtures.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_stream_tool_items.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_stream_ui.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_subagent_config_dialog.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_subagent_config_persist.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_subagent_status.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_subagents.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_textual_stream_sink.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_theme.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_theme_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_timeline.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_token_rate.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_blocks.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_ignore.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_intent.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_output.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_output_eval.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_output_slash.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_output_usage_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_response_truncate_middleware.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_topbar_context_ratio.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_topbar_registry.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript_history.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript_history_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript_migration.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript_projection.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tui_active_session_switcher.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tui_codex_import.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tui_paste.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tui_selection.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_turn_controller.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_turn_event_renderer.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_turn_rail_minimap.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_turn_request.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_usage_restore.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_user_turn_style.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_welcome.py +0 -0
- {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/tool_output_plugin_fixture.py +0 -0
|
@@ -67,3 +67,23 @@ jobs:
|
|
|
67
67
|
with:
|
|
68
68
|
files: dist/*.whl
|
|
69
69
|
name: synapse-tool-compress-core ${{ github.ref_name }}
|
|
70
|
+
|
|
71
|
+
publish-pypi:
|
|
72
|
+
if: startsWith(github.ref, 'refs/tags/synapse-tool-compress-core-v')
|
|
73
|
+
needs: wheel
|
|
74
|
+
runs-on: ubuntu-latest
|
|
75
|
+
environment:
|
|
76
|
+
name: pypi
|
|
77
|
+
url: https://pypi.org/p/synapse-tool-compress-core
|
|
78
|
+
permissions:
|
|
79
|
+
id-token: write
|
|
80
|
+
steps:
|
|
81
|
+
- uses: actions/download-artifact@v4
|
|
82
|
+
with:
|
|
83
|
+
pattern: wheel-*
|
|
84
|
+
merge-multiple: true
|
|
85
|
+
path: dist
|
|
86
|
+
- name: Publish wheels to PyPI
|
|
87
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
88
|
+
with:
|
|
89
|
+
packages-dir: dist/
|
|
@@ -85,7 +85,7 @@ jobs:
|
|
|
85
85
|
- name: Install Rust toolchain
|
|
86
86
|
uses: dtolnay/rust-toolchain@stable
|
|
87
87
|
|
|
88
|
-
- name: Install dependencies (builds local synapse-core-tool)
|
|
88
|
+
- name: Install dependencies (builds local synapse-core-tool and synapse-tool-compress-core)
|
|
89
89
|
run: uv sync --frozen
|
|
90
90
|
|
|
91
91
|
- name: Install PyInstaller
|
|
@@ -101,6 +101,7 @@ jobs:
|
|
|
101
101
|
--collect-all textual_image `
|
|
102
102
|
--collect-all termaid `
|
|
103
103
|
--collect-all texicode `
|
|
104
|
+
--collect-all synapse_tool_compress_core `
|
|
104
105
|
src/synapse/entry.py
|
|
105
106
|
|
|
106
107
|
- name: Rename executable for artifact
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
| `src/synapse/ui/` | Textual TUI, stream, timeline, dialogs, topbar/bottombar |
|
|
24
24
|
| `tests/` | Python tests, usually mirroring domain modules |
|
|
25
25
|
| `rust/synapse-core-tool/` | Native filesystem tools (read/edit/patch/search) and math rendering; published to PyPI as `synapse-core-tool` |
|
|
26
|
-
| `rust/synapse-tool-compress-core/` |
|
|
26
|
+
| `rust/synapse-tool-compress-core/` | Native tool-output compression core; required dependency, published to PyPI as `synapse-tool-compress-core` |
|
|
27
27
|
| `docs/`, `mkdocs.yml` | User docs and MkDocs config |
|
|
28
28
|
| `.github/workflows/` | CI, docs, Python release, native wheel builds |
|
|
29
29
|
|
|
@@ -83,10 +83,10 @@ uv build # after packaging/entry-point changes
|
|
|
83
83
|
|
|
84
84
|
## Rust/PyO3 native crates
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
One optional crate; the Python app must work without its wheel and must keep `ImportError`/`OSError` fallbacks.
|
|
87
87
|
|
|
88
88
|
- `rust/synapse-core-tool` (`synapse-core-tool` on PyPI): native filesystem tools (read/edit/patch/search) and math rendering. Release with tag `synapse-core-tool-v*`; `native-core-tool-wheels.yml` builds wheels and publishes to GitHub Release + PyPI. Keep the `pyproject.toml` version in sync with `Cargo.toml` — maturin names wheels from `pyproject.toml`.
|
|
89
|
-
- `rust/synapse-tool-compress-core
|
|
89
|
+
- `rust/synapse-tool-compress-core` (`synapse-tool-compress-core` on PyPI): native tool-output compression core. **Required dependency** of `synapse-cli-agent`. Release with tag `synapse-tool-compress-core-v*`; `native-compression-wheels.yml` builds wheels and publishes to GitHub Release + PyPI. Keep the `pyproject.toml` version in sync with `Cargo.toml`. Because the main package hard-depends on it, publish the compress-core wheels to PyPI before tagging the main `v*` release.
|
|
90
90
|
|
|
91
91
|
When changing either crate, at least run:
|
|
92
92
|
|
|
@@ -8,6 +8,33 @@ All entries are written in English.
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
## v0.1.37
|
|
12
|
+
|
|
13
|
+
### Engineering
|
|
14
|
+
|
|
15
|
+
- Made the native tool-output compression core (`synapse-tool-compress-core`) a required dependency of the main package: pip/uv installs now pull it by default and standalone PyInstaller executables bundle the native compression module.
|
|
16
|
+
- Publish `synapse-tool-compress-core` wheels to PyPI in addition to GitHub Releases so the hard dependency resolves for package installs.
|
|
17
|
+
- Updated the release workflow to collect the native compression extension into Windows/macOS/Linux executables.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## v0.1.36
|
|
22
|
+
|
|
23
|
+
### New Features
|
|
24
|
+
|
|
25
|
+
- Added turbo mode routing: OpenAI-compatible model traffic is relayed through the local headroom-turbo proxy via the `x-headroom-base-url` header, enabling compression for any selected profile without `models.json` changes.
|
|
26
|
+
- Added a global turbo switch (`AGENT_TURBO`) that applies to the whole workspace, not just a single model profile.
|
|
27
|
+
- Added a TURBO badge to the bottombar.
|
|
28
|
+
- Added headroom-turbo sidecar management: pinned binary download, proxy lifecycle management with health check and fallback, and pinned sidecar v0.1.2 (runs standalone without `HEADROOM_TURBO`).
|
|
29
|
+
- Added a zoomable image viewer with high-res mermaid re-rasterization.
|
|
30
|
+
|
|
31
|
+
### Bug Fixes
|
|
32
|
+
|
|
33
|
+
- Turbo mode now sends only the origin `x-headroom-base-url` header, preventing the proxy from rewriting the destination.
|
|
34
|
+
- Hidden bottombar idle/busy key hints.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
11
38
|
## v0.1.35
|
|
12
39
|
|
|
13
40
|
### New Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: synapse-cli-agent
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.37
|
|
4
4
|
Summary: Local coding agent built on LangChain Deep Agents (LocalShell, no sandbox)
|
|
5
5
|
Project-URL: Homepage, https://github.com/alex8224/synapse-agent
|
|
6
6
|
Project-URL: Repository, https://github.com/alex8224/synapse-agent
|
|
@@ -214,6 +214,7 @@ Requires-Dist: pydantic-settings==2.14.2
|
|
|
214
214
|
Requires-Dist: python-dotenv==1.2.2
|
|
215
215
|
Requires-Dist: rich==15.0.0
|
|
216
216
|
Requires-Dist: synapse-core-tool<0.2.0,>=0.1.0
|
|
217
|
+
Requires-Dist: synapse-tool-compress-core<0.2.0,>=0.1.2
|
|
217
218
|
Requires-Dist: termaid==0.7.1
|
|
218
219
|
Requires-Dist: texicode==1.0.3
|
|
219
220
|
Requires-Dist: textual-diff-view==0.1.5
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "synapse-cli-agent"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.37"
|
|
4
4
|
description = "Local coding agent built on LangChain Deep Agents (LocalShell, no sandbox)"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { file = "LICENSE" }
|
|
@@ -11,6 +11,7 @@ requires-python = ">=3.12"
|
|
|
11
11
|
|
|
12
12
|
dependencies = [
|
|
13
13
|
"synapse-core-tool>=0.1.0,<0.2.0",
|
|
14
|
+
"synapse-tool-compress-core>=0.1.2,<0.2.0",
|
|
14
15
|
"aiosqlite==0.22.1",
|
|
15
16
|
"deepagents==0.6.12",
|
|
16
17
|
"httpx[socks]==0.28.1",
|
|
@@ -73,6 +74,7 @@ exclude = [
|
|
|
73
74
|
|
|
74
75
|
[tool.uv.sources]
|
|
75
76
|
synapse-core-tool = { path = "rust/synapse-core-tool" }
|
|
77
|
+
synapse-tool-compress-core = { path = "rust/synapse-tool-compress-core" }
|
|
76
78
|
|
|
77
79
|
[tool.pytest.ini_options]
|
|
78
80
|
testpaths = ["tests"]
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## v0.1.37
|
|
2
|
+
|
|
3
|
+
### Engineering
|
|
4
|
+
|
|
5
|
+
- Made the native tool-output compression core (`synapse-tool-compress-core`) a required dependency of the main package: pip/uv installs now pull it by default and standalone PyInstaller executables bundle the native compression module.
|
|
6
|
+
- Publish `synapse-tool-compress-core` wheels to PyPI in addition to GitHub Releases so the hard dependency resolves for package installs.
|
|
7
|
+
- Updated the release workflow to collect the native compression extension into Windows/macOS/Linux executables.
|
|
8
|
+
|
|
9
|
+
---
|
{synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/pyproject.toml
RENAMED
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "synapse-tool-compress-core"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.3"
|
|
8
8
|
description = "Deterministic native compression algorithms for Synapse tool output"
|
|
9
9
|
requires-python = ">=3.12"
|
|
10
10
|
license = { text = "Apache-2.0" }
|
|
@@ -136,6 +136,8 @@ def _subagent_model_factory(registry: Any, settings: Settings) -> SubagentModelF
|
|
|
136
136
|
fallback_parallel_tool_calls=settings.parallel_tool_calls,
|
|
137
137
|
fallback_websocket=getattr(settings, "openai_websocket", False),
|
|
138
138
|
fallback_stream_chunk_timeout=getattr(settings, "stream_chunk_timeout", None),
|
|
139
|
+
fallback_turbo=bool(getattr(settings, "turbo", False)),
|
|
140
|
+
fallback_turbo_proxy_url=getattr(settings, "turbo_proxy_url", None),
|
|
139
141
|
enable_thinking=enabled,
|
|
140
142
|
reasoning_effort=effort,
|
|
141
143
|
)
|
|
@@ -304,6 +306,17 @@ def build_coding_agent(
|
|
|
304
306
|
model_cache_hit = False
|
|
305
307
|
if model_cache is None:
|
|
306
308
|
model_cache = {}
|
|
309
|
+
if getattr(settings, "turbo", False):
|
|
310
|
+
# Turbo mode routes through a local headroom-turbo sidecar; make sure
|
|
311
|
+
# the pinned binary is downloaded and the proxy is healthy before
|
|
312
|
+
# building clients. A failed proxy degrades to direct connections.
|
|
313
|
+
from synapse.integrations.turbo import ensure_turbo_binary, ensure_turbo_running
|
|
314
|
+
|
|
315
|
+
ensure_turbo_binary(progress=progress)
|
|
316
|
+
if not ensure_turbo_running(progress=progress):
|
|
317
|
+
logger.warning(
|
|
318
|
+
"headroom-turbo proxy unavailable; turbo mode disabled for this run"
|
|
319
|
+
)
|
|
307
320
|
if model is None:
|
|
308
321
|
cache_key = model_cache_key(settings, model_name=model_name)
|
|
309
322
|
cached = model_cache.get(cache_key)
|
|
@@ -591,6 +604,10 @@ def build_coding_agent(
|
|
|
591
604
|
goal_service=goal_service,
|
|
592
605
|
steer_queue=steer_queue,
|
|
593
606
|
prompt_cache_key=prompt_cache_key,
|
|
607
|
+
turbo=bool(
|
|
608
|
+
getattr(settings, "turbo", False)
|
|
609
|
+
or getattr(selected_profile, "turbo", False)
|
|
610
|
+
),
|
|
594
611
|
)
|
|
595
612
|
)
|
|
596
613
|
|
|
@@ -98,6 +98,10 @@ class MiddlewareContext:
|
|
|
98
98
|
goal_service: Any | None
|
|
99
99
|
steer_queue: SteerQueue
|
|
100
100
|
prompt_cache_key: Any | None = None
|
|
101
|
+
# Turbo mode: model traffic is routed through a headroom-turbo proxy, so
|
|
102
|
+
# the built-in reversible tool-output compression is skipped (they are
|
|
103
|
+
# mutually exclusive).
|
|
104
|
+
turbo: bool = False
|
|
101
105
|
|
|
102
106
|
|
|
103
107
|
def build_tool_output_pipeline(settings: Any) -> ToolOutputTransformPipeline:
|
|
@@ -142,6 +146,11 @@ def build_agent_middleware(context: MiddlewareContext) -> list[Any]:
|
|
|
142
146
|
),
|
|
143
147
|
]
|
|
144
148
|
transform_enabled = bool(getattr(settings, "enable_tool_output_transform", True))
|
|
149
|
+
if context.turbo:
|
|
150
|
+
# Turbo routes tool outputs through the headroom proxy for compression;
|
|
151
|
+
# running the built-in transformer too would double-compress and break
|
|
152
|
+
# the proxy's content-type routing.
|
|
153
|
+
transform_enabled = False
|
|
145
154
|
middleware.append(
|
|
146
155
|
build_tool_output_transform_middleware(
|
|
147
156
|
context.output_repository,
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"""headroom-turbo sidecar binary management.
|
|
2
|
+
|
|
3
|
+
Turbo mode routes model traffic through a local ``headroom-turbo`` proxy
|
|
4
|
+
binary. This module pins a compatible release version and downloads the
|
|
5
|
+
platform asset from GitHub Releases on first use (or when the installed
|
|
6
|
+
version drifts).
|
|
7
|
+
|
|
8
|
+
Layout::
|
|
9
|
+
|
|
10
|
+
~/.synapse/bin/
|
|
11
|
+
headroom-turbo(.exe) # the sidecar binary
|
|
12
|
+
headroom-turbo.version # installed turbo release version
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import json
|
|
18
|
+
import os
|
|
19
|
+
import platform
|
|
20
|
+
import shutil
|
|
21
|
+
import subprocess
|
|
22
|
+
import sys
|
|
23
|
+
import tempfile
|
|
24
|
+
import time
|
|
25
|
+
import urllib.request
|
|
26
|
+
from collections.abc import Callable
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
|
|
29
|
+
from synapse.settings.config_paths import user_config_dir
|
|
30
|
+
|
|
31
|
+
# Pinned compatible turbo release. Bump together with the headroom-turbo fork
|
|
32
|
+
# tag (turbo-v{version}) when the sidecar contract changes.
|
|
33
|
+
# 0.1.1 bundles orjson (proxy dependency gate), excludes litellm, and builds
|
|
34
|
+
# windowed (--noconsole) on Windows so no console window pops up.
|
|
35
|
+
# 0.1.2 forces turbo mode in the binary entry, so the sidecar also starts
|
|
36
|
+
# standalone without HEADROOM_TURBO=1 in the environment.
|
|
37
|
+
TURBO_VERSION = "0.1.2"
|
|
38
|
+
TURBO_RELEASE_REPO = "alex8224/headroom"
|
|
39
|
+
DEFAULT_PORT = 8787
|
|
40
|
+
|
|
41
|
+
_BIN_DIRNAME = "bin"
|
|
42
|
+
_VERSION_FILENAME = "headroom-turbo.version"
|
|
43
|
+
_RELEASE_BASE = f"https://github.com/{TURBO_RELEASE_REPO}/releases/download"
|
|
44
|
+
|
|
45
|
+
# Runtime availability state, set by ensure_turbo_running(). Models only route
|
|
46
|
+
# through the proxy when it is actually healthy; otherwise turbo degrades to a
|
|
47
|
+
# direct connection for the current process.
|
|
48
|
+
_proxy_ready = False
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _asset_name() -> str | None:
|
|
52
|
+
"""Return the release asset name for the current platform, or None."""
|
|
53
|
+
machine = platform.machine().lower()
|
|
54
|
+
if sys.platform.startswith("win") and machine in {"amd64", "x86_64"}:
|
|
55
|
+
return "headroom-turbo-windows-x86_64.exe"
|
|
56
|
+
if sys.platform.startswith("linux") and machine in {"amd64", "x86_64"}:
|
|
57
|
+
return "headroom-turbo-linux-x86_64"
|
|
58
|
+
if sys.platform == "darwin" and machine in {"arm64", "aarch64"}:
|
|
59
|
+
return "headroom-turbo-macos-arm64"
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def turbo_bin_dir() -> Path:
|
|
64
|
+
"""Directory holding the sidecar binary and its version marker."""
|
|
65
|
+
return user_config_dir() / _BIN_DIRNAME
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def turbo_binary_path() -> Path:
|
|
69
|
+
"""Path to the sidecar binary for the current platform."""
|
|
70
|
+
asset = _asset_name() or "headroom-turbo"
|
|
71
|
+
if sys.platform.startswith("win") and not asset.endswith(".exe"):
|
|
72
|
+
asset += ".exe"
|
|
73
|
+
return turbo_bin_dir() / asset
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def turbo_version_path() -> Path:
|
|
77
|
+
"""Path to the installed-version marker file."""
|
|
78
|
+
return turbo_bin_dir() / _VERSION_FILENAME
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def installed_turbo_version() -> str | None:
|
|
82
|
+
"""Return the installed turbo version, or None when not installed."""
|
|
83
|
+
try:
|
|
84
|
+
value = turbo_version_path().read_text(encoding="utf-8").strip()
|
|
85
|
+
except OSError:
|
|
86
|
+
return None
|
|
87
|
+
return value or None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def ensure_turbo_binary(
|
|
91
|
+
progress: Callable[[str], None] | None = None,
|
|
92
|
+
) -> Path:
|
|
93
|
+
"""Ensure the pinned headroom-turbo binary is present and current.
|
|
94
|
+
|
|
95
|
+
Downloads from GitHub Releases when missing or when the installed version
|
|
96
|
+
does not match :data:`TURBO_VERSION`. Returns the binary path.
|
|
97
|
+
"""
|
|
98
|
+
installed = installed_turbo_version()
|
|
99
|
+
if installed == TURBO_VERSION and turbo_binary_path().is_file():
|
|
100
|
+
return turbo_binary_path()
|
|
101
|
+
|
|
102
|
+
asset = _asset_name()
|
|
103
|
+
if asset is None:
|
|
104
|
+
raise RuntimeError(
|
|
105
|
+
"no headroom-turbo binary for "
|
|
106
|
+
f"{sys.platform}/{platform.machine()}; install it manually into "
|
|
107
|
+
f"{turbo_bin_dir()}"
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
url = f"{_RELEASE_BASE}/turbo-v{TURBO_VERSION}/{asset}"
|
|
111
|
+
dest = turbo_binary_path()
|
|
112
|
+
if progress is not None:
|
|
113
|
+
progress(f"downloading headroom-turbo v{TURBO_VERSION}")
|
|
114
|
+
_download(url, dest)
|
|
115
|
+
turbo_version_path().write_text(TURBO_VERSION, encoding="utf-8")
|
|
116
|
+
if progress is not None:
|
|
117
|
+
progress(f"headroom-turbo v{TURBO_VERSION} ready")
|
|
118
|
+
return dest
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _download(url: str, dest: Path) -> None:
|
|
122
|
+
"""Download ``url`` to ``dest`` atomically (temp file + rename)."""
|
|
123
|
+
turbo_bin_dir().mkdir(parents=True, exist_ok=True)
|
|
124
|
+
request = urllib.request.Request(url, headers={"User-Agent": "synapse-turbo"})
|
|
125
|
+
fd, tmp = tempfile.mkstemp(prefix=".turbo-", dir=turbo_bin_dir())
|
|
126
|
+
os.close(fd)
|
|
127
|
+
try:
|
|
128
|
+
with urllib.request.urlopen(request, timeout=600) as resp, open(
|
|
129
|
+
tmp, "wb"
|
|
130
|
+
) as out:
|
|
131
|
+
shutil.copyfileobj(resp, out, length=1024 * 256)
|
|
132
|
+
os.replace(tmp, dest)
|
|
133
|
+
if not sys.platform.startswith("win"):
|
|
134
|
+
dest.chmod(0o755)
|
|
135
|
+
finally:
|
|
136
|
+
try:
|
|
137
|
+
os.unlink(tmp)
|
|
138
|
+
except OSError:
|
|
139
|
+
pass
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def proxy_ready() -> bool:
|
|
143
|
+
"""Return True once the local turbo proxy has passed a health check."""
|
|
144
|
+
return _proxy_ready
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _health_ok(url: str) -> bool:
|
|
148
|
+
"""True when the proxy /health endpoint reports healthy."""
|
|
149
|
+
try:
|
|
150
|
+
with urllib.request.urlopen(url, timeout=2) as resp:
|
|
151
|
+
if resp.status != 200:
|
|
152
|
+
return False
|
|
153
|
+
data = json.loads(resp.read().decode("utf-8"))
|
|
154
|
+
return str(data.get("status", "")).lower() == "healthy"
|
|
155
|
+
except Exception: # noqa: BLE001 - any failure means not ready yet
|
|
156
|
+
return False
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _start_proxy(port: int) -> None:
|
|
160
|
+
"""Launch the sidecar proxy detached from the current process."""
|
|
161
|
+
binary = turbo_binary_path()
|
|
162
|
+
if not binary.is_file():
|
|
163
|
+
raise RuntimeError(f"headroom-turbo binary missing: {binary}")
|
|
164
|
+
cmd = [
|
|
165
|
+
str(binary),
|
|
166
|
+
"proxy",
|
|
167
|
+
"--port",
|
|
168
|
+
str(port),
|
|
169
|
+
"--disable-kompress",
|
|
170
|
+
"--host",
|
|
171
|
+
"127.0.0.1",
|
|
172
|
+
]
|
|
173
|
+
# The turbo binary is built for headroom's deterministic turbo profile
|
|
174
|
+
# (no ML/MCP/watchdog extras bundled). HEADROOM_TURBO=1 makes its startup
|
|
175
|
+
# dependency gate treat optional modules as warn-only instead of hard
|
|
176
|
+
# failing when they are absent from the bundle.
|
|
177
|
+
env = dict(os.environ)
|
|
178
|
+
env["HEADROOM_TURBO"] = "1"
|
|
179
|
+
kwargs: dict[str, object] = {
|
|
180
|
+
"stdout": subprocess.DEVNULL,
|
|
181
|
+
"stderr": subprocess.DEVNULL,
|
|
182
|
+
"env": env,
|
|
183
|
+
}
|
|
184
|
+
if sys.platform.startswith("win"):
|
|
185
|
+
kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW | subprocess.DETACHED_PROCESS
|
|
186
|
+
else:
|
|
187
|
+
kwargs["start_new_session"] = True
|
|
188
|
+
subprocess.Popen(cmd, **kwargs) # noqa: S603 - fixed args, no shell
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def ensure_turbo_running(
|
|
192
|
+
progress: Callable[[str], None] | None = None,
|
|
193
|
+
*,
|
|
194
|
+
port: int = DEFAULT_PORT,
|
|
195
|
+
timeout: float = 30.0,
|
|
196
|
+
) -> bool:
|
|
197
|
+
"""Start the sidecar proxy (if needed) and wait until it is healthy.
|
|
198
|
+
|
|
199
|
+
Reuses an already-running healthy proxy on the same port. Returns True when
|
|
200
|
+
the proxy is ready; False means turbo mode should degrade to direct
|
|
201
|
+
connections for this process.
|
|
202
|
+
"""
|
|
203
|
+
global _proxy_ready
|
|
204
|
+
url = f"http://127.0.0.1:{port}/health"
|
|
205
|
+
if _health_ok(url):
|
|
206
|
+
_proxy_ready = True
|
|
207
|
+
return True
|
|
208
|
+
|
|
209
|
+
if progress is not None:
|
|
210
|
+
progress("starting headroom-turbo proxy")
|
|
211
|
+
try:
|
|
212
|
+
_start_proxy(port)
|
|
213
|
+
except Exception: # noqa: BLE001 - startup failure degrades, never blocks
|
|
214
|
+
return False
|
|
215
|
+
|
|
216
|
+
deadline = time.monotonic() + timeout
|
|
217
|
+
while time.monotonic() < deadline:
|
|
218
|
+
if _health_ok(url):
|
|
219
|
+
_proxy_ready = True
|
|
220
|
+
return True
|
|
221
|
+
time.sleep(0.5)
|
|
222
|
+
return False
|
|
@@ -21,6 +21,8 @@ _PROFILE_META_KEYS = {
|
|
|
21
21
|
"model_kwargs", "extra_body", "params",
|
|
22
22
|
# Import metadata (Codex config): provider name and original wire API.
|
|
23
23
|
"provider", "wire_api",
|
|
24
|
+
# Turbo mode: route through headroom-turbo proxy.
|
|
25
|
+
"turbo", "turbo_base_url",
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
def expand_env_string(value: Any) -> Any:
|
|
@@ -50,6 +50,13 @@ class ModelProfile:
|
|
|
50
50
|
# Whether the selected primary model accepts native image content.
|
|
51
51
|
# None means infer from provider/model name.
|
|
52
52
|
image_input: bool | None = None
|
|
53
|
+
# Turbo mode: route model traffic through a local headroom-turbo proxy.
|
|
54
|
+
# The profile's original base_url is forwarded via the x-headroom-base-url
|
|
55
|
+
# header so the proxy compresses and relays to the real upstream.
|
|
56
|
+
turbo: bool = False
|
|
57
|
+
# Optional override for the turbo proxy base URL. Defaults to
|
|
58
|
+
# SYNAPSE_TURBO_PROXY_URL, then http://localhost:8787/v1.
|
|
59
|
+
turbo_base_url: str | None = None
|
|
53
60
|
|
|
54
61
|
def resolved_api_key(self) -> str | None:
|
|
55
62
|
if self.api_key:
|
|
@@ -30,10 +30,12 @@ from __future__ import annotations
|
|
|
30
30
|
|
|
31
31
|
import hashlib
|
|
32
32
|
import json
|
|
33
|
+
import os
|
|
33
34
|
from collections.abc import Callable
|
|
34
35
|
from dataclasses import dataclass, field
|
|
35
36
|
from pathlib import Path
|
|
36
37
|
from typing import Any
|
|
38
|
+
from urllib.parse import urlparse
|
|
37
39
|
|
|
38
40
|
from synapse.integrations.llm_openai_compat import (
|
|
39
41
|
deepseek_thinking_kwargs,
|
|
@@ -107,6 +109,36 @@ def _resolve_init_chat_model() -> Callable[..., Any]:
|
|
|
107
109
|
return __getattr__("init_chat_model")
|
|
108
110
|
|
|
109
111
|
|
|
112
|
+
def _resolve_turbo_proxy_url(profile: ModelProfile, fallback: str | None = None) -> str:
|
|
113
|
+
"""Resolve the headroom-turbo proxy base URL for a profile.
|
|
114
|
+
|
|
115
|
+
Priority: profile ``turbo_base_url`` → explicit fallback (Settings) →
|
|
116
|
+
``SYNAPSE_TURBO_PROXY_URL`` env → the local default ``http://localhost:8787/v1``.
|
|
117
|
+
"""
|
|
118
|
+
return (
|
|
119
|
+
profile.turbo_base_url
|
|
120
|
+
or fallback
|
|
121
|
+
or os.environ.get("SYNAPSE_TURBO_PROXY_URL")
|
|
122
|
+
or "http://localhost:8787/v1"
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _turbo_upstream_origin(base_url: str) -> str:
|
|
127
|
+
"""Reduce an upstream base URL to scheme://host[:port] for the proxy.
|
|
128
|
+
|
|
129
|
+
Headroom's OpenAI chat path appends ``/v1/chat/completions`` to the
|
|
130
|
+
``x-headroom-base-url`` value itself, so forwarding the full base URL
|
|
131
|
+
(e.g. ``http://host/v1``) would produce a duplicated ``/v1/v1/...`` path.
|
|
132
|
+
Sending the bare origin keeps sub-path routing correct for standard
|
|
133
|
+
OpenAI-compatible endpoints.
|
|
134
|
+
"""
|
|
135
|
+
parsed = urlparse(str(base_url).strip())
|
|
136
|
+
if not parsed.scheme or not parsed.hostname:
|
|
137
|
+
return str(base_url).rstrip("/")
|
|
138
|
+
port = f":{parsed.port}" if parsed.port else ""
|
|
139
|
+
return f"{parsed.scheme}://{parsed.hostname}{port}"
|
|
140
|
+
|
|
141
|
+
|
|
110
142
|
@dataclass
|
|
111
143
|
class ModelRegistry:
|
|
112
144
|
"""Alias catalog for chat models + shared thinking level catalog."""
|
|
@@ -168,6 +200,8 @@ class ModelRegistry:
|
|
|
168
200
|
fallback_parallel_tool_calls: bool = True,
|
|
169
201
|
fallback_websocket: bool = False,
|
|
170
202
|
fallback_stream_chunk_timeout: float | None = None,
|
|
203
|
+
fallback_turbo: bool = False,
|
|
204
|
+
fallback_turbo_proxy_url: str | None = None,
|
|
171
205
|
enable_thinking: bool | None = None,
|
|
172
206
|
reasoning_effort: str | None = None,
|
|
173
207
|
progress: Callable[[str], None] | None = None,
|
|
@@ -250,6 +284,22 @@ class ModelRegistry:
|
|
|
250
284
|
with span("model:openai_compat_patch"):
|
|
251
285
|
enable_openai_compat_reasoning_patch()
|
|
252
286
|
enable_responses_reasoning_patch()
|
|
287
|
+
# Turbo mode: route through the headroom-turbo proxy and forward the
|
|
288
|
+
# original upstream via x-headroom-base-url so the proxy compresses
|
|
289
|
+
# and relays. Enabled globally (Settings.turbo) or per profile
|
|
290
|
+
# (profile.turbo), and only when the local sidecar is healthy.
|
|
291
|
+
# OAuth-backed Codex is excluded (its base_url is pinned to the
|
|
292
|
+
# first-party backend and must never be redirected).
|
|
293
|
+
turbo_enabled = bool(fallback_turbo or profile.turbo)
|
|
294
|
+
if turbo_enabled and base_url and oauth_provider is None:
|
|
295
|
+
from synapse.integrations.turbo import proxy_ready as _turbo_ready
|
|
296
|
+
|
|
297
|
+
if _turbo_ready():
|
|
298
|
+
configured_headers = _merge_headers(
|
|
299
|
+
configured_headers,
|
|
300
|
+
{"x-headroom-base-url": _turbo_upstream_origin(base_url)},
|
|
301
|
+
)
|
|
302
|
+
base_url = _resolve_turbo_proxy_url(profile, fallback_turbo_proxy_url)
|
|
253
303
|
if base_url:
|
|
254
304
|
kwargs["base_url"] = str(base_url).rstrip("/")
|
|
255
305
|
if api_key:
|
|
@@ -545,6 +595,8 @@ def _profiles_from_mapping(data: dict[str, Any]) -> ModelRegistry:
|
|
|
545
595
|
parallel_tool_calls=None if parallel is None else bool(parallel),
|
|
546
596
|
websocket=websocket,
|
|
547
597
|
image_input=image_input,
|
|
598
|
+
turbo=bool(cfg.get("turbo") or False),
|
|
599
|
+
turbo_base_url=cfg.get("turbo_base_url") or None,
|
|
548
600
|
extra=expanded_params,
|
|
549
601
|
model_kwargs=dict(model_kwargs),
|
|
550
602
|
extra_body=dict(extra_body),
|
|
@@ -649,6 +701,8 @@ def merge_model_profiles(base: ModelProfile, override: ModelProfile) -> ModelPro
|
|
|
649
701
|
if override.image_input is not None
|
|
650
702
|
else base.image_input
|
|
651
703
|
),
|
|
704
|
+
turbo=(override.turbo or base.turbo),
|
|
705
|
+
turbo_base_url=(override.turbo_base_url or base.turbo_base_url),
|
|
652
706
|
extra={**base.extra, **override.extra},
|
|
653
707
|
model_kwargs={**base.model_kwargs, **override.model_kwargs},
|
|
654
708
|
extra_body={**base.extra_body, **override.extra_body},
|
|
@@ -844,6 +898,9 @@ def model_cache_key(settings: Any, *, model_name: str | None = None) -> str:
|
|
|
844
898
|
"provider": profile.provider,
|
|
845
899
|
"wire_api": profile.wire_api,
|
|
846
900
|
"base_url": profile.base_url or getattr(settings, "openai_base_url", None),
|
|
901
|
+
"turbo": bool(getattr(settings, "turbo", False)) or profile.turbo,
|
|
902
|
+
"turbo_base_url": profile.turbo_base_url
|
|
903
|
+
or getattr(settings, "turbo_proxy_url", None),
|
|
847
904
|
"api_key_sha256": hashlib.sha256((api_key or "").encode()).hexdigest(),
|
|
848
905
|
"enable_thinking": bool(getattr(settings, "enable_thinking", True)),
|
|
849
906
|
"reasoning_effort": getattr(settings, "reasoning_effort", None),
|
|
@@ -884,6 +941,8 @@ def build_model_from_settings(
|
|
|
884
941
|
fallback_stream_chunk_timeout=getattr(
|
|
885
942
|
settings, "stream_chunk_timeout", None
|
|
886
943
|
),
|
|
944
|
+
fallback_turbo=bool(getattr(settings, "turbo", False)),
|
|
945
|
+
fallback_turbo_proxy_url=getattr(settings, "turbo_proxy_url", None),
|
|
887
946
|
# Session Settings always win over profile defaults.
|
|
888
947
|
enable_thinking=bool(settings.enable_thinking),
|
|
889
948
|
reasoning_effort=settings.reasoning_effort,
|
|
@@ -143,6 +143,14 @@ class Settings(BaseSettings):
|
|
|
143
143
|
models_json: str | None = Field(default=None, validation_alias="MODELS_JSON")
|
|
144
144
|
# Selected profile alias (optional; falls back to model / registry default)
|
|
145
145
|
active_model: str | None = Field(default=None, validation_alias="AGENT_ACTIVE_MODEL")
|
|
146
|
+
# Turbo mode: route all OpenAI-compatible model traffic through a local
|
|
147
|
+
# headroom-turbo proxy. The profile's original base_url is forwarded via the
|
|
148
|
+
# x-headroom-base-url header so the proxy compresses and relays. Requires no
|
|
149
|
+
# models.json change — any selected profile is affected.
|
|
150
|
+
turbo: bool = Field(default=False, validation_alias="AGENT_TURBO")
|
|
151
|
+
turbo_proxy_url: str = Field(
|
|
152
|
+
default="http://localhost:8787/v1", validation_alias="AGENT_TURBO_PROXY_URL"
|
|
153
|
+
)
|
|
146
154
|
# Independent OpenAI-compatible image-to-text model configuration.
|
|
147
155
|
# Example: {"model": "qwen-vl-max", "base_url": "...", "api_key_env": "VISION_API_KEY"}
|
|
148
156
|
vision_model: dict[str, Any] | None = Field(default=None, validation_alias="VISION_MODEL")
|
|
@@ -27,6 +27,7 @@ from synapse.ui.bottombar.components import (
|
|
|
27
27
|
mcp,
|
|
28
28
|
mode,
|
|
29
29
|
model,
|
|
30
|
+
turbo,
|
|
30
31
|
turn_stats,
|
|
31
32
|
)
|
|
32
33
|
from synapse.ui.bottombar.core import (
|
|
@@ -50,6 +51,7 @@ DEFAULT_COMPONENT_INSTALLERS: list[ComponentInstaller] = [
|
|
|
50
51
|
turn_stats.install,
|
|
51
52
|
model.install,
|
|
52
53
|
fast.install,
|
|
54
|
+
turbo.install,
|
|
53
55
|
codex_usage.install,
|
|
54
56
|
mcp.install,
|
|
55
57
|
]
|
|
@@ -107,6 +109,7 @@ def install_default_components(
|
|
|
107
109
|
codex_usage: Callable[[], str | object] | None = None,
|
|
108
110
|
mcp: Callable[[], str] | None = None,
|
|
109
111
|
fast_mode: Callable[[], bool] | None = None,
|
|
112
|
+
turbo: Callable[[], bool] | None = None,
|
|
110
113
|
goal: Callable[[], str | object] | None = None,
|
|
111
114
|
turn_stats: Callable[[], str | object] | None = None,
|
|
112
115
|
installers: list[ComponentInstaller] | None = None,
|
|
@@ -143,6 +146,7 @@ def install_default_components(
|
|
|
143
146
|
codex_usage=codex_usage or _empty,
|
|
144
147
|
mcp=mcp or _empty,
|
|
145
148
|
fast_mode=fast_mode or _off,
|
|
149
|
+
turbo=turbo or _off,
|
|
146
150
|
goal=goal or _empty,
|
|
147
151
|
turn_stats=turn_stats or _empty,
|
|
148
152
|
)
|
|
@@ -157,6 +161,7 @@ def install_default_components(
|
|
|
157
161
|
codex_usage=codex_usage or ctx.codex_usage,
|
|
158
162
|
mcp=mcp or ctx.mcp,
|
|
159
163
|
fast_mode=fast_mode or ctx.fast_mode,
|
|
164
|
+
turbo=turbo or ctx.turbo,
|
|
160
165
|
goal=goal or ctx.goal,
|
|
161
166
|
turn_stats=turn_stats or ctx.turn_stats,
|
|
162
167
|
)
|