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.
Files changed (564) hide show
  1. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.github/workflows/native-compression-wheels.yml +20 -0
  2. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.github/workflows/release.yml +2 -1
  3. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/AGENTS.md +3 -3
  4. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/CHANGELOG.md +27 -0
  5. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/PKG-INFO +2 -1
  6. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/pyproject.toml +3 -1
  7. synapse_cli_agent-0.1.37/release_body.md +9 -0
  8. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/Cargo.lock +1 -1
  9. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/Cargo.toml +1 -1
  10. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/pyproject.toml +1 -1
  11. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/app/agent.py +17 -0
  12. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/app/agent_assembly.py +9 -0
  13. synapse_cli_agent-0.1.37/src/synapse/integrations/turbo.py +222 -0
  14. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/config.py +2 -0
  15. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/profile.py +7 -0
  16. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/registry.py +59 -0
  17. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/settings/schema.py +8 -0
  18. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/__init__.py +5 -0
  19. synapse_cli_agent-0.1.37/src/synapse/ui/bottombar/components/turbo.py +39 -0
  20. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/context.py +3 -0
  21. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/chrome/controller.py +3 -4
  22. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/image_render.py +48 -3
  23. synapse_cli_agent-0.1.37/src/synapse/ui/image_viewer.py +301 -0
  24. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/mermaid_image.py +12 -4
  25. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/rendering.py +90 -21
  26. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript_blocks.py +5 -1
  27. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_image_render.py +75 -5
  28. synapse_cli_agent-0.1.37/tests/test_image_viewer.py +231 -0
  29. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_mermaid_image.py +47 -0
  30. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/uv.lock +8 -1
  31. synapse_cli_agent-0.1.35/release_body.md +0 -22
  32. synapse_cli_agent-0.1.35/src/synapse/ui/image_viewer.py +0 -105
  33. synapse_cli_agent-0.1.35/tests/test_image_viewer.py +0 -40
  34. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.dockerignore +0 -0
  35. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.github/workflows/ci.yml +0 -0
  36. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.github/workflows/docs.yml +0 -0
  37. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.github/workflows/native-core-tool-wheels.yml +0 -0
  38. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.gitignore +0 -0
  39. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.python-version +0 -0
  40. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.readthedocs.yaml +0 -0
  41. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/.zed/settings.json +0 -0
  42. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/Dockerfile.web +0 -0
  43. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/LICENSE +0 -0
  44. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/README.md +0 -0
  45. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/README.zh-CN.md +0 -0
  46. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/agent_upstream.txt +0 -0
  47. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/assets/demo.gif +0 -0
  48. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/assets/synapse-logo.svg +0 -0
  49. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/assets/tui-preview.png +0 -0
  50. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/cli_upstream.txt +0 -0
  51. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/debug_compact.py +0 -0
  52. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/decode_screenshot.py +0 -0
  53. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/capability-matrix.md +0 -0
  54. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/decisions.md +0 -0
  55. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/index.md +0 -0
  56. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-0-protocol-baseline.md +0 -0
  57. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-1-core-transport.md +0 -0
  58. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-2-prompt-semantics.md +0 -0
  59. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-3-permissions.md +0 -0
  60. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-4-session-lifecycle.md +0 -0
  61. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-5-session-mcp.md +0 -0
  62. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-6-client-services.md +0 -0
  63. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-7-advanced-capabilities.md +0 -0
  64. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/phase-8-compliance.md +0 -0
  65. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/acp-adapter/progress.md +0 -0
  66. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-development-guide.md +0 -0
  67. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/baseline-report.md +0 -0
  68. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/decisions.md +0 -0
  69. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/index.md +0 -0
  70. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/migration.md +0 -0
  71. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-0-baseline.md +0 -0
  72. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-1-streaming-core.md +0 -0
  73. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-2-turn-runtime.md +0 -0
  74. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-3-tui-cutover.md +0 -0
  75. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-4-session-runtime.md +0 -0
  76. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-5-multi-session.md +0 -0
  77. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-6-project-runtime.md +0 -0
  78. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-7-global-control-plane.md +0 -0
  79. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/phase-8-hardening.md +0 -0
  80. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/post-review-fix-plan.md +0 -0
  81. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/agent-runtime-decoupling/progress.md +0 -0
  82. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/architecture-flow.md +0 -0
  83. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/architecture.md +0 -0
  84. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/cli.md +0 -0
  85. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/codex-session-discovery-phase-1.md +0 -0
  86. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/codex-session-import-phase-2.md +0 -0
  87. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/config.md +0 -0
  88. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/design.md +0 -0
  89. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/docker-web.md +0 -0
  90. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/index.md +0 -0
  91. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/install.md +0 -0
  92. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/math-formulas-test.md +0 -0
  93. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/mcp.md +0 -0
  94. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/models.md +0 -0
  95. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/native-compression-core.md +0 -0
  96. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/native-core-tool.md +0 -0
  97. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/permissions.md +0 -0
  98. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/quickstart.md +0 -0
  99. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/sessions.md +0 -0
  100. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/skills.md +0 -0
  101. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/smith_output.md +0 -0
  102. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/subagents.md +0 -0
  103. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/tool-output-transform.md +0 -0
  104. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/tui-cursor-refactor.md +0 -0
  105. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/tutorial.md +0 -0
  106. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/docs/x-agent-development-guide.md +0 -0
  107. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/examples/mcp.example.json +0 -0
  108. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/examples/models.example.json +0 -0
  109. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/examples/settings.example.json +0 -0
  110. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/middleware_upstream.txt +0 -0
  111. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/mkdocs.yml +0 -0
  112. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/Cargo.lock +0 -0
  113. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/Cargo.toml +0 -0
  114. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/LICENSE +0 -0
  115. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/NOTICE +0 -0
  116. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/README.md +0 -0
  117. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/pyproject.toml +0 -0
  118. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/python/synapse_core_tool/__init__.py +0 -0
  119. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/src/file_access.rs +0 -0
  120. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/src/file_tools.rs +0 -0
  121. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/src/lib.rs +0 -0
  122. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/src/math_render.rs +0 -0
  123. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/src/search.rs +0 -0
  124. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-core-tool/uv.lock +0 -0
  125. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/LICENSE +0 -0
  126. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/NOTICE +0 -0
  127. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/README.md +0 -0
  128. {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
  129. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/ccr.rs +0 -0
  130. {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
  131. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/headroom_port/mod.rs +0 -0
  132. {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
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {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
  144. {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
  145. {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
  146. {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
  147. {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
  148. {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
  149. {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
  150. {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
  151. {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
  152. {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
  153. {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
  154. {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
  155. {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
  156. {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
  157. {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
  158. {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
  159. {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
  160. {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
  161. {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
  162. {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
  163. {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
  164. {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
  165. {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
  166. {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
  167. {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
  168. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/rust/synapse-tool-compress-core/src/lib.rs +0 -0
  169. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/scripts/install.ps1 +0 -0
  170. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/scripts/release.ps1 +0 -0
  171. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/scripts/serve_web.py +0 -0
  172. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/slash_cmds_upstream.txt +0 -0
  173. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/__init__.py +0 -0
  174. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/__main__.py +0 -0
  175. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/__init__.py +0 -0
  176. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/agent.py +0 -0
  177. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/client_services.py +0 -0
  178. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/content.py +0 -0
  179. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/events.py +0 -0
  180. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/lifecycle.py +0 -0
  181. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/mcp.py +0 -0
  182. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/permissions.py +0 -0
  183. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/server.py +0 -0
  184. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/sessions.py +0 -0
  185. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/acp/updates.py +0 -0
  186. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/app/__init__.py +0 -0
  187. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/app/agent_md.py +0 -0
  188. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/cli.py +0 -0
  189. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/__init__.py +0 -0
  190. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/compression.py +0 -0
  191. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/goal.py +0 -0
  192. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/helpers.py +0 -0
  193. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/mcp.py +0 -0
  194. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/model.py +0 -0
  195. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/result.py +0 -0
  196. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/sessions.py +0 -0
  197. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/slash_cmds.py +0 -0
  198. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/slash_complete.py +0 -0
  199. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/commands/theme.py +0 -0
  200. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/config.py +0 -0
  201. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/content/__init__.py +0 -0
  202. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/content/input_history.py +0 -0
  203. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/content/multimodal.py +0 -0
  204. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/content/prompts.py +0 -0
  205. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/content/skills_catalog.py +0 -0
  206. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/entry.py +0 -0
  207. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/__init__.py +0 -0
  208. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/middleware.py +0 -0
  209. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/model.py +0 -0
  210. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/runtime.py +0 -0
  211. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/steering.py +0 -0
  212. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/store.py +0 -0
  213. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/goals/tools.py +0 -0
  214. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/__init__.py +0 -0
  215. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/checkpoint_seed.py +0 -0
  216. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/codex_config.py +0 -0
  217. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/codex_history.py +0 -0
  218. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/codex_import.py +0 -0
  219. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/codex_sessions.py +0 -0
  220. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/describe_image.py +0 -0
  221. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/herdr.py +0 -0
  222. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/http_clients.py +0 -0
  223. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/llm_openai_compat.py +0 -0
  224. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/llm_openai_websocket.py +0 -0
  225. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/mcp_client.py +0 -0
  226. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/openai_oauth.py +0 -0
  227. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/openai_oauth_middleware.py +0 -0
  228. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/openai_usage.py +0 -0
  229. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/integrations/vision_middleware.py +0 -0
  230. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/memory/__init__.py +0 -0
  231. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/memory/auto_recorder.py +0 -0
  232. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/memory/embedder.py +0 -0
  233. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/memory/long_term.py +0 -0
  234. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/__init__.py +0 -0
  235. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/helpers.py +0 -0
  236. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/persist.py +0 -0
  237. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models/providers.py +0 -0
  238. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/models_registry.py +0 -0
  239. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/__init__.py +0 -0
  240. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/debug_inspector.html +0 -0
  241. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/debug_server.py +0 -0
  242. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/exit_trace.py +0 -0
  243. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/heap_dump.py +0 -0
  244. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/llm_debug.py +0 -0
  245. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/observability/startup_trace.py +0 -0
  246. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/planner/__init__.py +0 -0
  247. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/planner/task_planner.py +0 -0
  248. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/projects/__init__.py +0 -0
  249. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/projects/catalog.py +0 -0
  250. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/rag/__init__.py +0 -0
  251. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/rag/knowledge_base.py +0 -0
  252. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/__init__.py +0 -0
  253. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/agent_loop/__init__.py +0 -0
  254. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/agent_loop/model.py +0 -0
  255. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/agent_loop/request.py +0 -0
  256. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/agent_loop/turn.py +0 -0
  257. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/async_runtime.py +0 -0
  258. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/backends.py +0 -0
  259. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/cancellation.py +0 -0
  260. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/context_compact.py +0 -0
  261. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/debug_capture_middleware.py +0 -0
  262. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/execute_capture.py +0 -0
  263. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/filesystem_tool_prompt_middleware.py +0 -0
  264. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/fs_permissions.py +0 -0
  265. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/harness.py +0 -0
  266. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/hitl.py +0 -0
  267. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/interaction_ledger.py +0 -0
  268. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/middleware.py +0 -0
  269. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/model_request_compression_middleware.py +0 -0
  270. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/pathing.py +0 -0
  271. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/projects/__init__.py +0 -0
  272. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/projects/identity.py +0 -0
  273. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/projects/runtime.py +0 -0
  274. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/safety.py +0 -0
  275. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/session_prewarm.py +0 -0
  276. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/__init__.py +0 -0
  277. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/events.py +0 -0
  278. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/manager.py +0 -0
  279. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/persistence.py +0 -0
  280. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/ref.py +0 -0
  281. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/sessions/runtime.py +0 -0
  282. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/steer.py +0 -0
  283. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/__init__.py +0 -0
  284. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/accumulator.py +0 -0
  285. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/adapters.py +0 -0
  286. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/events.py +0 -0
  287. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/parser.py +0 -0
  288. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/protocol.py +0 -0
  289. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/runtime.py +0 -0
  290. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/stream_events.py +0 -0
  291. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/streaming/tool_model.py +0 -0
  292. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/subagent_config_persist.py +0 -0
  293. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/subagent_specs.py +0 -0
  294. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/subagents.py +0 -0
  295. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/timeline.py +0 -0
  296. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/token_rate.py +0 -0
  297. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/tool_ignore.py +0 -0
  298. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/tool_output_eval.py +0 -0
  299. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/tool_output_middleware.py +0 -0
  300. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/tool_output_usage_middleware.py +0 -0
  301. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/runtime/tool_response_truncate_middleware.py +0 -0
  302. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/__init__.py +0 -0
  303. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/cancel_repair.py +0 -0
  304. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/search_index.py +0 -0
  305. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/store.py +0 -0
  306. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/summary.py +0 -0
  307. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/transcript.py +0 -0
  308. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/transcript_migration.py +0 -0
  309. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/sessions/transcript_projection.py +0 -0
  310. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/settings/__init__.py +0 -0
  311. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/settings/config_paths.py +0 -0
  312. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/subagents.py +0 -0
  313. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/__init__.py +0 -0
  314. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/detection.py +0 -0
  315. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/metrics.py +0 -0
  316. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/models.py +0 -0
  317. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/pipeline.py +0 -0
  318. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/repository.py +0 -0
  319. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tool_output/transformers.py +0 -0
  320. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tools/__init__.py +0 -0
  321. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tools/describe_image.py +0 -0
  322. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tools/filesystem_patch.py +0 -0
  323. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tools/filesystem_search.py +0 -0
  324. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/tools/session_tools.py +0 -0
  325. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/__init__.py +0 -0
  326. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/agent_lifecycle.py +0 -0
  327. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/answer_divider.py +0 -0
  328. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/__init__.py +0 -0
  329. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/codex_usage.py +0 -0
  330. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/fast.py +0 -0
  331. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/goal.py +0 -0
  332. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/key_hints.py +0 -0
  333. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/mcp.py +0 -0
  334. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/mode.py +0 -0
  335. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/model.py +0 -0
  336. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/thread.py +0 -0
  337. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/components/turn_stats.py +0 -0
  338. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/bottombar/core.py +0 -0
  339. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/chrome/__init__.py +0 -0
  340. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/clipboard.py +0 -0
  341. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/__init__.py +0 -0
  342. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/active_session_switcher.py +0 -0
  343. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/base.py +0 -0
  344. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/codex_config_import.py +0 -0
  345. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/codex_reset.py +0 -0
  346. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/codex_session_list.py +0 -0
  347. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/compression_diagnostics.py +0 -0
  348. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/controller.py +0 -0
  349. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/git_explore.py +0 -0
  350. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/mcp_panel.py +0 -0
  351. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/model_form.py +0 -0
  352. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/model_manager.py +0 -0
  353. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/model_picker.py +0 -0
  354. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/provider_catalog.py +0 -0
  355. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/safety_panel.py +0 -0
  356. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/session_list.py +0 -0
  357. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/subagent_config.py +0 -0
  358. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/theme_designer.py +0 -0
  359. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/dialogs/theme_picker.py +0 -0
  360. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/drawer.py +0 -0
  361. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/formatters.py +0 -0
  362. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/git_explore/__init__.py +0 -0
  363. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/git_explore/engine.py +0 -0
  364. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/git_explore/provider.py +0 -0
  365. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/git_explore/unified.py +0 -0
  366. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/image_preview.py +0 -0
  367. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/math_image.py +0 -0
  368. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/prompt_controller.py +0 -0
  369. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/selectable_static.py +0 -0
  370. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/selectable_text.py +0 -0
  371. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/sink.py +0 -0
  372. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/status_controller.py +0 -0
  373. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/steer_controller.py +0 -0
  374. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/steer_widget.py +0 -0
  375. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/stream.py +0 -0
  376. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/stream_events.py +0 -0
  377. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/stream_runtime.py +0 -0
  378. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/textual_lifecycle.py +0 -0
  379. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/textual_stream_sink.py +0 -0
  380. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/theme.py +0 -0
  381. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/theme_controller.py +0 -0
  382. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/timeline.py +0 -0
  383. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/tool_blocks.py +0 -0
  384. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/__init__.py +0 -0
  385. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/__init__.py +0 -0
  386. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/branch.py +0 -0
  387. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/title.py +0 -0
  388. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/tool_output.py +0 -0
  389. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/usage.py +0 -0
  390. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/components/workspace.py +0 -0
  391. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/context.py +0 -0
  392. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/core.py +0 -0
  393. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/git_changes_popover.py +0 -0
  394. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/git_chrome.py +0 -0
  395. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/tool_output_popover.py +0 -0
  396. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/topbar/widget.py +0 -0
  397. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript/__init__.py +0 -0
  398. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript/controller.py +0 -0
  399. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript/factory.py +0 -0
  400. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript/history.py +0 -0
  401. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/transcript/state.py +0 -0
  402. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/tui.py +0 -0
  403. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/tui_launch.py +0 -0
  404. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/tui_styles.py +0 -0
  405. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/__init__.py +0 -0
  406. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/controller.py +0 -0
  407. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/event_bridge.py +0 -0
  408. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/event_renderer.py +0 -0
  409. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/persistence.py +0 -0
  410. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn/request.py +0 -0
  411. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn_rail.py +0 -0
  412. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/turn_rail_widgets.py +0 -0
  413. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/user_turn.py +0 -0
  414. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/user_turn_block.py +0 -0
  415. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/ui/welcome.py +0 -0
  416. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/src/synapse/web.py +0 -0
  417. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/synapse.cmd +0 -0
  418. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/__init__.py +0 -0
  419. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/acp/initialize.jsonl +0 -0
  420. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/agent_stream/core_scenarios.json +0 -0
  421. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/duplicate_response_item.jsonl +0 -0
  422. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/incomplete_and_aborted.jsonl +0 -0
  423. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/legacy_compaction.jsonl +0 -0
  424. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/normal_completed.jsonl +0 -0
  425. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/replacement_history.jsonl +0 -0
  426. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/rollback.jsonl +0 -0
  427. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/codex_rollouts/unsupported_replacement.jsonl +0 -0
  428. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/sample_repo/calculator.py +0 -0
  429. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/sample_repo/test_calculator.py +0 -0
  430. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/fixtures/tool_output_eval.json +0 -0
  431. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test.py +0 -0
  432. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p0_baseline.py +0 -0
  433. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p1_core.py +0 -0
  434. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p1_transport.py +0 -0
  435. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p2_content.py +0 -0
  436. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p2_events.py +0 -0
  437. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p2_updates.py +0 -0
  438. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p3_agent.py +0 -0
  439. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p3_permissions.py +0 -0
  440. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p4_history.py +0 -0
  441. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p4_lifecycle.py +0 -0
  442. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p5_mcp.py +0 -0
  443. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p6_client_services.py +0 -0
  444. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_acp_p8_compliance.py +0 -0
  445. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_agent_factory.py +0 -0
  446. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_agent_lifecycle.py +0 -0
  447. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_agent_turn_runtime.py +0 -0
  448. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_async_checkpointer.py +0 -0
  449. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_backends.py +0 -0
  450. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_bottombar_registry.py +0 -0
  451. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_cancel_repair.py +0 -0
  452. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_capabilities.py +0 -0
  453. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_checkpoint_seed.py +0 -0
  454. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_chrome_controller.py +0 -0
  455. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_cli.py +0 -0
  456. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_cli_codex_import.py +0 -0
  457. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_clipboard.py +0 -0
  458. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_codex_config.py +0 -0
  459. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_codex_history.py +0 -0
  460. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_codex_import.py +0 -0
  461. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_codex_sessions.py +0 -0
  462. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_codex_sessions_windows.py +0 -0
  463. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_compact_tool_descriptions.py +0 -0
  464. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_config.py +0 -0
  465. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_context_compact.py +0 -0
  466. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_context_window.py +0 -0
  467. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_debug_capture_middleware.py +0 -0
  468. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_debug_inspector.py +0 -0
  469. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_describe_image.py +0 -0
  470. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_dialogs.py +0 -0
  471. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_entry.py +0 -0
  472. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_filesystem_patch_tool.py +0 -0
  473. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_filesystem_search_tools.py +0 -0
  474. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_git_changes_popover.py +0 -0
  475. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_git_chrome.py +0 -0
  476. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_git_explore.py +0 -0
  477. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_goal_live_tui.py +0 -0
  478. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_goals.py +0 -0
  479. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_heap_dump.py +0 -0
  480. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_herdr_integration.py +0 -0
  481. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_http_clients.py +0 -0
  482. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_input_history.py +0 -0
  483. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_iteration_abc.py +0 -0
  484. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_layered_config.py +0 -0
  485. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_math_image_render.py +0 -0
  486. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_mcp_schema.py +0 -0
  487. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_mermaid_render.py +0 -0
  488. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_middleware_async.py +0 -0
  489. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_model_dialogs.py +0 -0
  490. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_model_providers.py +0 -0
  491. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_model_request_compression_middleware.py +0 -0
  492. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_model_retry.py +0 -0
  493. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_models_persist.py +0 -0
  494. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_multimodal.py +0 -0
  495. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_native_math_render.py +0 -0
  496. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_openai_compat_reasoning.py +0 -0
  497. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_openai_oauth.py +0 -0
  498. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_openai_oauth_middleware.py +0 -0
  499. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_openai_usage.py +0 -0
  500. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_openai_websocket.py +0 -0
  501. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_pathing.py +0 -0
  502. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_project_catalog.py +0 -0
  503. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_project_drawer.py +0 -0
  504. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_project_runtime.py +0 -0
  505. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_project_switch.py +0 -0
  506. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_prompt_controller.py +0 -0
  507. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_prompts.py +0 -0
  508. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_runtime_hardening.py +0 -0
  509. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_runtime_manager.py +0 -0
  510. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_runtime_streaming.py +0 -0
  511. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_safety.py +0 -0
  512. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_search_index.py +0 -0
  513. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_session_prewarm.py +0 -0
  514. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_session_runtime.py +0 -0
  515. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_session_store.py +0 -0
  516. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_session_summary.py +0 -0
  517. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_slash_and_mcp.py +0 -0
  518. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_slash_complete.py +0 -0
  519. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_slash_effects.py +0 -0
  520. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_startup_defer.py +0 -0
  521. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_startup_trace.py +0 -0
  522. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_steer.py +0 -0
  523. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_steer_controller.py +0 -0
  524. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_stream_cancel.py +0 -0
  525. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_stream_semantic_fixtures.py +0 -0
  526. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_stream_tool_items.py +0 -0
  527. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_stream_ui.py +0 -0
  528. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_subagent_config_dialog.py +0 -0
  529. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_subagent_config_persist.py +0 -0
  530. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_subagent_status.py +0 -0
  531. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_subagents.py +0 -0
  532. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_textual_stream_sink.py +0 -0
  533. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_theme.py +0 -0
  534. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_theme_controller.py +0 -0
  535. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_timeline.py +0 -0
  536. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_token_rate.py +0 -0
  537. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_blocks.py +0 -0
  538. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_ignore.py +0 -0
  539. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_intent.py +0 -0
  540. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_output.py +0 -0
  541. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_output_eval.py +0 -0
  542. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_output_slash.py +0 -0
  543. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_output_usage_middleware.py +0 -0
  544. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tool_response_truncate_middleware.py +0 -0
  545. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_topbar_context_ratio.py +0 -0
  546. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_topbar_registry.py +0 -0
  547. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript.py +0 -0
  548. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript_controller.py +0 -0
  549. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript_history.py +0 -0
  550. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript_history_controller.py +0 -0
  551. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript_migration.py +0 -0
  552. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_transcript_projection.py +0 -0
  553. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tui_active_session_switcher.py +0 -0
  554. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tui_codex_import.py +0 -0
  555. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tui_paste.py +0 -0
  556. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_tui_selection.py +0 -0
  557. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_turn_controller.py +0 -0
  558. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_turn_event_renderer.py +0 -0
  559. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_turn_rail_minimap.py +0 -0
  560. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_turn_request.py +0 -0
  561. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_usage_restore.py +0 -0
  562. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_user_turn_style.py +0 -0
  563. {synapse_cli_agent-0.1.35 → synapse_cli_agent-0.1.37}/tests/test_welcome.py +0 -0
  564. {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/` | Optional native tool-output compression 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
- Two optional crates; the Python app must work without their wheels and must keep `ImportError`/`OSError` fallbacks.
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`: native tool-output compression core. Release with tag `synapse-tool-compress-core-v*`; `native-compression-wheels.yml` publishes wheels to GitHub Release.
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.35
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.35"
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
+ ---
@@ -507,7 +507,7 @@ dependencies = [
507
507
 
508
508
  [[package]]
509
509
  name = "synapse-tool-compress-core"
510
- version = "0.1.2"
510
+ version = "0.1.3"
511
511
  dependencies = [
512
512
  "aho-corasick",
513
513
  "dashmap",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "synapse-tool-compress-core"
3
- version = "0.1.2"
3
+ version = "0.1.3"
4
4
  edition = "2021"
5
5
  rust-version = "1.80"
6
6
  license = "Apache-2.0"
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "synapse-tool-compress-core"
7
- version = "0.1.2"
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
  )