synapse-cli-agent 0.1.43__tar.gz → 0.1.44__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 (577) hide show
  1. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/.gitignore +5 -0
  2. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/CHANGELOG.md +19 -0
  3. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/PKG-INFO +1 -1
  4. synapse_cli_agent-0.1.44/bucket/synapse.json +29 -0
  5. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/pyproject.toml +1 -1
  6. synapse_cli_agent-0.1.44/release_body.md +18 -0
  7. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/slash_complete.py +5 -6
  8. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/backends.py +28 -3
  9. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/chrome/controller.py +7 -0
  10. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/components/branch.py +24 -1
  11. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/components/workspace.py +20 -1
  12. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/core.py +243 -4
  13. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/tui.py +4 -0
  14. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_backends.py +74 -0
  15. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_slash_complete.py +10 -1
  16. synapse_cli_agent-0.1.44/tests/test_startup_defer.py +73 -0
  17. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/uv.lock +1 -1
  18. synapse_cli_agent-0.1.43/bucket/synapse.json +0 -21
  19. synapse_cli_agent-0.1.43/release_body.md +0 -12
  20. synapse_cli_agent-0.1.43/tests/test_startup_defer.py +0 -40
  21. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/.dockerignore +0 -0
  22. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/.github/workflows/ci.yml +0 -0
  23. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/.github/workflows/docs.yml +0 -0
  24. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/.github/workflows/native-compression-wheels.yml +0 -0
  25. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/.github/workflows/native-core-tool-wheels.yml +0 -0
  26. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/.github/workflows/release.yml +0 -0
  27. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/.python-version +0 -0
  28. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/.readthedocs.yaml +0 -0
  29. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/.zed/settings.json +0 -0
  30. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/AGENTS.md +0 -0
  31. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/Dockerfile.web +0 -0
  32. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/LICENSE +0 -0
  33. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/README.md +0 -0
  34. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/README.zh-CN.md +0 -0
  35. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/agent_upstream.txt +0 -0
  36. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/approval-behavior.md +0 -0
  37. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/assets/demo.gif +0 -0
  38. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/assets/synapse-logo.svg +0 -0
  39. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/assets/tui-preview.png +0 -0
  40. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/cli_upstream.txt +0 -0
  41. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/debug_compact.py +0 -0
  42. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/decode_screenshot.py +0 -0
  43. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/capability-matrix.md +0 -0
  44. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/decisions.md +0 -0
  45. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/index.md +0 -0
  46. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/phase-0-protocol-baseline.md +0 -0
  47. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/phase-1-core-transport.md +0 -0
  48. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/phase-2-prompt-semantics.md +0 -0
  49. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/phase-3-permissions.md +0 -0
  50. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/phase-4-session-lifecycle.md +0 -0
  51. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/phase-5-session-mcp.md +0 -0
  52. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/phase-6-client-services.md +0 -0
  53. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/phase-7-advanced-capabilities.md +0 -0
  54. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/phase-8-compliance.md +0 -0
  55. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/acp-adapter/progress.md +0 -0
  56. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-development-guide.md +0 -0
  57. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/baseline-report.md +0 -0
  58. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/decisions.md +0 -0
  59. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/index.md +0 -0
  60. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/migration.md +0 -0
  61. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/phase-0-baseline.md +0 -0
  62. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/phase-1-streaming-core.md +0 -0
  63. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/phase-2-turn-runtime.md +0 -0
  64. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/phase-3-tui-cutover.md +0 -0
  65. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/phase-4-session-runtime.md +0 -0
  66. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/phase-5-multi-session.md +0 -0
  67. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/phase-6-project-runtime.md +0 -0
  68. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/phase-7-global-control-plane.md +0 -0
  69. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/phase-8-hardening.md +0 -0
  70. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/post-review-fix-plan.md +0 -0
  71. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/agent-runtime-decoupling/progress.md +0 -0
  72. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/architecture-flow.md +0 -0
  73. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/architecture.md +0 -0
  74. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/cli.md +0 -0
  75. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/codex-session-discovery-phase-1.md +0 -0
  76. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/codex-session-import-phase-2.md +0 -0
  77. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/config.md +0 -0
  78. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/design.md +0 -0
  79. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/docker-web.md +0 -0
  80. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/index.md +0 -0
  81. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/install.md +0 -0
  82. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/math-formulas-test.md +0 -0
  83. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/mcp.md +0 -0
  84. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/models.md +0 -0
  85. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/native-compression-core.md +0 -0
  86. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/native-core-tool.md +0 -0
  87. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/permissions.md +0 -0
  88. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/quickstart.md +0 -0
  89. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/sessions.md +0 -0
  90. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/skills.md +0 -0
  91. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/smith_output.md +0 -0
  92. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/subagents.md +0 -0
  93. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/tool-output-transform.md +0 -0
  94. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/tui-cursor-refactor.md +0 -0
  95. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/tutorial.md +0 -0
  96. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/docs/x-agent-development-guide.md +0 -0
  97. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/examples/mcp.example.json +0 -0
  98. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/examples/models.example.json +0 -0
  99. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/examples/settings.example.json +0 -0
  100. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/middleware_upstream.txt +0 -0
  101. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/mkdocs.yml +0 -0
  102. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/Cargo.lock +0 -0
  103. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/Cargo.toml +0 -0
  104. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/LICENSE +0 -0
  105. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/NOTICE +0 -0
  106. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/README.md +0 -0
  107. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/pyproject.toml +0 -0
  108. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/python/synapse_core_tool/__init__.py +0 -0
  109. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/src/file_access.rs +0 -0
  110. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/src/file_tools.rs +0 -0
  111. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/src/lib.rs +0 -0
  112. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/src/llm.rs +0 -0
  113. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/src/math_render.rs +0 -0
  114. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/src/search.rs +0 -0
  115. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-core-tool/uv.lock +0 -0
  116. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/Cargo.lock +0 -0
  117. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/Cargo.toml +0 -0
  118. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/LICENSE +0 -0
  119. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/NOTICE +0 -0
  120. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/README.md +0 -0
  121. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/pyproject.toml +0 -0
  122. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/python/synapse_tool_compress_core/__init__.py +0 -0
  123. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/ccr.rs +0 -0
  124. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/ccr_in_memory.rs +0 -0
  125. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/mod.rs +0 -0
  126. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/relevance/base.rs +0 -0
  127. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/relevance/bm25.rs +0 -0
  128. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/signals/keyword_detector.rs +0 -0
  129. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/signals/line_importance.rs +0 -0
  130. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/adaptive_sizer.rs +0 -0
  131. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/anchor_selector.rs +0 -0
  132. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/code_compressor.rs +0 -0
  133. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/diff_compressor.rs +0 -0
  134. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/log_compressor.rs +0 -0
  135. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/search_compressor.rs +0 -0
  136. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/analyzer.rs +0 -0
  137. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/anchors.rs +0 -0
  138. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/builder.rs +0 -0
  139. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/classifier.rs +0 -0
  140. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/classifier.rs +0 -0
  141. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/compactor.rs +0 -0
  142. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/formatter.rs +0 -0
  143. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/ir.rs +0 -0
  144. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/mod.rs +0 -0
  145. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/walker.rs +0 -0
  146. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/config.rs +0 -0
  147. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/constraints.rs +0 -0
  148. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crusher.rs +0 -0
  149. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crushers.rs +0 -0
  150. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/error_keywords.rs +0 -0
  151. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/field_detect.rs +0 -0
  152. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/hashing.rs +0 -0
  153. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/mod.rs +0 -0
  154. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/observer.rs +0 -0
  155. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/orchestration.rs +0 -0
  156. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/outliers.rs +0 -0
  157. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/planning.rs +0 -0
  158. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/statistics.rs +0 -0
  159. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/stats_math.rs +0 -0
  160. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/traits.rs +0 -0
  161. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/types.rs +0 -0
  162. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/rust/synapse-tool-compress-core/src/lib.rs +0 -0
  163. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/scripts/build_check_rust_openai.py +0 -0
  164. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/scripts/install.ps1 +0 -0
  165. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/scripts/release.ps1 +0 -0
  166. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/scripts/serve_web.py +0 -0
  167. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/slash_cmds_upstream.txt +0 -0
  168. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/__init__.py +0 -0
  169. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/__main__.py +0 -0
  170. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/__init__.py +0 -0
  171. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/agent.py +0 -0
  172. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/client_services.py +0 -0
  173. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/content.py +0 -0
  174. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/events.py +0 -0
  175. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/lifecycle.py +0 -0
  176. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/mcp.py +0 -0
  177. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/permissions.py +0 -0
  178. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/server.py +0 -0
  179. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/sessions.py +0 -0
  180. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/acp/updates.py +0 -0
  181. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/app/__init__.py +0 -0
  182. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/app/agent.py +0 -0
  183. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/app/agent_assembly.py +0 -0
  184. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/app/agent_md.py +0 -0
  185. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/cli.py +0 -0
  186. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/__init__.py +0 -0
  187. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/compression.py +0 -0
  188. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/goal.py +0 -0
  189. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/helpers.py +0 -0
  190. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/mcp.py +0 -0
  191. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/model.py +0 -0
  192. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/result.py +0 -0
  193. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/sessions.py +0 -0
  194. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/slash_cmds.py +0 -0
  195. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/commands/theme.py +0 -0
  196. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/config.py +0 -0
  197. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/content/__init__.py +0 -0
  198. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/content/input_history.py +0 -0
  199. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/content/multimodal.py +0 -0
  200. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/content/prompts.py +0 -0
  201. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/content/skills_catalog.py +0 -0
  202. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/entry.py +0 -0
  203. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/goals/__init__.py +0 -0
  204. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/goals/middleware.py +0 -0
  205. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/goals/model.py +0 -0
  206. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/goals/runtime.py +0 -0
  207. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/goals/steering.py +0 -0
  208. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/goals/store.py +0 -0
  209. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/goals/tools.py +0 -0
  210. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/__init__.py +0 -0
  211. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/checkpoint_seed.py +0 -0
  212. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/codex_config.py +0 -0
  213. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/codex_history.py +0 -0
  214. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/codex_import.py +0 -0
  215. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/codex_sessions.py +0 -0
  216. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/describe_image.py +0 -0
  217. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/herdr.py +0 -0
  218. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/http_clients.py +0 -0
  219. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/llm_openai_compat.py +0 -0
  220. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/llm_openai_websocket.py +0 -0
  221. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/mcp_client.py +0 -0
  222. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/openai_oauth.py +0 -0
  223. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/openai_oauth_middleware.py +0 -0
  224. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/openai_usage.py +0 -0
  225. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/turbo.py +0 -0
  226. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/integrations/vision_middleware.py +0 -0
  227. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/memory/__init__.py +0 -0
  228. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/memory/auto_recorder.py +0 -0
  229. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/memory/embedder.py +0 -0
  230. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/memory/long_term.py +0 -0
  231. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/models/__init__.py +0 -0
  232. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/models/config.py +0 -0
  233. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/models/helpers.py +0 -0
  234. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/models/persist.py +0 -0
  235. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/models/profile.py +0 -0
  236. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/models/providers.py +0 -0
  237. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/models/registry.py +0 -0
  238. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/models/rust_openai.py +0 -0
  239. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/models_registry.py +0 -0
  240. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/observability/__init__.py +0 -0
  241. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/observability/debug_inspector.html +0 -0
  242. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/observability/debug_server.py +0 -0
  243. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/observability/exit_trace.py +0 -0
  244. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/observability/heap_dump.py +0 -0
  245. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/observability/llm_debug.py +0 -0
  246. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/observability/startup_trace.py +0 -0
  247. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/planner/__init__.py +0 -0
  248. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/planner/task_planner.py +0 -0
  249. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/projects/__init__.py +0 -0
  250. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/projects/catalog.py +0 -0
  251. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/rag/__init__.py +0 -0
  252. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/rag/knowledge_base.py +0 -0
  253. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/__init__.py +0 -0
  254. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/agent_loop/__init__.py +0 -0
  255. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/agent_loop/model.py +0 -0
  256. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/agent_loop/request.py +0 -0
  257. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/agent_loop/turn.py +0 -0
  258. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/async_runtime.py +0 -0
  259. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/cancellation.py +0 -0
  260. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/context_compact.py +0 -0
  261. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/debug_capture_middleware.py +0 -0
  262. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/execute_capture.py +0 -0
  263. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/filesystem_tool_prompt_middleware.py +0 -0
  264. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/fs_permissions.py +0 -0
  265. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/harness.py +0 -0
  266. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/hitl.py +0 -0
  267. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/interaction_ledger.py +0 -0
  268. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/middleware.py +0 -0
  269. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/model_request_compression_middleware.py +0 -0
  270. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/pathing.py +0 -0
  271. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/projects/__init__.py +0 -0
  272. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/projects/identity.py +0 -0
  273. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/projects/runtime.py +0 -0
  274. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/safety.py +0 -0
  275. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/session_header_middleware.py +0 -0
  276. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/session_headers.py +0 -0
  277. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/session_prewarm.py +0 -0
  278. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/sessions/__init__.py +0 -0
  279. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/sessions/events.py +0 -0
  280. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/sessions/manager.py +0 -0
  281. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/sessions/persistence.py +0 -0
  282. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/sessions/ref.py +0 -0
  283. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/sessions/runtime.py +0 -0
  284. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/steer.py +0 -0
  285. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/streaming/__init__.py +0 -0
  286. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/streaming/accumulator.py +0 -0
  287. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/streaming/adapters.py +0 -0
  288. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/streaming/events.py +0 -0
  289. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/streaming/parser.py +0 -0
  290. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/streaming/protocol.py +0 -0
  291. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/streaming/runtime.py +0 -0
  292. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/streaming/stream_events.py +0 -0
  293. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/streaming/tool_model.py +0 -0
  294. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/subagent_config_persist.py +0 -0
  295. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/subagent_specs.py +0 -0
  296. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/subagents.py +0 -0
  297. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/timeline.py +0 -0
  298. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/token_rate.py +0 -0
  299. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/tool_ignore.py +0 -0
  300. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/tool_output_eval.py +0 -0
  301. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/tool_output_middleware.py +0 -0
  302. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/runtime/tool_output_usage_middleware.py +0 -0
  303. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/sessions/__init__.py +0 -0
  304. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/sessions/cancel_repair.py +0 -0
  305. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/sessions/search_index.py +0 -0
  306. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/sessions/store.py +0 -0
  307. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/sessions/summary.py +0 -0
  308. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/sessions/transcript.py +0 -0
  309. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/sessions/transcript_migration.py +0 -0
  310. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/sessions/transcript_projection.py +0 -0
  311. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/settings/__init__.py +0 -0
  312. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/settings/config_paths.py +0 -0
  313. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/settings/schema.py +0 -0
  314. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/subagents.py +0 -0
  315. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tool_output/__init__.py +0 -0
  316. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tool_output/detection.py +0 -0
  317. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tool_output/metrics.py +0 -0
  318. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tool_output/models.py +0 -0
  319. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tool_output/pipeline.py +0 -0
  320. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tool_output/repository.py +0 -0
  321. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tool_output/transformers.py +0 -0
  322. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tools/__init__.py +0 -0
  323. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tools/describe_image.py +0 -0
  324. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tools/filesystem_patch.py +0 -0
  325. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tools/filesystem_search.py +0 -0
  326. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/tools/session_tools.py +0 -0
  327. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/__init__.py +0 -0
  328. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/agent_lifecycle.py +0 -0
  329. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/answer_divider.py +0 -0
  330. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/approval.py +0 -0
  331. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/__init__.py +0 -0
  332. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/__init__.py +0 -0
  333. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/codex_usage.py +0 -0
  334. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/fast.py +0 -0
  335. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/goal.py +0 -0
  336. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/key_hints.py +0 -0
  337. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/mcp.py +0 -0
  338. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/mode.py +0 -0
  339. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/model.py +0 -0
  340. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/thread.py +0 -0
  341. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/turbo.py +0 -0
  342. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/components/turn_stats.py +0 -0
  343. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/context.py +0 -0
  344. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/bottombar/core.py +0 -0
  345. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/chrome/__init__.py +0 -0
  346. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/clipboard.py +0 -0
  347. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/__init__.py +0 -0
  348. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/active_session_switcher.py +0 -0
  349. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/base.py +0 -0
  350. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/codex_config_import.py +0 -0
  351. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/codex_reset.py +0 -0
  352. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/codex_session_list.py +0 -0
  353. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/compression_diagnostics.py +0 -0
  354. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/controller.py +0 -0
  355. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/git_explore.py +0 -0
  356. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/mcp_panel.py +0 -0
  357. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/model_form.py +0 -0
  358. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/model_manager.py +0 -0
  359. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/model_picker.py +0 -0
  360. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/provider_catalog.py +0 -0
  361. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/safety_panel.py +0 -0
  362. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/session_list.py +0 -0
  363. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/subagent_config.py +0 -0
  364. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/theme_designer.py +0 -0
  365. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/dialogs/theme_picker.py +0 -0
  366. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/drawer.py +0 -0
  367. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/formatters.py +0 -0
  368. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/git_explore/__init__.py +0 -0
  369. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/git_explore/engine.py +0 -0
  370. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/git_explore/provider.py +0 -0
  371. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/git_explore/unified.py +0 -0
  372. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/image_preview.py +0 -0
  373. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/image_render.py +0 -0
  374. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/image_viewer.py +0 -0
  375. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/math_image.py +0 -0
  376. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/mermaid_image.py +0 -0
  377. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/prompt_controller.py +0 -0
  378. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/rendering.py +0 -0
  379. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/selectable_static.py +0 -0
  380. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/selectable_text.py +0 -0
  381. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/sink.py +0 -0
  382. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/status_controller.py +0 -0
  383. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/steer_controller.py +0 -0
  384. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/steer_widget.py +0 -0
  385. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/stream.py +0 -0
  386. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/stream_events.py +0 -0
  387. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/stream_runtime.py +0 -0
  388. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/textual_lifecycle.py +0 -0
  389. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/textual_stream_sink.py +0 -0
  390. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/theme.py +0 -0
  391. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/theme_controller.py +0 -0
  392. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/timeline.py +0 -0
  393. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/tool_blocks.py +0 -0
  394. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/__init__.py +0 -0
  395. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/components/__init__.py +0 -0
  396. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/components/title.py +0 -0
  397. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/components/tool_output.py +0 -0
  398. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/components/usage.py +0 -0
  399. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/context.py +0 -0
  400. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/git_changes_popover.py +0 -0
  401. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/git_chrome.py +0 -0
  402. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/tool_output_popover.py +0 -0
  403. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/topbar/widget.py +0 -0
  404. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/transcript/__init__.py +0 -0
  405. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/transcript/controller.py +0 -0
  406. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/transcript/factory.py +0 -0
  407. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/transcript/history.py +0 -0
  408. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/transcript/state.py +0 -0
  409. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/transcript_blocks.py +0 -0
  410. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/tui_launch.py +0 -0
  411. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/tui_styles.py +0 -0
  412. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/turn/__init__.py +0 -0
  413. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/turn/controller.py +0 -0
  414. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/turn/event_bridge.py +0 -0
  415. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/turn/event_renderer.py +0 -0
  416. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/turn/persistence.py +0 -0
  417. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/turn/request.py +0 -0
  418. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/turn_rail.py +0 -0
  419. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/turn_rail_widgets.py +0 -0
  420. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/user_turn.py +0 -0
  421. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/user_turn_block.py +0 -0
  422. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/welcome.py +0 -0
  423. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/ui/workspace.py +0 -0
  424. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/src/synapse/web.py +0 -0
  425. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/synapse.cmd +0 -0
  426. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/__init__.py +0 -0
  427. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/acp/initialize.jsonl +0 -0
  428. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/agent_stream/core_scenarios.json +0 -0
  429. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/codex_rollouts/duplicate_response_item.jsonl +0 -0
  430. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/codex_rollouts/incomplete_and_aborted.jsonl +0 -0
  431. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/codex_rollouts/legacy_compaction.jsonl +0 -0
  432. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/codex_rollouts/normal_completed.jsonl +0 -0
  433. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/codex_rollouts/replacement_history.jsonl +0 -0
  434. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/codex_rollouts/rollback.jsonl +0 -0
  435. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/codex_rollouts/unsupported_replacement.jsonl +0 -0
  436. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/sample_repo/calculator.py +0 -0
  437. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/sample_repo/test_calculator.py +0 -0
  438. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/fixtures/tool_output_eval.json +0 -0
  439. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test.py +0 -0
  440. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p0_baseline.py +0 -0
  441. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p1_core.py +0 -0
  442. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p1_transport.py +0 -0
  443. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p2_content.py +0 -0
  444. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p2_events.py +0 -0
  445. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p2_updates.py +0 -0
  446. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p3_agent.py +0 -0
  447. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p3_permissions.py +0 -0
  448. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p4_history.py +0 -0
  449. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p4_lifecycle.py +0 -0
  450. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p5_mcp.py +0 -0
  451. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p6_client_services.py +0 -0
  452. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_acp_p8_compliance.py +0 -0
  453. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_agent_factory.py +0 -0
  454. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_agent_lifecycle.py +0 -0
  455. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_agent_turn_runtime.py +0 -0
  456. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_approval.py +0 -0
  457. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_async_checkpointer.py +0 -0
  458. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_bottombar_registry.py +0 -0
  459. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_cancel_repair.py +0 -0
  460. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_capabilities.py +0 -0
  461. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_checkpoint_seed.py +0 -0
  462. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_chrome_controller.py +0 -0
  463. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_cli.py +0 -0
  464. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_cli_codex_import.py +0 -0
  465. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_clipboard.py +0 -0
  466. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_codex_config.py +0 -0
  467. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_codex_history.py +0 -0
  468. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_codex_import.py +0 -0
  469. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_codex_sessions.py +0 -0
  470. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_codex_sessions_windows.py +0 -0
  471. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_compact_tool_descriptions.py +0 -0
  472. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_config.py +0 -0
  473. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_context_compact.py +0 -0
  474. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_context_window.py +0 -0
  475. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_debug_capture_middleware.py +0 -0
  476. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_debug_inspector.py +0 -0
  477. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_describe_image.py +0 -0
  478. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_dialogs.py +0 -0
  479. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_entry.py +0 -0
  480. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_filesystem_patch_tool.py +0 -0
  481. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_filesystem_search_tools.py +0 -0
  482. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_git_changes_popover.py +0 -0
  483. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_git_chrome.py +0 -0
  484. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_git_explore.py +0 -0
  485. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_goal_live_tui.py +0 -0
  486. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_goals.py +0 -0
  487. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_heap_dump.py +0 -0
  488. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_herdr_integration.py +0 -0
  489. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_http_clients.py +0 -0
  490. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_image_render.py +0 -0
  491. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_image_viewer.py +0 -0
  492. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_input_history.py +0 -0
  493. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_iteration_abc.py +0 -0
  494. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_layered_config.py +0 -0
  495. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_markdown_image.py +0 -0
  496. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_math_image_render.py +0 -0
  497. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_mcp_schema.py +0 -0
  498. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_mermaid_image.py +0 -0
  499. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_mermaid_render.py +0 -0
  500. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_middleware_async.py +0 -0
  501. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_model_dialogs.py +0 -0
  502. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_model_providers.py +0 -0
  503. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_model_request_compression_middleware.py +0 -0
  504. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_model_retry.py +0 -0
  505. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_models_persist.py +0 -0
  506. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_multimodal.py +0 -0
  507. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_native_math_render.py +0 -0
  508. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_openai_compat_reasoning.py +0 -0
  509. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_openai_oauth.py +0 -0
  510. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_openai_oauth_middleware.py +0 -0
  511. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_openai_usage.py +0 -0
  512. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_openai_websocket.py +0 -0
  513. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_pathing.py +0 -0
  514. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_project_catalog.py +0 -0
  515. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_project_drawer.py +0 -0
  516. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_project_runtime.py +0 -0
  517. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_project_switch.py +0 -0
  518. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_prompt_controller.py +0 -0
  519. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_prompts.py +0 -0
  520. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_runtime_hardening.py +0 -0
  521. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_runtime_manager.py +0 -0
  522. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_runtime_streaming.py +0 -0
  523. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_rust_openai_model.py +0 -0
  524. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_safety.py +0 -0
  525. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_search_index.py +0 -0
  526. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_session_headers.py +0 -0
  527. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_session_persistence.py +0 -0
  528. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_session_prewarm.py +0 -0
  529. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_session_runtime.py +0 -0
  530. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_session_store.py +0 -0
  531. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_session_summary.py +0 -0
  532. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_slash_and_mcp.py +0 -0
  533. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_slash_effects.py +0 -0
  534. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_startup_trace.py +0 -0
  535. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_status_controller.py +0 -0
  536. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_steer.py +0 -0
  537. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_steer_controller.py +0 -0
  538. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_stream_cancel.py +0 -0
  539. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_stream_semantic_fixtures.py +0 -0
  540. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_stream_tool_items.py +0 -0
  541. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_stream_ui.py +0 -0
  542. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_subagent_config_dialog.py +0 -0
  543. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_subagent_config_persist.py +0 -0
  544. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_subagent_status.py +0 -0
  545. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_subagents.py +0 -0
  546. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_textual_stream_sink.py +0 -0
  547. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_theme.py +0 -0
  548. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_theme_controller.py +0 -0
  549. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_timeline.py +0 -0
  550. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_token_rate.py +0 -0
  551. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tool_blocks.py +0 -0
  552. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tool_ignore.py +0 -0
  553. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tool_intent.py +0 -0
  554. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tool_output.py +0 -0
  555. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tool_output_eval.py +0 -0
  556. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tool_output_slash.py +0 -0
  557. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tool_output_usage_middleware.py +0 -0
  558. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_topbar_context_ratio.py +0 -0
  559. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_topbar_registry.py +0 -0
  560. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_transcript.py +0 -0
  561. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_transcript_controller.py +0 -0
  562. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_transcript_history.py +0 -0
  563. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_transcript_history_controller.py +0 -0
  564. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_transcript_migration.py +0 -0
  565. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_transcript_projection.py +0 -0
  566. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tui_active_session_switcher.py +0 -0
  567. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tui_codex_import.py +0 -0
  568. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tui_paste.py +0 -0
  569. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_tui_selection.py +0 -0
  570. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_turn_controller.py +0 -0
  571. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_turn_event_renderer.py +0 -0
  572. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_turn_rail_minimap.py +0 -0
  573. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_turn_request.py +0 -0
  574. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_usage_restore.py +0 -0
  575. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_user_turn_style.py +0 -0
  576. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/test_welcome.py +0 -0
  577. {synapse_cli_agent-0.1.43 → synapse_cli_agent-0.1.44}/tests/tool_output_plugin_fixture.py +0 -0
@@ -35,6 +35,11 @@ conversation_history/
35
35
  /ear-anatomy-exploded.html
36
36
  /ear-models/
37
37
 
38
+ # Local scratch output (untracked scratch files)
39
+ /article-translation/
40
+ /article_ltt.html
41
+ /twitter-replica/
42
+
38
43
  # IDE
39
44
  .idea/
40
45
  .vscode/
@@ -8,6 +8,25 @@ All entries are written in English.
8
8
 
9
9
  ---
10
10
 
11
+ ## v0.1.44
12
+
13
+ ### New Features
14
+
15
+ - Centered the topbar title and elided topbar components by width.
16
+
17
+ ### Bug Fixes
18
+
19
+ - Slash path completion now stops once whitespace follows the active `@` token, avoiding spurious path suggestions mid-line.
20
+ - Reworked process-tree termination: on Windows the runtime falls back to `proc.kill()` when `taskkill` fails, and on Unix it kills the whole process group so descendants cannot survive. Commands are also detached from the TUI's controlling terminal (`start_new_session` on Unix, `CREATE_NO_WINDOW` on Windows) so non-interactive tools such as `ssh` cannot block on a hidden console.
21
+ - Re-probe git chrome after mount to retry transient probe failures.
22
+
23
+ ### Engineering
24
+
25
+ - Ignored local scratch output files.
26
+ - Updated the Scoop manifest.
27
+
28
+ ---
29
+
11
30
  ## v0.1.43
12
31
 
13
32
  ### New Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: synapse-cli-agent
3
- Version: 0.1.43
3
+ Version: 0.1.44
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
@@ -0,0 +1,29 @@
1
+ {
2
+ "version": "0.1.43",
3
+ "description": "Local coding agent built on LangChain Deep Agents (LocalShell, no sandbox)",
4
+ "homepage": "https://github.com/alex8224/synapse-agent",
5
+ "license": "Apache-2.0",
6
+ "bin": [
7
+ ["synapse-windows-x64.exe", "synapse"]
8
+ ],
9
+ "checkver": {
10
+ "github": "https://github.com/alex8224/synapse-agent"
11
+ },
12
+ "architecture": {
13
+ "64bit": {
14
+ "url": "https://github.com/alex8224/synapse-agent/releases/download/v0.1.43/synapse-windows-x64.exe",
15
+ "hash": "c1fcc815af508e1051440dd944dc735ce1102e98b71e4cea40f3cdd31bababd3"
16
+ }
17
+ },
18
+ "autoupdate": {
19
+ "architecture": {
20
+ "64bit": {
21
+ "url": "https://github.com/alex8224/synapse-agent/releases/download/v$version/synapse-windows-x64.exe",
22
+ "hash": {
23
+ "url": "$baseurl/synapse-windows-x64.exe.sha256",
24
+ "mode": "extract"
25
+ }
26
+ }
27
+ }
28
+ }
29
+ }
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synapse-cli-agent"
3
- version = "0.1.43"
3
+ version = "0.1.44"
4
4
  description = "Local coding agent built on LangChain Deep Agents (LocalShell, no sandbox)"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -0,0 +1,18 @@
1
+ ## v0.1.44
2
+
3
+ ### New Features
4
+
5
+ - Centered the topbar title and elided topbar components by width.
6
+
7
+ ### Bug Fixes
8
+
9
+ - Slash path completion now stops once whitespace follows the active `@` token, avoiding spurious path suggestions mid-line.
10
+ - Reworked process-tree termination: on Windows the runtime falls back to `proc.kill()` when `taskkill` fails, and on Unix it kills the whole process group so descendants cannot survive. Commands are also detached from the TUI's controlling terminal (`start_new_session` on Unix, `CREATE_NO_WINDOW` on Windows) so non-interactive tools such as `ssh` cannot block on a hidden console.
11
+ - Re-probe git chrome after mount to retry transient probe failures.
12
+
13
+ ### Engineering
14
+
15
+ - Ignored local scratch output files.
16
+ - Updated the Scoop manifest.
17
+
18
+ ---
@@ -583,17 +583,16 @@ def _find_at(value: str) -> tuple[int, str] | None:
583
583
  """Find the last ``@`` and extract the path token after it.
584
584
 
585
585
  Returns ``(at_index, path_prefix)``, e.g. for ``"cat @src/main"``
586
- returns ``(4, "src/main")``. Returns ``None`` when there is no ``@``.
586
+ returns ``(4, "src/main")``. Returns ``None`` when there is no ``@`` or
587
+ whitespace after the active ``@`` token has ended path completion.
587
588
  """
588
589
  idx = value.rfind("@")
589
590
  if idx < 0:
590
591
  return None
591
- # Everything after @ until end or next whitespace.
592
592
  rest = value[idx + 1 :]
593
- # Split on whitespace to get the path token.
594
- parts = rest.split(maxsplit=1)
595
- token = parts[0] if parts else ""
596
- return idx, token
593
+ if any(char.isspace() for char in rest):
594
+ return None
595
+ return idx, rest
597
596
 
598
597
 
599
598
  def _at_path_prefix(token: str) -> str:
@@ -16,6 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import os
18
18
  import shutil
19
+ import signal
19
20
  import subprocess
20
21
  import sys
21
22
  from pathlib import Path
@@ -121,20 +122,36 @@ def _kill_process_tree(proc: subprocess.Popen[Any] | None) -> None:
121
122
  if pid is None:
122
123
  return
123
124
  if os.name == "nt":
125
+ taskkill_succeeded = False
124
126
  try:
125
- subprocess.run(
127
+ completed = subprocess.run(
126
128
  ["taskkill", "/T", "/F", "/PID", str(pid)],
129
+ stdin=subprocess.DEVNULL,
127
130
  capture_output=True,
128
131
  timeout=10,
129
132
  check=False,
130
133
  )
134
+ taskkill_succeeded = completed.returncode == 0
131
135
  except Exception: # noqa: BLE001
132
136
  pass
137
+ if not taskkill_succeeded:
138
+ try:
139
+ proc.kill()
140
+ except Exception: # noqa: BLE001
141
+ pass
133
142
  else:
134
143
  try:
135
- proc.kill()
136
- except Exception: # noqa: BLE001
144
+ # execute starts each command in a new session, whose process-group
145
+ # ID is the shell PID. Kill the group so descendants cannot survive
146
+ # while retaining stdout/stderr pipe handles.
147
+ os.killpg(pid, signal.SIGKILL)
148
+ except ProcessLookupError:
137
149
  pass
150
+ except Exception: # noqa: BLE001
151
+ try:
152
+ proc.kill()
153
+ except Exception: # noqa: BLE001
154
+ pass
138
155
  # Drain pipes with a short timeout so we don't hang forever if child
139
156
  # processes still hold them open.
140
157
  try:
@@ -426,6 +443,14 @@ class CodingLocalShellBackend(LocalShellBackend):
426
443
  "env": self._env,
427
444
  "cwd": str(self.cwd),
428
445
  }
446
+ if os.name == "nt":
447
+ # execute is non-interactive. Do not let commands such as ssh attach
448
+ # to the TUI console and wait for credentials outside captured stdin.
449
+ run_kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
450
+ else:
451
+ # Detach from the TUI's controlling terminal. Programs that bypass
452
+ # stdin and open /dev/tty then fail instead of blocking invisibly.
453
+ run_kwargs["start_new_session"] = True
429
454
  if executable:
430
455
  run_kwargs["executable"] = executable
431
456
 
@@ -656,6 +656,12 @@ class ChromeController:
656
656
  "min_width": 0,
657
657
  "priority": 40,
658
658
  "gap_after": gap,
659
+ # Fallback cap only: keep the left chrome (workspace + branch +
660
+ # diff stats like "6f +314 -13") fully visible for normal
661
+ # projects, and reserve room for the centered title on wide
662
+ # terminals. A very long branch/workspace elides via
663
+ # render_for_width only when it exceeds this fallback.
664
+ "max_width": 80,
659
665
  },
660
666
  "center": {
661
667
  "flex": 1,
@@ -684,6 +690,7 @@ class ChromeController:
684
690
  min_width=int(conf.get("min_width", 0)),
685
691
  priority=int(conf.get("priority", 0)),
686
692
  gap_after=int(conf.get("gap_after", 0)),
693
+ max_width=int(conf.get("max_width", 0)),
687
694
  )
688
695
 
689
696
  def install_default_bottombar(self) -> None:
@@ -5,7 +5,12 @@ from __future__ import annotations
5
5
  from rich.text import Text
6
6
 
7
7
  from synapse.ui.topbar.context import TopBarContext
8
- from synapse.ui.topbar.core import TopBarRegion, TopBarRegistry
8
+ from synapse.ui.topbar.core import (
9
+ TopBarRegion,
10
+ TopBarRegistry,
11
+ display_width,
12
+ truncate_to_width,
13
+ )
9
14
 
10
15
  ID = "branch"
11
16
  REGION = TopBarRegion.LEFT
@@ -31,6 +36,23 @@ def install(registry: TopBarRegistry, ctx: TopBarContext) -> None:
31
36
  mark = (ctx.branch_mark or "").strip()
32
37
  return f"{mark} {name}" if mark else name
33
38
 
39
+ def render_for_width(width: int) -> str | Text:
40
+ """Adapt to available width.
41
+
42
+ Keep the fully styled chrome (name + dirty + diff stats) when it fits;
43
+ otherwise truncate the *prefix* so the meaningful head (branch name and
44
+ the ``…f +n -n`` stats) survives and only the trailing ahead/behind
45
+ indicators are dropped.
46
+ """
47
+ raw = ctx.branch()
48
+ plain = raw.plain if isinstance(raw, Text) else str(raw or "")
49
+ max_w = max(0, int(width))
50
+ if not plain:
51
+ return raw if isinstance(raw, Text) else ""
52
+ if display_width(plain) <= max_w:
53
+ return raw
54
+ return truncate_to_width(plain, max_w)
55
+
34
56
  registry.register_fn(
35
57
  ID,
36
58
  render,
@@ -38,4 +60,5 @@ def install(registry: TopBarRegistry, ctx: TopBarContext) -> None:
38
60
  order=ORDER,
39
61
  priority=PRIORITY,
40
62
  min_width=MIN_WIDTH,
63
+ render_for_width=render_for_width,
41
64
  )
@@ -3,7 +3,12 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from synapse.ui.topbar.context import TopBarContext
6
- from synapse.ui.topbar.core import TopBarRegion, TopBarRegistry
6
+ from synapse.ui.topbar.core import (
7
+ TopBarRegion,
8
+ TopBarRegistry,
9
+ _elide_tail,
10
+ display_width,
11
+ )
7
12
 
8
13
  ID = "workspace"
9
14
  REGION = TopBarRegion.LEFT
@@ -22,6 +27,19 @@ def install(registry: TopBarRegistry, ctx: TopBarContext) -> None:
22
27
  mark = (ctx.workspace_mark or "").strip()
23
28
  return f"{mark} {label}" if mark else label
24
29
 
30
+ def render_for_width(width: int) -> str:
31
+ """Adapt to available width: keep the full label when it fits, otherwise
32
+ elide to the trailing (meaningful) path segment."""
33
+ label = (ctx.workspace() or "").strip()
34
+ if not label:
35
+ return ""
36
+ mark = (ctx.workspace_mark or "").strip()
37
+ head = f"{mark} {label}" if mark else label
38
+ max_w = max(0, int(width))
39
+ if display_width(head) <= max_w:
40
+ return head
41
+ return _elide_tail(head, max_w)
42
+
25
43
  registry.register_fn(
26
44
  ID,
27
45
  render,
@@ -29,4 +47,5 @@ def install(registry: TopBarRegistry, ctx: TopBarContext) -> None:
29
47
  order=ORDER,
30
48
  priority=PRIORITY,
31
49
  min_width=MIN_WIDTH,
50
+ render_for_width=render_for_width,
32
51
  )
@@ -85,6 +85,9 @@ def normalize_region_id(value: TopBarRegion | str | None) -> str:
85
85
 
86
86
 
87
87
  RenderFn = Callable[[], str | Text]
88
+ # Optional width-aware renderer: given the allocated cell width, produce a
89
+ # "keep the meaningful part" representation (elide smartly instead of hard cut).
90
+ WidthRenderFn = Callable[[int], str | Text]
88
91
 
89
92
 
90
93
  @dataclass(slots=True)
@@ -132,6 +135,8 @@ class TopBarComponent:
132
135
  gap_before: str = DEFAULT_REGION_GAP
133
136
  style: str | None = None
134
137
  visible: bool = True
138
+ # Optional width-aware renderer; falls back to ``render`` when absent/errors.
139
+ render_for_width: WidthRenderFn | None = None
135
140
 
136
141
  def content(self) -> str | Text:
137
142
  """Return render output as plain str or styled Rich Text."""
@@ -151,6 +156,18 @@ class TopBarComponent:
151
156
  return raw.plain
152
157
  return raw
153
158
 
159
+ def render_width(self, width: int) -> str | Text:
160
+ """Width-aware render, falling back to ``render`` when unavailable."""
161
+ if self.render_for_width is not None:
162
+ try:
163
+ raw = self.render_for_width(max(0, int(width)))
164
+ except Exception: # noqa: BLE001
165
+ return self.content()
166
+ if isinstance(raw, Text):
167
+ return raw
168
+ return str(raw or "")
169
+ return self.content()
170
+
154
171
 
155
172
  def _default_regions() -> dict[str, TopBarRegionSpec]:
156
173
  # Classic chrome: left/right hug content, center flex-fills leftover.
@@ -338,6 +355,7 @@ class TopBarRegistry:
338
355
  gap_before=component.gap_before,
339
356
  style=component.style,
340
357
  visible=component.visible,
358
+ render_for_width=component.render_for_width,
341
359
  )
342
360
  else:
343
361
  component.region = rid
@@ -356,6 +374,7 @@ class TopBarRegistry:
356
374
  style: str | None = None,
357
375
  visible: bool = True,
358
376
  replace: bool = True,
377
+ render_for_width: WidthRenderFn | None = None,
359
378
  ) -> TopBarComponent:
360
379
  comp = TopBarComponent(
361
380
  id=str(id),
@@ -367,6 +386,7 @@ class TopBarRegistry:
367
386
  gap_before=str(gap_before),
368
387
  style=style,
369
388
  visible=bool(visible),
389
+ render_for_width=render_for_width,
370
390
  )
371
391
  self.register(comp, replace=replace)
372
392
  return comp
@@ -470,6 +490,34 @@ def truncate_to_width(text: str, max_w: int) -> str:
470
490
  return "".join(out) + "…"
471
491
 
472
492
 
493
+ def _elide_tail(text: str, max_w: int) -> str:
494
+ """Keep the *tail* of ``text``, prefixing ``…`` when it does not fit.
495
+
496
+ Used by width-aware components to retain the meaningful tail (e.g. the last
497
+ path segment for a workspace, or the concrete branch name) instead of a hard
498
+ cut at the end that would drop exactly the informative part.
499
+ """
500
+ raw = text or ""
501
+ max_w = max(0, int(max_w))
502
+ if max_w <= 0:
503
+ return ""
504
+ if display_width(raw) <= max_w:
505
+ return raw
506
+ if max_w == 1:
507
+ return "…"
508
+ # Reserve a single cell for the leading ellipsis.
509
+ budget = max_w - 1
510
+ tail: list[str] = []
511
+ used = 0
512
+ for ch in reversed(raw):
513
+ cw = display_width(ch)
514
+ if used + cw > budget:
515
+ break
516
+ tail.append(ch)
517
+ used += cw
518
+ return "…" + "".join(reversed(tail))
519
+
520
+
473
521
  def center_in_width(text: str, width: int) -> str:
474
522
  """Pad ``text`` so it appears centered within ``width`` terminal cells."""
475
523
  return align_in_width(text, width, TopBarAlign.CENTER)
@@ -495,6 +543,26 @@ def align_in_width(text: str, width: int, align: TopBarAlign | str) -> str:
495
543
  return body + (" " * pad)
496
544
 
497
545
 
546
+ def _center_lead_for_band(
547
+ natural: str,
548
+ *,
549
+ band_width: int,
550
+ band_start: int,
551
+ usable: int,
552
+ ) -> int:
553
+ """Leading pad so ``natural`` centers on the *full* row, not its band.
554
+
555
+ ``band_start`` is the absolute content column where this region begins.
556
+ This keeps a ``center`` region that flex-fills the leftover width visually
557
+ centered on the row even when a sibling region (e.g. the previously-populated
558
+ right side) is empty. The result is clamped to the band so the text never
559
+ overlaps a neighbor or collapses to a negative offset.
560
+ """
561
+ cw = display_width(natural)
562
+ lead = max(0, (usable - cw) // 2 - band_start)
563
+ return min(lead, max(0, band_width - cw))
564
+
565
+
498
566
  def join_region_parts(parts: Iterable[tuple[str, str]]) -> str:
499
567
  """Join ``(gap_before, text)`` pairs, skipping empty texts."""
500
568
  chunks: list[str] = []
@@ -818,7 +886,15 @@ def locate_component_span(
818
886
  if reg.spec.align is TopBarAlign.RIGHT:
819
887
  lead = max(0, reg.width - display_width(natural))
820
888
  elif reg.spec.align is TopBarAlign.CENTER:
821
- lead = max(0, (reg.width - display_width(natural)) // 2)
889
+ if int(reg.spec.flex or 0) > 0:
890
+ lead = _center_lead_for_band(
891
+ natural,
892
+ band_width=reg.width,
893
+ band_start=cursor,
894
+ usable=packed.usable,
895
+ )
896
+ else:
897
+ lead = max(0, (reg.width - display_width(natural)) // 2)
822
898
 
823
899
  x = cursor + lead
824
900
  first = True
@@ -878,6 +954,129 @@ def _append_chunk_with_region_bg(
878
954
  line.append(str(chunk), style=_with_bg(style, bg) if bg else style)
879
955
 
880
956
 
957
+ def _region_has_width_aware(components: list[TopBarComponent]) -> bool:
958
+ """True when any component can elide to a width-aware representation."""
959
+ return any(c.render_for_width is not None for c in components)
960
+
961
+
962
+ def _allocate_region_span(
963
+ comps: list[TopBarComponent],
964
+ ideal: list[int],
965
+ mins: list[int],
966
+ budget: int,
967
+ ) -> list[int]:
968
+ """Split ``budget`` cells among components.
969
+
970
+ Guarantees each component its ``min_width`` when possible, then hands the
971
+ leftover proportionally to the natural (ideal) width. If the budget cannot
972
+ cover all minimums, earlier components win (keeps the chrome anchored left)
973
+ and the rest are elided away.
974
+ """
975
+ n = len(comps)
976
+ if n == 0:
977
+ return []
978
+ if sum(ideal) <= budget:
979
+ return list(ideal)
980
+ alloc = [0] * n
981
+ if sum(mins) > budget:
982
+ rem = budget
983
+ for i in range(n):
984
+ if rem <= 0:
985
+ break
986
+ take = min(mins[i], rem)
987
+ alloc[i] = take
988
+ rem -= take
989
+ used = sum(alloc)
990
+ if used < budget and n:
991
+ alloc[n - 1] += budget - used
992
+ return alloc
993
+ alloc = list(mins)
994
+ rem = budget - sum(mins)
995
+ if rem > 0:
996
+ weight = [max(0, ideal[i] - mins[i]) for i in range(n)]
997
+ total = sum(weight) or 1
998
+ for i in range(n):
999
+ if weight[i] <= 0:
1000
+ continue
1001
+ alloc[i] += min(weight[i], int(rem * weight[i] // total))
1002
+ used = sum(alloc)
1003
+ if used < budget:
1004
+ for i in range(n - 1, -1, -1):
1005
+ room = max(0, ideal[i] - alloc[i])
1006
+ if room <= 0:
1007
+ continue
1008
+ take = min(room, budget - used)
1009
+ alloc[i] += take
1010
+ used += take
1011
+ if used >= budget:
1012
+ break
1013
+ return alloc
1014
+
1015
+
1016
+ def _render_region_width_aware(
1017
+ reg: PackedRegion,
1018
+ *,
1019
+ style: str | None,
1020
+ bg: str,
1021
+ ) -> Text:
1022
+ """Render region components with width-aware elision.
1023
+
1024
+ Each visible component gets a slice of ``reg.width`` (min-width floor plus a
1025
+ proportional share of the leftovers) and, if it provides ``render_for_width``,
1026
+ renders exactly that slice by eliding to the meaningful part. Components
1027
+ without one render normally, then a final hard truncation keeps the band from
1028
+ overflowing so neighbour regions stay put.
1029
+ """
1030
+ comps = [c for c in reg.components if c.visible]
1031
+ if not comps:
1032
+ return Text()
1033
+ gap_before = [display_width(c.gap_before) for c in comps]
1034
+ total_gap = sum(gap_before[1:]) # first component has no leading gap
1035
+ budget = max(0, reg.width - total_gap)
1036
+ if budget <= 0:
1037
+ return Text()
1038
+ ideal = []
1039
+ for comp in comps:
1040
+ if comp.render_for_width is not None:
1041
+ raw = comp.render_for_width(budget)
1042
+ plain = raw.plain if isinstance(raw, Text) else str(raw or "")
1043
+ ideal.append(max(1, display_width(plain)))
1044
+ else:
1045
+ ideal.append(max(1, display_width(comp.text())))
1046
+ mins = [max(0, int(c.min_width or 0)) for c in comps]
1047
+ alloc = _allocate_region_span(comps, ideal, mins, budget)
1048
+
1049
+ out = Text()
1050
+ first = True
1051
+ for comp, sub_w in zip(comps, alloc, strict=True):
1052
+ gap = comp.gap_before
1053
+ if not first and gap and sub_w > 0:
1054
+ out.append(gap, style=style)
1055
+ if sub_w <= 0:
1056
+ first = False
1057
+ continue
1058
+ chunk = comp.render_width(sub_w)
1059
+ plain = chunk.plain if isinstance(chunk, Text) else str(chunk or "")
1060
+ if not plain:
1061
+ first = False
1062
+ continue
1063
+ w = display_width(plain)
1064
+ if w > sub_w:
1065
+ # Final cap so the band never overflows.
1066
+ if isinstance(chunk, Text):
1067
+ chunk = Text(truncate_to_width(plain, sub_w))
1068
+ else:
1069
+ chunk = truncate_to_width(plain, sub_w)
1070
+ w = sub_w
1071
+ if isinstance(chunk, Text):
1072
+ _append_chunk_with_region_bg(out, chunk, style=style, bg=bg)
1073
+ else:
1074
+ c_style = comp.style if comp.style is not None else style
1075
+ _append_chunk_with_region_bg(out, chunk, style=c_style, bg=bg)
1076
+ first = False
1077
+ return out
1078
+
1079
+
881
1080
  def render_packed_line(
882
1081
  layout: TopBarLayout,
883
1082
  *,
@@ -898,6 +1097,8 @@ def render_packed_line(
898
1097
  default_fb = ""
899
1098
 
900
1099
  visible = [r for r in layout.regions if r.width > 0 or r.content]
1100
+ # Track cells written so a center+flex region can center on the full row.
1101
+ written = 0
901
1102
  for i, reg in enumerate(visible):
902
1103
  fb = fb_map.get(reg.spec.id, default_fb)
903
1104
  style = reg.spec.style_string(fallback_fg=fb or None)
@@ -905,13 +1106,49 @@ def render_packed_line(
905
1106
  body = reg.aligned_text()
906
1107
  natural = reg.content
907
1108
  # Prefer component path so branch/workspace keep their own styles, even
908
- # when the region paints a solid background band.
909
- if reg.components and render_region_text(reg.components) == natural:
1109
+ # when the region paints a solid background band. Width-aware elision is
1110
+ # used only when the *full* chrome would not fit the allocated band.
1111
+ if (
1112
+ reg.components
1113
+ and _region_has_width_aware(reg.components)
1114
+ and display_width(render_region_text(reg.components)) > reg.width
1115
+ ):
1116
+ band_style = style or (f"on {bg}" if bg else None)
910
1117
  lead = 0
911
1118
  if reg.spec.align is TopBarAlign.RIGHT:
912
1119
  lead = max(0, reg.width - display_width(natural))
913
1120
  elif reg.spec.align is TopBarAlign.CENTER:
914
- lead = max(0, (reg.width - display_width(natural)) // 2)
1121
+ if int(reg.spec.flex or 0) > 0:
1122
+ lead = _center_lead_for_band(
1123
+ natural,
1124
+ band_width=reg.width,
1125
+ band_start=written,
1126
+ usable=layout.usable,
1127
+ )
1128
+ else:
1129
+ lead = max(0, (reg.width - display_width(natural)) // 2)
1130
+ if lead > 0:
1131
+ line.append(" " * lead, style=band_style)
1132
+ smart = _render_region_width_aware(reg, style=style, bg=bg)
1133
+ line.append_text(smart)
1134
+ used = lead + display_width(smart.plain)
1135
+ trail = reg.width - used
1136
+ if trail > 0:
1137
+ line.append(" " * trail, style=band_style)
1138
+ elif reg.components and render_region_text(reg.components) == natural:
1139
+ lead = 0
1140
+ if reg.spec.align is TopBarAlign.RIGHT:
1141
+ lead = max(0, reg.width - display_width(natural))
1142
+ elif reg.spec.align is TopBarAlign.CENTER:
1143
+ if int(reg.spec.flex or 0) > 0:
1144
+ lead = _center_lead_for_band(
1145
+ natural,
1146
+ band_width=reg.width,
1147
+ band_start=written,
1148
+ usable=layout.usable,
1149
+ )
1150
+ else:
1151
+ lead = max(0, (reg.width - display_width(natural)) // 2)
915
1152
  # Always paint pad cells with the region style so bg fills the band,
916
1153
  # not only the glyphs (hug regions used to look like text highlight).
917
1154
  band_style = style or (f"on {bg}" if bg else None)
@@ -941,9 +1178,11 @@ def render_packed_line(
941
1178
  band_style = style or (f"on {bg}" if bg else None)
942
1179
  line.append(" " * reg.width, style=band_style)
943
1180
 
1181
+ written += reg.width
944
1182
  if i < len(visible) - 1 and reg.spec.gap_after > 0:
945
1183
  # Gaps stay unstyled so the widget CSS topbar bg shows between blocks.
946
1184
  line.append(" " * reg.spec.gap_after, style=None)
1185
+ written += reg.spec.gap_after
947
1186
 
948
1187
  plain_w = display_width(line.plain)
949
1188
  if plain_w < layout.usable:
@@ -633,6 +633,10 @@ class CodingAgentApp(App[None]):
633
633
  )
634
634
  except Exception: # noqa: BLE001
635
635
  pass
636
+ # Re-probe after mount so a transient/timeout failure during __init__
637
+ # does not leave the branch chrome empty until the first completed turn.
638
+ # The controller schedules the actual git subprocess work off-thread.
639
+ self._refresh_git_chrome()
636
640
  self._reload_tool_output_stats()
637
641
  set_metrics_notifier(self._on_tool_output_metrics_changed)
638
642
  self._refresh_bottombar()