synapse-cli-agent 0.1.33__tar.gz → 0.1.34__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 (552) hide show
  1. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/CHANGELOG.md +14 -0
  2. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/PKG-INFO +1 -1
  3. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/pyproject.toml +1 -1
  4. synapse_cli_agent-0.1.34/release_body.md +13 -0
  5. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/content/multimodal.py +67 -7
  6. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/prompt_controller.py +64 -28
  7. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/tui.py +27 -2
  8. synapse_cli_agent-0.1.34/tests/test_clipboard.py +94 -0
  9. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_prompt_controller.py +51 -0
  10. synapse_cli_agent-0.1.34/tests/test_tui_paste.py +56 -0
  11. synapse_cli_agent-0.1.33/release_body.md +0 -22
  12. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/.dockerignore +0 -0
  13. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/.github/workflows/ci.yml +0 -0
  14. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/.github/workflows/docs.yml +0 -0
  15. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/.github/workflows/native-compression-wheels.yml +0 -0
  16. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/.github/workflows/native-core-tool-wheels.yml +0 -0
  17. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/.github/workflows/release.yml +0 -0
  18. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/.gitignore +0 -0
  19. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/.python-version +0 -0
  20. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/.readthedocs.yaml +0 -0
  21. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/.zed/settings.json +0 -0
  22. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/AGENTS.md +0 -0
  23. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/Dockerfile.web +0 -0
  24. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/LICENSE +0 -0
  25. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/README.md +0 -0
  26. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/README.zh-CN.md +0 -0
  27. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/agent-studio-prototype/favicon.svg +0 -0
  28. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/agent-studio-prototype/index.html +0 -0
  29. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/agent-studio-prototype/script.js +0 -0
  30. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/agent-studio-prototype/styles.css +0 -0
  31. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/agent_upstream.txt +0 -0
  32. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/assets/demo.gif +0 -0
  33. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/assets/synapse-logo.svg +0 -0
  34. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/assets/tui-preview.png +0 -0
  35. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/cli_upstream.txt +0 -0
  36. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/debug_compact.py +0 -0
  37. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/decode_screenshot.py +0 -0
  38. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/capability-matrix.md +0 -0
  39. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/decisions.md +0 -0
  40. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/index.md +0 -0
  41. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/phase-0-protocol-baseline.md +0 -0
  42. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/phase-1-core-transport.md +0 -0
  43. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/phase-2-prompt-semantics.md +0 -0
  44. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/phase-3-permissions.md +0 -0
  45. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/phase-4-session-lifecycle.md +0 -0
  46. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/phase-5-session-mcp.md +0 -0
  47. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/phase-6-client-services.md +0 -0
  48. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/phase-7-advanced-capabilities.md +0 -0
  49. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/phase-8-compliance.md +0 -0
  50. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/acp-adapter/progress.md +0 -0
  51. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-development-guide.md +0 -0
  52. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/baseline-report.md +0 -0
  53. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/decisions.md +0 -0
  54. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/index.md +0 -0
  55. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/migration.md +0 -0
  56. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/phase-0-baseline.md +0 -0
  57. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/phase-1-streaming-core.md +0 -0
  58. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/phase-2-turn-runtime.md +0 -0
  59. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/phase-3-tui-cutover.md +0 -0
  60. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/phase-4-session-runtime.md +0 -0
  61. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/phase-5-multi-session.md +0 -0
  62. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/phase-6-project-runtime.md +0 -0
  63. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/phase-7-global-control-plane.md +0 -0
  64. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/phase-8-hardening.md +0 -0
  65. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/post-review-fix-plan.md +0 -0
  66. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/agent-runtime-decoupling/progress.md +0 -0
  67. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/architecture-flow.md +0 -0
  68. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/architecture.md +0 -0
  69. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/cli.md +0 -0
  70. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/codex-session-discovery-phase-1.md +0 -0
  71. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/codex-session-import-phase-2.md +0 -0
  72. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/config.md +0 -0
  73. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/design.md +0 -0
  74. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/docker-web.md +0 -0
  75. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/index.md +0 -0
  76. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/install.md +0 -0
  77. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/math-formulas-test.md +0 -0
  78. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/mcp.md +0 -0
  79. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/models.md +0 -0
  80. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/native-compression-core.md +0 -0
  81. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/native-core-tool.md +0 -0
  82. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/permissions.md +0 -0
  83. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/quickstart.md +0 -0
  84. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/sessions.md +0 -0
  85. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/skills.md +0 -0
  86. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/smith_output.md +0 -0
  87. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/subagents.md +0 -0
  88. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/tool-output-transform.md +0 -0
  89. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/tui-cursor-refactor.md +0 -0
  90. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/tutorial.md +0 -0
  91. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/docs/x-agent-development-guide.md +0 -0
  92. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/examples/mcp.example.json +0 -0
  93. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/examples/models.example.json +0 -0
  94. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/examples/settings.example.json +0 -0
  95. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/middleware_upstream.txt +0 -0
  96. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/mkdocs.yml +0 -0
  97. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/Cargo.lock +0 -0
  98. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/Cargo.toml +0 -0
  99. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/LICENSE +0 -0
  100. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/NOTICE +0 -0
  101. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/README.md +0 -0
  102. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/pyproject.toml +0 -0
  103. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/python/synapse_core_tool/__init__.py +0 -0
  104. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/src/file_access.rs +0 -0
  105. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/src/file_tools.rs +0 -0
  106. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/src/lib.rs +0 -0
  107. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/src/math_render.rs +0 -0
  108. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/src/search.rs +0 -0
  109. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-core-tool/uv.lock +0 -0
  110. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/Cargo.lock +0 -0
  111. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/Cargo.toml +0 -0
  112. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/LICENSE +0 -0
  113. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/NOTICE +0 -0
  114. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/README.md +0 -0
  115. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/pyproject.toml +0 -0
  116. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/python/synapse_tool_compress_core/__init__.py +0 -0
  117. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/ccr.rs +0 -0
  118. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/ccr_in_memory.rs +0 -0
  119. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/mod.rs +0 -0
  120. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/relevance/base.rs +0 -0
  121. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/relevance/bm25.rs +0 -0
  122. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/signals/keyword_detector.rs +0 -0
  123. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/signals/line_importance.rs +0 -0
  124. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/adaptive_sizer.rs +0 -0
  125. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/anchor_selector.rs +0 -0
  126. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/code_compressor.rs +0 -0
  127. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/diff_compressor.rs +0 -0
  128. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/log_compressor.rs +0 -0
  129. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/search_compressor.rs +0 -0
  130. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/analyzer.rs +0 -0
  131. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/anchors.rs +0 -0
  132. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/builder.rs +0 -0
  133. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/classifier.rs +0 -0
  134. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/classifier.rs +0 -0
  135. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/compactor.rs +0 -0
  136. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/formatter.rs +0 -0
  137. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/ir.rs +0 -0
  138. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/mod.rs +0 -0
  139. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/walker.rs +0 -0
  140. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/config.rs +0 -0
  141. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/constraints.rs +0 -0
  142. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crusher.rs +0 -0
  143. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crushers.rs +0 -0
  144. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/error_keywords.rs +0 -0
  145. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/field_detect.rs +0 -0
  146. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/hashing.rs +0 -0
  147. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/mod.rs +0 -0
  148. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/observer.rs +0 -0
  149. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/orchestration.rs +0 -0
  150. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/outliers.rs +0 -0
  151. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/planning.rs +0 -0
  152. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/statistics.rs +0 -0
  153. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/stats_math.rs +0 -0
  154. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/traits.rs +0 -0
  155. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/types.rs +0 -0
  156. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/rust/synapse-tool-compress-core/src/lib.rs +0 -0
  157. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/scripts/install.ps1 +0 -0
  158. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/scripts/release.ps1 +0 -0
  159. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/scripts/serve_web.py +0 -0
  160. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/slash_cmds_upstream.txt +0 -0
  161. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/__init__.py +0 -0
  162. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/__main__.py +0 -0
  163. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/__init__.py +0 -0
  164. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/agent.py +0 -0
  165. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/client_services.py +0 -0
  166. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/content.py +0 -0
  167. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/events.py +0 -0
  168. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/lifecycle.py +0 -0
  169. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/mcp.py +0 -0
  170. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/permissions.py +0 -0
  171. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/server.py +0 -0
  172. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/sessions.py +0 -0
  173. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/acp/updates.py +0 -0
  174. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/app/__init__.py +0 -0
  175. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/app/agent.py +0 -0
  176. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/app/agent_assembly.py +0 -0
  177. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/app/agent_md.py +0 -0
  178. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/cli.py +0 -0
  179. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/__init__.py +0 -0
  180. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/compression.py +0 -0
  181. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/goal.py +0 -0
  182. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/helpers.py +0 -0
  183. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/mcp.py +0 -0
  184. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/model.py +0 -0
  185. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/result.py +0 -0
  186. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/sessions.py +0 -0
  187. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/slash_cmds.py +0 -0
  188. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/slash_complete.py +0 -0
  189. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/commands/theme.py +0 -0
  190. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/config.py +0 -0
  191. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/content/__init__.py +0 -0
  192. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/content/input_history.py +0 -0
  193. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/content/prompts.py +0 -0
  194. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/content/skills_catalog.py +0 -0
  195. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/entry.py +0 -0
  196. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/goals/__init__.py +0 -0
  197. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/goals/middleware.py +0 -0
  198. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/goals/model.py +0 -0
  199. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/goals/runtime.py +0 -0
  200. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/goals/steering.py +0 -0
  201. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/goals/store.py +0 -0
  202. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/goals/tools.py +0 -0
  203. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/__init__.py +0 -0
  204. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/checkpoint_seed.py +0 -0
  205. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/codex_history.py +0 -0
  206. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/codex_import.py +0 -0
  207. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/codex_sessions.py +0 -0
  208. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/describe_image.py +0 -0
  209. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/herdr.py +0 -0
  210. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/http_clients.py +0 -0
  211. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/llm_openai_compat.py +0 -0
  212. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/llm_openai_websocket.py +0 -0
  213. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/mcp_client.py +0 -0
  214. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/openai_oauth.py +0 -0
  215. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/openai_oauth_middleware.py +0 -0
  216. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/openai_usage.py +0 -0
  217. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/integrations/vision_middleware.py +0 -0
  218. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/memory/__init__.py +0 -0
  219. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/memory/auto_recorder.py +0 -0
  220. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/memory/embedder.py +0 -0
  221. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/memory/long_term.py +0 -0
  222. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/models/__init__.py +0 -0
  223. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/models/config.py +0 -0
  224. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/models/helpers.py +0 -0
  225. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/models/profile.py +0 -0
  226. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/models/registry.py +0 -0
  227. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/models_registry.py +0 -0
  228. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/observability/__init__.py +0 -0
  229. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/observability/debug_inspector.html +0 -0
  230. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/observability/debug_server.py +0 -0
  231. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/observability/exit_trace.py +0 -0
  232. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/observability/heap_dump.py +0 -0
  233. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/observability/llm_debug.py +0 -0
  234. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/observability/startup_trace.py +0 -0
  235. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/planner/__init__.py +0 -0
  236. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/planner/task_planner.py +0 -0
  237. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/projects/__init__.py +0 -0
  238. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/projects/catalog.py +0 -0
  239. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/rag/__init__.py +0 -0
  240. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/rag/knowledge_base.py +0 -0
  241. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/__init__.py +0 -0
  242. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/agent_loop/__init__.py +0 -0
  243. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/agent_loop/model.py +0 -0
  244. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/agent_loop/request.py +0 -0
  245. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/agent_loop/turn.py +0 -0
  246. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/async_runtime.py +0 -0
  247. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/backends.py +0 -0
  248. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/cancellation.py +0 -0
  249. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/context_compact.py +0 -0
  250. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/debug_capture_middleware.py +0 -0
  251. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/execute_capture.py +0 -0
  252. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/filesystem_tool_prompt_middleware.py +0 -0
  253. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/fs_permissions.py +0 -0
  254. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/harness.py +0 -0
  255. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/hitl.py +0 -0
  256. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/interaction_ledger.py +0 -0
  257. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/middleware.py +0 -0
  258. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/model_request_compression_middleware.py +0 -0
  259. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/pathing.py +0 -0
  260. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/projects/__init__.py +0 -0
  261. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/projects/identity.py +0 -0
  262. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/projects/runtime.py +0 -0
  263. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/safety.py +0 -0
  264. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/session_prewarm.py +0 -0
  265. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/sessions/__init__.py +0 -0
  266. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/sessions/events.py +0 -0
  267. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/sessions/manager.py +0 -0
  268. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/sessions/persistence.py +0 -0
  269. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/sessions/ref.py +0 -0
  270. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/sessions/runtime.py +0 -0
  271. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/steer.py +0 -0
  272. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/streaming/__init__.py +0 -0
  273. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/streaming/accumulator.py +0 -0
  274. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/streaming/adapters.py +0 -0
  275. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/streaming/events.py +0 -0
  276. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/streaming/parser.py +0 -0
  277. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/streaming/protocol.py +0 -0
  278. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/streaming/runtime.py +0 -0
  279. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/streaming/stream_events.py +0 -0
  280. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/streaming/tool_model.py +0 -0
  281. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/subagent_config_persist.py +0 -0
  282. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/subagent_specs.py +0 -0
  283. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/subagents.py +0 -0
  284. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/timeline.py +0 -0
  285. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/token_rate.py +0 -0
  286. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/tool_ignore.py +0 -0
  287. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/tool_output_eval.py +0 -0
  288. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/tool_output_middleware.py +0 -0
  289. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/tool_output_usage_middleware.py +0 -0
  290. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/runtime/tool_response_truncate_middleware.py +0 -0
  291. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/sessions/__init__.py +0 -0
  292. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/sessions/cancel_repair.py +0 -0
  293. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/sessions/search_index.py +0 -0
  294. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/sessions/store.py +0 -0
  295. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/sessions/summary.py +0 -0
  296. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/sessions/transcript.py +0 -0
  297. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/sessions/transcript_migration.py +0 -0
  298. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/sessions/transcript_projection.py +0 -0
  299. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/settings/__init__.py +0 -0
  300. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/settings/config_paths.py +0 -0
  301. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/settings/schema.py +0 -0
  302. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/subagents.py +0 -0
  303. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tool_output/__init__.py +0 -0
  304. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tool_output/detection.py +0 -0
  305. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tool_output/metrics.py +0 -0
  306. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tool_output/models.py +0 -0
  307. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tool_output/pipeline.py +0 -0
  308. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tool_output/repository.py +0 -0
  309. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tool_output/transformers.py +0 -0
  310. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tools/__init__.py +0 -0
  311. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tools/describe_image.py +0 -0
  312. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tools/filesystem_patch.py +0 -0
  313. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tools/filesystem_search.py +0 -0
  314. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/tools/session_tools.py +0 -0
  315. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/__init__.py +0 -0
  316. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/agent_lifecycle.py +0 -0
  317. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/answer_divider.py +0 -0
  318. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/__init__.py +0 -0
  319. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/components/__init__.py +0 -0
  320. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/components/codex_usage.py +0 -0
  321. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/components/fast.py +0 -0
  322. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/components/goal.py +0 -0
  323. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/components/key_hints.py +0 -0
  324. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/components/mcp.py +0 -0
  325. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/components/mode.py +0 -0
  326. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/components/model.py +0 -0
  327. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/components/thread.py +0 -0
  328. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/context.py +0 -0
  329. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/bottombar/core.py +0 -0
  330. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/chrome/__init__.py +0 -0
  331. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/chrome/controller.py +0 -0
  332. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/clipboard.py +0 -0
  333. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/__init__.py +0 -0
  334. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/active_session_switcher.py +0 -0
  335. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/base.py +0 -0
  336. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/codex_reset.py +0 -0
  337. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/codex_session_list.py +0 -0
  338. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/compression_diagnostics.py +0 -0
  339. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/controller.py +0 -0
  340. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/git_explore.py +0 -0
  341. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/mcp_panel.py +0 -0
  342. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/model_picker.py +0 -0
  343. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/safety_panel.py +0 -0
  344. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/session_list.py +0 -0
  345. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/subagent_config.py +0 -0
  346. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/theme_designer.py +0 -0
  347. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/dialogs/theme_picker.py +0 -0
  348. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/drawer.py +0 -0
  349. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/formatters.py +0 -0
  350. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/git_explore/__init__.py +0 -0
  351. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/git_explore/engine.py +0 -0
  352. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/git_explore/provider.py +0 -0
  353. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/git_explore/unified.py +0 -0
  354. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/image_preview.py +0 -0
  355. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/image_render.py +0 -0
  356. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/image_viewer.py +0 -0
  357. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/math_image.py +0 -0
  358. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/mermaid_image.py +0 -0
  359. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/rendering.py +0 -0
  360. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/selectable_static.py +0 -0
  361. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/selectable_text.py +0 -0
  362. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/sink.py +0 -0
  363. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/status_controller.py +0 -0
  364. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/steer_controller.py +0 -0
  365. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/steer_widget.py +0 -0
  366. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/stream.py +0 -0
  367. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/stream_events.py +0 -0
  368. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/stream_runtime.py +0 -0
  369. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/textual_lifecycle.py +0 -0
  370. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/textual_stream_sink.py +0 -0
  371. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/theme.py +0 -0
  372. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/theme_controller.py +0 -0
  373. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/timeline.py +0 -0
  374. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/tool_blocks.py +0 -0
  375. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/__init__.py +0 -0
  376. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/components/__init__.py +0 -0
  377. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/components/branch.py +0 -0
  378. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/components/title.py +0 -0
  379. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/components/tool_output.py +0 -0
  380. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/components/usage.py +0 -0
  381. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/components/workspace.py +0 -0
  382. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/context.py +0 -0
  383. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/core.py +0 -0
  384. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/git_changes_popover.py +0 -0
  385. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/git_chrome.py +0 -0
  386. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/tool_output_popover.py +0 -0
  387. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/topbar/widget.py +0 -0
  388. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/transcript/__init__.py +0 -0
  389. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/transcript/controller.py +0 -0
  390. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/transcript/factory.py +0 -0
  391. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/transcript/history.py +0 -0
  392. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/transcript/state.py +0 -0
  393. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/transcript_blocks.py +0 -0
  394. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/tui_launch.py +0 -0
  395. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/tui_styles.py +0 -0
  396. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/turn/__init__.py +0 -0
  397. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/turn/controller.py +0 -0
  398. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/turn/event_bridge.py +0 -0
  399. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/turn/event_renderer.py +0 -0
  400. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/turn/persistence.py +0 -0
  401. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/turn/request.py +0 -0
  402. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/turn_rail.py +0 -0
  403. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/turn_rail_widgets.py +0 -0
  404. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/user_turn.py +0 -0
  405. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/user_turn_block.py +0 -0
  406. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/ui/welcome.py +0 -0
  407. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/src/synapse/web.py +0 -0
  408. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/synapse.cmd +0 -0
  409. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/__init__.py +0 -0
  410. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/acp/initialize.jsonl +0 -0
  411. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/agent_stream/core_scenarios.json +0 -0
  412. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/codex_rollouts/duplicate_response_item.jsonl +0 -0
  413. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/codex_rollouts/incomplete_and_aborted.jsonl +0 -0
  414. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/codex_rollouts/legacy_compaction.jsonl +0 -0
  415. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/codex_rollouts/normal_completed.jsonl +0 -0
  416. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/codex_rollouts/replacement_history.jsonl +0 -0
  417. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/codex_rollouts/rollback.jsonl +0 -0
  418. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/codex_rollouts/unsupported_replacement.jsonl +0 -0
  419. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/sample_repo/calculator.py +0 -0
  420. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/sample_repo/test_calculator.py +0 -0
  421. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/fixtures/tool_output_eval.json +0 -0
  422. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test.py +0 -0
  423. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p0_baseline.py +0 -0
  424. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p1_core.py +0 -0
  425. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p1_transport.py +0 -0
  426. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p2_content.py +0 -0
  427. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p2_events.py +0 -0
  428. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p2_updates.py +0 -0
  429. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p3_agent.py +0 -0
  430. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p3_permissions.py +0 -0
  431. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p4_history.py +0 -0
  432. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p4_lifecycle.py +0 -0
  433. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p5_mcp.py +0 -0
  434. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p6_client_services.py +0 -0
  435. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_acp_p8_compliance.py +0 -0
  436. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_agent_factory.py +0 -0
  437. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_agent_lifecycle.py +0 -0
  438. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_agent_turn_runtime.py +0 -0
  439. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_async_checkpointer.py +0 -0
  440. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_backends.py +0 -0
  441. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_bottombar_registry.py +0 -0
  442. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_cancel_repair.py +0 -0
  443. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_capabilities.py +0 -0
  444. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_checkpoint_seed.py +0 -0
  445. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_chrome_controller.py +0 -0
  446. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_cli.py +0 -0
  447. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_cli_codex_import.py +0 -0
  448. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_codex_history.py +0 -0
  449. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_codex_import.py +0 -0
  450. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_codex_sessions.py +0 -0
  451. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_codex_sessions_windows.py +0 -0
  452. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_compact_tool_descriptions.py +0 -0
  453. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_config.py +0 -0
  454. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_context_compact.py +0 -0
  455. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_context_window.py +0 -0
  456. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_debug_capture_middleware.py +0 -0
  457. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_debug_inspector.py +0 -0
  458. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_describe_image.py +0 -0
  459. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_dialogs.py +0 -0
  460. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_entry.py +0 -0
  461. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_filesystem_patch_tool.py +0 -0
  462. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_filesystem_search_tools.py +0 -0
  463. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_git_changes_popover.py +0 -0
  464. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_git_chrome.py +0 -0
  465. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_git_explore.py +0 -0
  466. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_goal_live_tui.py +0 -0
  467. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_goals.py +0 -0
  468. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_heap_dump.py +0 -0
  469. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_herdr_integration.py +0 -0
  470. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_http_clients.py +0 -0
  471. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_image_render.py +0 -0
  472. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_image_viewer.py +0 -0
  473. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_input_history.py +0 -0
  474. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_iteration_abc.py +0 -0
  475. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_layered_config.py +0 -0
  476. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_math_image_render.py +0 -0
  477. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_mcp_schema.py +0 -0
  478. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_mermaid_image.py +0 -0
  479. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_mermaid_render.py +0 -0
  480. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_middleware_async.py +0 -0
  481. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_model_request_compression_middleware.py +0 -0
  482. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_model_retry.py +0 -0
  483. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_multimodal.py +0 -0
  484. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_native_math_render.py +0 -0
  485. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_openai_compat_reasoning.py +0 -0
  486. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_openai_oauth.py +0 -0
  487. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_openai_oauth_middleware.py +0 -0
  488. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_openai_usage.py +0 -0
  489. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_openai_websocket.py +0 -0
  490. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_pathing.py +0 -0
  491. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_project_catalog.py +0 -0
  492. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_project_drawer.py +0 -0
  493. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_project_runtime.py +0 -0
  494. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_project_switch.py +0 -0
  495. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_prompts.py +0 -0
  496. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_runtime_hardening.py +0 -0
  497. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_runtime_manager.py +0 -0
  498. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_runtime_streaming.py +0 -0
  499. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_safety.py +0 -0
  500. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_search_index.py +0 -0
  501. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_session_prewarm.py +0 -0
  502. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_session_runtime.py +0 -0
  503. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_session_store.py +0 -0
  504. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_session_summary.py +0 -0
  505. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_slash_and_mcp.py +0 -0
  506. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_slash_complete.py +0 -0
  507. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_slash_effects.py +0 -0
  508. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_startup_defer.py +0 -0
  509. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_startup_trace.py +0 -0
  510. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_steer.py +0 -0
  511. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_steer_controller.py +0 -0
  512. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_stream_cancel.py +0 -0
  513. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_stream_semantic_fixtures.py +0 -0
  514. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_stream_tool_items.py +0 -0
  515. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_stream_ui.py +0 -0
  516. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_subagent_config_dialog.py +0 -0
  517. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_subagent_config_persist.py +0 -0
  518. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_subagent_status.py +0 -0
  519. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_subagents.py +0 -0
  520. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_textual_stream_sink.py +0 -0
  521. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_theme.py +0 -0
  522. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_theme_controller.py +0 -0
  523. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_timeline.py +0 -0
  524. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_token_rate.py +0 -0
  525. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tool_blocks.py +0 -0
  526. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tool_ignore.py +0 -0
  527. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tool_intent.py +0 -0
  528. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tool_output.py +0 -0
  529. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tool_output_eval.py +0 -0
  530. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tool_output_slash.py +0 -0
  531. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tool_output_usage_middleware.py +0 -0
  532. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tool_response_truncate_middleware.py +0 -0
  533. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_topbar_context_ratio.py +0 -0
  534. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_topbar_registry.py +0 -0
  535. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_transcript.py +0 -0
  536. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_transcript_controller.py +0 -0
  537. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_transcript_history.py +0 -0
  538. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_transcript_history_controller.py +0 -0
  539. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_transcript_migration.py +0 -0
  540. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_transcript_projection.py +0 -0
  541. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tui_active_session_switcher.py +0 -0
  542. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tui_codex_import.py +0 -0
  543. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_tui_selection.py +0 -0
  544. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_turn_controller.py +0 -0
  545. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_turn_event_renderer.py +0 -0
  546. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_turn_rail_minimap.py +0 -0
  547. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_turn_request.py +0 -0
  548. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_usage_restore.py +0 -0
  549. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_user_turn_style.py +0 -0
  550. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/test_welcome.py +0 -0
  551. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/tests/tool_output_plugin_fixture.py +0 -0
  552. {synapse_cli_agent-0.1.33 → synapse_cli_agent-0.1.34}/uv.lock +0 -0
@@ -8,6 +8,20 @@ All entries are written in English.
8
8
 
9
9
  ---
10
10
 
11
+ ## v0.1.34
12
+
13
+ ### Bug Fixes
14
+
15
+ - Fixed clipboard image paste on Linux/WSLg: WSLg syncs Windows screenshots as `image/bmp`, so the Linux reader now tries `image/png`, `image/bmp`, and `image/jpeg` and normalizes non-PNG data to PNG.
16
+ - Fixed pasted image bytes being rendered as a text placeholder (`[BP... chars]`) instead of an image attachment by detecting mangled image signatures with binary noise and falling back to a clipboard image re-read.
17
+ - Fixed multi-line and long Shift+Insert pastes being truncated to the first line; full content is preserved and expanded on submit.
18
+
19
+ ### Engineering
20
+
21
+ - Added clipboard unit tests for BMP normalization, explicit text MIME requests, and mangled-prefix detection.
22
+
23
+ ---
24
+
11
25
  ## v0.1.33
12
26
 
13
27
  ### New Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: synapse-cli-agent
3
- Version: 0.1.33
3
+ Version: 0.1.34
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synapse-cli-agent"
3
- version = "0.1.33"
3
+ version = "0.1.34"
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,13 @@
1
+ ## v0.1.34
2
+
3
+ ### Bug Fixes
4
+
5
+ - Fixed clipboard image paste on Linux/WSLg: WSLg syncs Windows screenshots as `image/bmp`, so the Linux reader now tries `image/png`, `image/bmp`, and `image/jpeg` and normalizes non-PNG data to PNG.
6
+ - Fixed pasted image bytes being rendered as a text placeholder (`[BP... chars]`) instead of an image attachment by detecting mangled image signatures with binary noise and falling back to a clipboard image re-read.
7
+ - Fixed multi-line and long Shift+Insert pastes being truncated to the first line; full content is preserved and expanded on submit.
8
+
9
+ ### Engineering
10
+
11
+ - Added clipboard unit tests for BMP normalization, explicit text MIME requests, and mangled-prefix detection.
12
+
13
+ ---
@@ -433,6 +433,28 @@ class ClipboardResult:
433
433
  detail: str | None = None
434
434
 
435
435
 
436
+ _IMAGE_MAGIC_PREFIXES = ("BM", "BP", "GIF8", "RIFF")
437
+
438
+
439
+ def looks_like_image_data(text: str) -> bool:
440
+ """True when ``text`` looks like raw image bytes delivered as text.
441
+
442
+ Terminal-native paste of an image can deliver raw image bytes through the
443
+ text channel. Some terminal paths preserve BMP's ``BM`` signature while
444
+ others have been observed to expose it as ``BP``. Require substantial
445
+ binary noise as well as the signature to avoid treating ordinary text as
446
+ image data.
447
+ """
448
+ if not text:
449
+ return False
450
+ sample = text[:512]
451
+ head = sample[:8]
452
+ if not (head.startswith(_IMAGE_MAGIC_PREFIXES) or head.startswith("\ufffdPNG")):
453
+ return False
454
+ noisy = sum(1 for ch in sample if ch < " " or ch == "\ufffd")
455
+ return noisy >= max(8, len(sample) // 4)
456
+
457
+
436
458
  def read_clipboard() -> ClipboardResult:
437
459
  """Best-effort clipboard read: prefer image, else text.
438
460
 
@@ -485,7 +507,7 @@ def _read_clipboard_text() -> str | None:
485
507
  return out.decode("utf-8", errors="replace")
486
508
  # 3) Linux
487
509
  for cmd in (
488
- ["wl-paste", "-n"],
510
+ ["wl-paste", "-n", "-t", "text/plain", "-t", "text/plain;charset=utf-8"],
489
511
  ["xclip", "-selection", "clipboard", "-o"],
490
512
  ["xsel", "--clipboard", "--output"],
491
513
  ):
@@ -669,16 +691,54 @@ def _mac_clipboard_image() -> tuple[bytes, str, str] | None:
669
691
 
670
692
 
671
693
  def _linux_clipboard_image() -> tuple[bytes, str, str] | None:
672
- for cmd in (
673
- ["wl-paste", "-t", "image/png"],
674
- ["xclip", "-selection", "clipboard", "-t", "image/png", "-o"],
675
- ):
676
- out = _run_capture(cmd, timeout=5)
694
+ """Read a clipboard image on Linux/WSLg.
695
+
696
+ WSLg syncs Windows bitmap data as ``image/bmp`` (not ``image/png``), so
697
+ requesting only ``image/png`` misses screenshots pasted from Windows.
698
+ Common types are tried in order and normalized to PNG when Pillow is
699
+ available (otherwise the original bytes are kept under their real MIME).
700
+ """
701
+ for mime in ("image/png", "image/bmp", "image/jpeg"):
702
+ out = _run_capture(["wl-paste", "-t", mime], timeout=5)
677
703
  if out:
678
- return out, "image/png", "clipboard.png"
704
+ data, mime_out = _normalize_image_bytes(out, mime)
705
+ return data, mime_out, "clipboard" + MIME_TO_EXT.get(mime_out, ".png")
706
+ for mime in ("image/png", "image/bmp"):
707
+ out = _run_capture(
708
+ ["xclip", "-selection", "clipboard", "-t", mime, "-o"], timeout=5
709
+ )
710
+ if out:
711
+ data, mime_out = _normalize_image_bytes(out, mime)
712
+ return data, mime_out, "clipboard" + MIME_TO_EXT.get(mime_out, ".png")
679
713
  return None
680
714
 
681
715
 
716
+ def _normalize_image_bytes(data: bytes, mime: str) -> tuple[bytes, str]:
717
+ """Normalize clipboard image bytes, preferring PNG for model support.
718
+
719
+ PNG data with a valid signature is returned unchanged. Other formats
720
+ (BMP/JPEG, or mislabeled bytes) are re-encoded to PNG via Pillow when
721
+ available; without Pillow the original bytes and MIME are kept.
722
+ """
723
+ if mime == "image/png" and data[:8] == b"\x89PNG\r\n\x1a\n":
724
+ return data, mime
725
+ try:
726
+ from io import BytesIO
727
+
728
+ from PIL import Image # type: ignore[import-not-found]
729
+ except Exception: # noqa: BLE001
730
+ return data, mime
731
+ try:
732
+ im = Image.open(BytesIO(data))
733
+ if getattr(im, "mode", "") not in {"RGB", "RGBA"}:
734
+ im = im.convert("RGBA")
735
+ buf = BytesIO()
736
+ im.save(buf, format="PNG")
737
+ return buf.getvalue(), "image/png"
738
+ except Exception: # noqa: BLE001
739
+ return data, mime
740
+
741
+
682
742
  def _run_capture(
683
743
  cmd: list[str],
684
744
  *,
@@ -385,40 +385,76 @@ class PromptController:
385
385
  return
386
386
 
387
387
  if result.kind == "text":
388
- text = result.text or ""
389
- prompt = self._prompt_widget()
390
- if len(text) > 200 or "\n" in text or "\r" in text:
391
- prefix = text[:20].replace("\r", " ").replace("\n", " ").strip()
392
- placeholder = f"[{prefix}... {len(text)} chars]"
393
- self.state.paste_replacements[placeholder] = text
394
- old = prompt.value or ""
395
- prompt.value = old + placeholder
396
- self._app.append_event(
397
- f"pasted text truncated: {len(text)} chars -> "
398
- "placeholder (content preserved)",
399
- "dim",
400
- )
401
- else:
402
- old = prompt.value or ""
403
- prompt.value = old + text
404
- prompt.focus()
388
+ self.insert_pasted_text(result.text or "")
405
389
  return
406
390
 
407
391
  if result.kind == "image":
408
- try:
409
- att = self._image_bank.add_bytes(
410
- result.data, mime=result.mime, name=result.name
411
- )
412
- except Exception as exc: # noqa: BLE001
413
- self._app.append_event(f"image rejected: {exc}", "yellow")
414
- return
392
+ self._attach_image(result)
393
+
394
+ def _attach_image(self, result: Any) -> None:
395
+ """Attach a clipboard image result to the prompt as ``[image#N]``."""
396
+ try:
397
+ att = self._image_bank.add_bytes(
398
+ result.data, mime=result.mime, name=result.name
399
+ )
400
+ except Exception as exc: # noqa: BLE001
401
+ self._app.append_event(f"image rejected: {exc}", "yellow")
402
+ return
403
+ self._app.append_event(f"pasted {att.name} -> [image#{att.id}]", "dim")
404
+ prompt = self._prompt_widget()
405
+ old = prompt.value or ""
406
+ prompt.value = old + f" [image#{att.id}]"
407
+ prompt.focus()
408
+
409
+ def _paste_clipboard_image_only(self) -> None:
410
+ """Fallback for pasted image bytes: re-read the clipboard image.
411
+
412
+ Shift+Insert of an image may deliver raw image bytes as text; instead
413
+ of storing them as a text placeholder, re-read the clipboard and attach
414
+ the image when available.
415
+ """
416
+ from synapse.content.multimodal import read_clipboard
417
+
418
+ try:
419
+ result = read_clipboard()
420
+ except Exception: # noqa: BLE001
421
+ self._app.append_event("clipboard read failed", "yellow")
422
+ return
423
+ if result.kind == "image":
424
+ self._attach_image(result)
425
+ else:
415
426
  self._app.append_event(
416
- f"pasted {att.name} -> [image#{att.id}]", "dim"
427
+ "pasted content looks like image data but clipboard has no image",
428
+ "dim",
417
429
  )
418
- prompt = self._prompt_widget()
430
+
431
+ def insert_pasted_text(self, text: str) -> None:
432
+ """Insert pasted text into the prompt.
433
+
434
+ Long or multi-line text is collapsed into a placeholder and stored in
435
+ ``state.paste_replacements``; the full content is expanded on submit.
436
+ """
437
+ from synapse.content.multimodal import looks_like_image_data
438
+
439
+ if looks_like_image_data(text):
440
+ self._paste_clipboard_image_only()
441
+ return
442
+ prompt = self._prompt_widget()
443
+ if len(text) > 200 or "\n" in text or "\r" in text:
444
+ prefix = text[:20].replace("\r", " ").replace("\n", " ").strip()
445
+ placeholder = f"[{prefix}... {len(text)} chars]"
446
+ self.state.paste_replacements[placeholder] = text
447
+ old = prompt.value or ""
448
+ prompt.value = old + placeholder
449
+ self._app.append_event(
450
+ f"pasted text truncated: {len(text)} chars -> "
451
+ "placeholder (content preserved)",
452
+ "dim",
453
+ )
454
+ else:
419
455
  old = prompt.value or ""
420
- prompt.value = old + f" [image#{att.id}]"
421
- prompt.focus()
456
+ prompt.value = old + text
457
+ prompt.focus()
422
458
 
423
459
  def expand_paste(self, text: str) -> tuple[str, str]:
424
460
  """Expand paste placeholders for submission.
@@ -24,7 +24,7 @@ from textual import on, work
24
24
  from textual.app import App, ComposeResult
25
25
  from textual.binding import Binding
26
26
  from textual.containers import Vertical, VerticalScroll
27
- from textual.events import Click, Key, MouseMove, MouseUp
27
+ from textual.events import Click, Key, MouseMove, MouseUp, Paste
28
28
  from textual.screen import ModalScreen
29
29
  from textual.widgets import Input, Static
30
30
 
@@ -178,6 +178,30 @@ def _git_branch(cwd: Path) -> str | None:
178
178
  """Backward-compatible branch name probe."""
179
179
  info = probe_git_branch_chrome(cwd)
180
180
  return info.name if info is not None else None
181
+ class PromptInput(Input):
182
+ """Prompt input that routes terminal-native paste through the controller.
183
+
184
+ Shift+Insert / middle-click / right-click paste arrive as a bracketed-paste
185
+ ``Paste`` event. The stock ``Input`` keeps only the first line
186
+ (``event.text.splitlines()[0]``), which silently truncates multi-line
187
+ content; this subclass forwards the full text to the prompt controller so
188
+ long/multi-line pastes become ``[prefix... N chars]`` placeholders instead.
189
+ """
190
+
191
+ def __init__(self, on_paste_text: Any, **kwargs: Any) -> None:
192
+ super().__init__(**kwargs)
193
+ self._on_paste_text = on_paste_text
194
+
195
+ def _on_paste(self, event: Paste) -> None:
196
+ # prevent_default skips the parent Input._on_paste in the dispatch
197
+ # chain (named handlers are not deduplicated across the MRO), which
198
+ # would otherwise also insert the first line of the paste.
199
+ event.prevent_default()
200
+ event.stop()
201
+ if event.text:
202
+ self._on_paste_text(event.text)
203
+
204
+
181
205
  class CodingAgentApp(App[None]):
182
206
  """Cursor-like agent transcript."""
183
207
 
@@ -459,13 +483,14 @@ class CodingAgentApp(App[None]):
459
483
  yield Static("", id="status")
460
484
  yield Static("", id="complete-hint")
461
485
  yield ImagePreview(id="image-preview")
462
- yield Input(
486
+ yield PromptInput(
463
487
  placeholder=f"{_MARK_INPUT} Build anything (/ for commands, Tab complete)",
464
488
  id="prompt",
465
489
  suggester=make_textual_suggester(
466
490
  self._prompt.complete_ctx,
467
491
  workspace=self.project_root,
468
492
  ),
493
+ on_paste_text=self._prompt.insert_pasted_text,
469
494
  )
470
495
  yield Static("", id="bottombar")
471
496
 
@@ -0,0 +1,94 @@
1
+ """Tests for clipboard reading helpers (multimodal).
2
+
3
+ Focuses on Linux/WSLg clipboard image/text reads: WSLg syncs Windows bitmap
4
+ data as ``image/bmp``, which the reader must accept and normalize to PNG.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from io import BytesIO
10
+
11
+ from PIL import Image
12
+
13
+ from synapse.content import multimodal
14
+
15
+
16
+ def _make_bmp_bytes() -> bytes:
17
+ im = Image.new("RGB", (2, 2), (255, 0, 0))
18
+ buf = BytesIO()
19
+ im.save(buf, format="BMP")
20
+ return buf.getvalue()
21
+
22
+
23
+ def test_normalize_image_bytes_png_passthrough() -> None:
24
+ png = b"\x89PNG\r\n\x1a\n" + b"\x00" * 32
25
+ data, mime = multimodal._normalize_image_bytes(png, "image/png")
26
+ assert data == png
27
+ assert mime == "image/png"
28
+
29
+
30
+ def test_normalize_image_bytes_bmp_to_png() -> None:
31
+ bmp = _make_bmp_bytes()
32
+ data, mime = multimodal._normalize_image_bytes(bmp, "image/bmp")
33
+ assert mime == "image/png"
34
+ assert data[:8] == b"\x89PNG\r\n\x1a\n"
35
+
36
+
37
+ def test_linux_clipboard_image_reads_bmp(monkeypatch) -> None:
38
+ bmp = _make_bmp_bytes()
39
+ seen: list[list[str]] = []
40
+
41
+ def fake_run(cmd, timeout=3.0):
42
+ seen.append(list(cmd))
43
+ if cmd[0] == "wl-paste" and cmd[2] == "image/bmp":
44
+ return bmp
45
+ return None
46
+
47
+ monkeypatch.setattr(multimodal, "_run_capture", fake_run)
48
+
49
+ result = multimodal._linux_clipboard_image()
50
+
51
+ assert result is not None
52
+ data, mime, name = result
53
+ assert mime == "image/png"
54
+ assert data[:8] == b"\x89PNG\r\n\x1a\n"
55
+ assert name == "clipboard.png"
56
+ assert any(c[2] == "image/bmp" for c in seen)
57
+
58
+
59
+ def test_read_clipboard_text_linux_requests_explicit_text_type(monkeypatch) -> None:
60
+ seen: list[list[str]] = []
61
+
62
+ def fake_run(cmd, timeout=3.0):
63
+ seen.append(list(cmd))
64
+ if cmd[0] == "wl-paste":
65
+ return b"hello"
66
+ return None
67
+
68
+ monkeypatch.setattr(multimodal.os, "name", "posix")
69
+ monkeypatch.setattr(multimodal, "sys_platform", lambda: "linux")
70
+ monkeypatch.setattr(multimodal, "_run_capture", fake_run)
71
+
72
+ assert multimodal._read_clipboard_text() == "hello"
73
+ assert seen[0][0:3] == ["wl-paste", "-n", "-t"]
74
+ assert "text/plain" in seen[0]
75
+
76
+
77
+ def test_looks_like_image_data_detects_bmp_bytes() -> None:
78
+ bmp = _make_bmp_bytes()
79
+ # Textual decodes terminal bytes lossily; non-ASCII bytes become U+FFFD.
80
+ text = bmp.decode("utf-8", errors="replace")
81
+ assert multimodal.looks_like_image_data(text) is True
82
+
83
+
84
+ def test_looks_like_image_data_detects_terminal_mangled_bmp_prefix() -> None:
85
+ # Some terminal paste paths expose a BMP prefix as BP instead of BM.
86
+ text = "BP" + "\ufffd" * 250
87
+ assert multimodal.looks_like_image_data(text) is True
88
+
89
+
90
+ def test_looks_like_image_data_rejects_normal_text() -> None:
91
+ assert multimodal.looks_like_image_data("BMW is a car brand") is False
92
+ assert multimodal.looks_like_image_data("BP is an energy company") is False
93
+ assert multimodal.looks_like_image_data("hello world") is False
94
+ assert multimodal.looks_like_image_data("") is False
@@ -210,3 +210,54 @@ def test_paste_clipboard_stores_large_text_as_placeholder() -> None:
210
210
  assert "500 chars]" in app.prompt.value
211
211
  assert controller.state.paste_replacements[app.prompt.value.strip()] == big
212
212
  assert "pasted text truncated" in app.events[-1]
213
+
214
+
215
+ def test_insert_pasted_text_multiline_becomes_placeholder() -> None:
216
+ controller, app = _make_controller()
217
+ body = "line one\nline two\nline three"
218
+
219
+ controller.insert_pasted_text(body)
220
+
221
+ assert app.prompt.value == "[line one line two li... 28 chars]"
222
+ assert controller.state.paste_replacements[app.prompt.value] == body
223
+ assert "pasted text truncated" in app.events[-1]
224
+
225
+
226
+ def test_insert_pasted_text_short_appends_directly() -> None:
227
+ controller, app = _make_controller()
228
+ app.prompt.value = "prefix "
229
+
230
+ controller.insert_pasted_text("hello")
231
+
232
+ assert app.prompt.value == "prefix hello"
233
+ assert controller.state.paste_replacements == {}
234
+ assert app.prompt.focused is True
235
+
236
+
237
+ def test_insert_pasted_text_image_bytes_falls_back_to_clipboard(monkeypatch) -> None:
238
+ controller, app = _make_controller()
239
+ called: list[bool] = []
240
+ monkeypatch.setattr(
241
+ controller, "_paste_clipboard_image_only", lambda: called.append(True)
242
+ )
243
+
244
+ # BMP magic prefix plus binary noise (as delivered by terminal paste).
245
+ controller.insert_pasted_text("BM" + "\ufffd" * 200)
246
+
247
+ assert called == [True]
248
+ assert app.prompt.value == ""
249
+ assert controller.state.paste_replacements == {}
250
+
251
+
252
+ def test_insert_pasted_text_mangled_bmp_falls_back_to_clipboard(monkeypatch) -> None:
253
+ controller, app = _make_controller()
254
+ called: list[bool] = []
255
+ monkeypatch.setattr(
256
+ controller, "_paste_clipboard_image_only", lambda: called.append(True)
257
+ )
258
+
259
+ controller.insert_pasted_text("BP" + "\ufffd" * 250)
260
+
261
+ assert called == [True]
262
+ assert app.prompt.value == ""
263
+ assert controller.state.paste_replacements == {}
@@ -0,0 +1,56 @@
1
+ """Tests for PromptInput terminal-native paste routing.
2
+
3
+ Shift+Insert / middle-click paste arrives as a bracketed-paste ``Paste`` event.
4
+ The stock ``Input`` keeps only the first line; ``PromptInput`` must forward the
5
+ full text to the prompt controller, stop propagation, and prevent the parent
6
+ ``Input._on_paste`` from running (named handlers are not deduplicated across the
7
+ MRO, so ``stop()`` alone is insufficient).
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from textual.events import Paste
13
+
14
+ from synapse.ui.tui import PromptInput
15
+
16
+
17
+ def test_prompt_input_routes_full_multiline_paste() -> None:
18
+ received: list[str] = []
19
+ inp = PromptInput(on_paste_text=received.append)
20
+
21
+ event = Paste("alpha\nbeta\ngamma")
22
+ inp._on_paste(event)
23
+
24
+ assert event._stop_propagation is True
25
+ assert event._no_default_action is True
26
+ assert received == ["alpha\nbeta\ngamma"]
27
+
28
+
29
+ def test_prompt_input_ignores_empty_paste() -> None:
30
+ received: list[str] = []
31
+ inp = PromptInput(on_paste_text=received.append)
32
+
33
+ event = Paste("")
34
+ inp._on_paste(event)
35
+
36
+ assert event._stop_propagation is True
37
+ assert event._no_default_action is True
38
+ assert received == []
39
+
40
+
41
+ def test_prompt_input_prevents_parent_default_handler() -> None:
42
+ """The parent ``Input._on_paste`` must not run after our handler."""
43
+ received: list[str] = []
44
+ inp = PromptInput(on_paste_text=received.append)
45
+
46
+ event = Paste("line1\nline2")
47
+ methods = inp._get_dispatch_methods(Paste.handler_name, event)
48
+
49
+ first_cls, first_method = next(methods)
50
+ assert first_cls is PromptInput
51
+ first_method(event)
52
+
53
+ # prevent_default() inside our handler must stop the dispatch generator
54
+ # from yielding the inherited Input._on_paste.
55
+ assert list(methods) == []
56
+ assert received == ["line1\nline2"]
@@ -1,22 +0,0 @@
1
- ## v0.1.33
2
-
3
- ### New Features
4
-
5
- - Added per-subagent model and reasoning-effort configuration in the TUI, with layered configuration and display metadata for subagent tool calls.
6
- - Improved subagent activity rendering with live reasoning, tool-calling, and answering phases, including attribution for concurrent activity.
7
-
8
- ### Bug Fixes
9
-
10
- - Fixed subagent tool-call inheritance and model selection behavior.
11
- - Enforced non-overridable file-tool path rules in subagent prompts.
12
- - Fixed TUI model and subagent picker keyboard interactions.
13
- - Fixed subagent sub-call display windows so recent calls remain visible as new calls arrive.
14
- - Fixed long-line Ruff violations in selectable-text and cancellation status rendering.
15
-
16
- ### Engineering
17
-
18
- - Simplified subagent specifications and removed the obsolete DAG parallel-subagent runtime.
19
- - Improved TUI responsiveness by batching session replay and moving blocking work off the event loop.
20
- - Updated the bundled `synapse-core-tool` dependency metadata to v0.1.3.
21
-
22
- ---