synapse-cli-agent 0.1.38__tar.gz → 0.1.39__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 (571) hide show
  1. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.github/workflows/release.yml +1 -0
  2. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/AGENTS.md +3 -2
  3. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/CHANGELOG.md +22 -0
  4. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/PKG-INFO +1 -1
  5. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/README.zh-CN.md +0 -1
  6. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/architecture-flow.md +1 -1
  7. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/config.md +0 -7
  8. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/design.md +3 -1
  9. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/skills.md +11 -11
  10. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/tool-output-transform.md +4 -2
  11. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/tutorial.md +12 -12
  12. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/pyproject.toml +1 -1
  13. synapse_cli_agent-0.1.39/release_body.md +21 -0
  14. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/app/agent_assembly.py +16 -23
  15. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/model.py +25 -11
  16. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/slash_cmds.py +11 -4
  17. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/http_clients.py +5 -0
  18. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/rust_openai.py +33 -4
  19. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/debug_server.py +8 -1
  20. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/model_request_compression_middleware.py +39 -5
  21. synapse_cli_agent-0.1.39/src/synapse/runtime/session_header_middleware.py +52 -0
  22. synapse_cli_agent-0.1.39/src/synapse/runtime/session_headers.py +95 -0
  23. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/subagent_specs.py +7 -0
  24. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/subagents.py +2 -24
  25. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/tool_output_middleware.py +4 -1
  26. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/__init__.py +2 -0
  27. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/store.py +72 -0
  28. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/settings/schema.py +1 -40
  29. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tools/session_tools.py +9 -4
  30. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/controller.py +8 -1
  31. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/prompt_controller.py +3 -6
  32. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/tui.py +25 -0
  33. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_capabilities.py +68 -0
  34. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_config.py +1 -1
  35. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_prompt_controller.py +51 -0
  36. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_rust_openai_model.py +112 -0
  37. synapse_cli_agent-0.1.39/tests/test_session_headers.py +248 -0
  38. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_slash_effects.py +120 -1
  39. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/uv.lock +1 -1
  40. synapse_cli_agent-0.1.38/release_body.md +0 -21
  41. synapse_cli_agent-0.1.38/src/synapse/runtime/tool_response_truncate_middleware.py +0 -236
  42. synapse_cli_agent-0.1.38/tests/test_tool_response_truncate_middleware.py +0 -206
  43. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.dockerignore +0 -0
  44. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.github/workflows/ci.yml +0 -0
  45. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.github/workflows/docs.yml +0 -0
  46. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.github/workflows/native-compression-wheels.yml +0 -0
  47. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.github/workflows/native-core-tool-wheels.yml +0 -0
  48. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.gitignore +0 -0
  49. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.python-version +0 -0
  50. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.readthedocs.yaml +0 -0
  51. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.zed/settings.json +0 -0
  52. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/Dockerfile.web +0 -0
  53. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/LICENSE +0 -0
  54. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/README.md +0 -0
  55. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/agent_upstream.txt +0 -0
  56. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/approval-behavior.md +0 -0
  57. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/assets/demo.gif +0 -0
  58. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/assets/synapse-logo.svg +0 -0
  59. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/assets/tui-preview.png +0 -0
  60. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/cli_upstream.txt +0 -0
  61. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/debug_compact.py +0 -0
  62. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/decode_screenshot.py +0 -0
  63. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/capability-matrix.md +0 -0
  64. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/decisions.md +0 -0
  65. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/index.md +0 -0
  66. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-0-protocol-baseline.md +0 -0
  67. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-1-core-transport.md +0 -0
  68. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-2-prompt-semantics.md +0 -0
  69. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-3-permissions.md +0 -0
  70. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-4-session-lifecycle.md +0 -0
  71. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-5-session-mcp.md +0 -0
  72. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-6-client-services.md +0 -0
  73. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-7-advanced-capabilities.md +0 -0
  74. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-8-compliance.md +0 -0
  75. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/progress.md +0 -0
  76. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-development-guide.md +0 -0
  77. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/baseline-report.md +0 -0
  78. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/decisions.md +0 -0
  79. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/index.md +0 -0
  80. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/migration.md +0 -0
  81. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-0-baseline.md +0 -0
  82. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-1-streaming-core.md +0 -0
  83. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-2-turn-runtime.md +0 -0
  84. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-3-tui-cutover.md +0 -0
  85. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-4-session-runtime.md +0 -0
  86. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-5-multi-session.md +0 -0
  87. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-6-project-runtime.md +0 -0
  88. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-7-global-control-plane.md +0 -0
  89. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-8-hardening.md +0 -0
  90. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/post-review-fix-plan.md +0 -0
  91. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/progress.md +0 -0
  92. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/architecture.md +0 -0
  93. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/cli.md +0 -0
  94. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/codex-session-discovery-phase-1.md +0 -0
  95. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/codex-session-import-phase-2.md +0 -0
  96. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/docker-web.md +0 -0
  97. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/index.md +0 -0
  98. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/install.md +0 -0
  99. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/math-formulas-test.md +0 -0
  100. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/mcp.md +0 -0
  101. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/models.md +0 -0
  102. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/native-compression-core.md +0 -0
  103. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/native-core-tool.md +0 -0
  104. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/permissions.md +0 -0
  105. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/quickstart.md +0 -0
  106. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/sessions.md +0 -0
  107. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/smith_output.md +0 -0
  108. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/subagents.md +0 -0
  109. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/tui-cursor-refactor.md +0 -0
  110. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/x-agent-development-guide.md +0 -0
  111. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/examples/mcp.example.json +0 -0
  112. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/examples/models.example.json +0 -0
  113. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/examples/settings.example.json +0 -0
  114. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/middleware_upstream.txt +0 -0
  115. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/mkdocs.yml +0 -0
  116. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/Cargo.lock +0 -0
  117. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/Cargo.toml +0 -0
  118. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/LICENSE +0 -0
  119. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/NOTICE +0 -0
  120. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/README.md +0 -0
  121. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/pyproject.toml +0 -0
  122. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/python/synapse_core_tool/__init__.py +0 -0
  123. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/file_access.rs +0 -0
  124. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/file_tools.rs +0 -0
  125. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/lib.rs +0 -0
  126. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/llm.rs +0 -0
  127. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/math_render.rs +0 -0
  128. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/search.rs +0 -0
  129. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/uv.lock +0 -0
  130. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/Cargo.lock +0 -0
  131. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/Cargo.toml +0 -0
  132. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/LICENSE +0 -0
  133. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/NOTICE +0 -0
  134. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/README.md +0 -0
  135. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/pyproject.toml +0 -0
  136. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/python/synapse_tool_compress_core/__init__.py +0 -0
  137. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/ccr.rs +0 -0
  138. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/ccr_in_memory.rs +0 -0
  139. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/mod.rs +0 -0
  140. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/relevance/base.rs +0 -0
  141. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/relevance/bm25.rs +0 -0
  142. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/signals/keyword_detector.rs +0 -0
  143. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/signals/line_importance.rs +0 -0
  144. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/adaptive_sizer.rs +0 -0
  145. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/anchor_selector.rs +0 -0
  146. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/code_compressor.rs +0 -0
  147. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/diff_compressor.rs +0 -0
  148. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/log_compressor.rs +0 -0
  149. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/search_compressor.rs +0 -0
  150. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/analyzer.rs +0 -0
  151. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/anchors.rs +0 -0
  152. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/builder.rs +0 -0
  153. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/classifier.rs +0 -0
  154. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/classifier.rs +0 -0
  155. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/compactor.rs +0 -0
  156. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/formatter.rs +0 -0
  157. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/ir.rs +0 -0
  158. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/mod.rs +0 -0
  159. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/walker.rs +0 -0
  160. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/config.rs +0 -0
  161. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/constraints.rs +0 -0
  162. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crusher.rs +0 -0
  163. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crushers.rs +0 -0
  164. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/error_keywords.rs +0 -0
  165. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/field_detect.rs +0 -0
  166. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/hashing.rs +0 -0
  167. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/mod.rs +0 -0
  168. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/observer.rs +0 -0
  169. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/orchestration.rs +0 -0
  170. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/outliers.rs +0 -0
  171. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/planning.rs +0 -0
  172. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/statistics.rs +0 -0
  173. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/stats_math.rs +0 -0
  174. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/traits.rs +0 -0
  175. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/types.rs +0 -0
  176. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/lib.rs +0 -0
  177. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/scripts/install.ps1 +0 -0
  178. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/scripts/release.ps1 +0 -0
  179. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/scripts/serve_web.py +0 -0
  180. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/slash_cmds_upstream.txt +0 -0
  181. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/__init__.py +0 -0
  182. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/__main__.py +0 -0
  183. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/__init__.py +0 -0
  184. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/agent.py +0 -0
  185. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/client_services.py +0 -0
  186. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/content.py +0 -0
  187. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/events.py +0 -0
  188. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/lifecycle.py +0 -0
  189. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/mcp.py +0 -0
  190. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/permissions.py +0 -0
  191. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/server.py +0 -0
  192. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/sessions.py +0 -0
  193. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/updates.py +0 -0
  194. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/app/__init__.py +0 -0
  195. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/app/agent.py +0 -0
  196. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/app/agent_md.py +0 -0
  197. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/cli.py +0 -0
  198. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/__init__.py +0 -0
  199. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/compression.py +0 -0
  200. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/goal.py +0 -0
  201. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/helpers.py +0 -0
  202. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/mcp.py +0 -0
  203. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/result.py +0 -0
  204. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/sessions.py +0 -0
  205. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/slash_complete.py +0 -0
  206. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/theme.py +0 -0
  207. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/config.py +0 -0
  208. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/content/__init__.py +0 -0
  209. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/content/input_history.py +0 -0
  210. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/content/multimodal.py +0 -0
  211. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/content/prompts.py +0 -0
  212. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/content/skills_catalog.py +0 -0
  213. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/entry.py +0 -0
  214. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/__init__.py +0 -0
  215. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/middleware.py +0 -0
  216. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/model.py +0 -0
  217. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/runtime.py +0 -0
  218. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/steering.py +0 -0
  219. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/store.py +0 -0
  220. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/tools.py +0 -0
  221. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/__init__.py +0 -0
  222. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/checkpoint_seed.py +0 -0
  223. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/codex_config.py +0 -0
  224. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/codex_history.py +0 -0
  225. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/codex_import.py +0 -0
  226. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/codex_sessions.py +0 -0
  227. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/describe_image.py +0 -0
  228. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/herdr.py +0 -0
  229. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/llm_openai_compat.py +0 -0
  230. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/llm_openai_websocket.py +0 -0
  231. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/mcp_client.py +0 -0
  232. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/openai_oauth.py +0 -0
  233. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/openai_oauth_middleware.py +0 -0
  234. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/openai_usage.py +0 -0
  235. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/turbo.py +0 -0
  236. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/vision_middleware.py +0 -0
  237. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/memory/__init__.py +0 -0
  238. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/memory/auto_recorder.py +0 -0
  239. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/memory/embedder.py +0 -0
  240. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/memory/long_term.py +0 -0
  241. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/__init__.py +0 -0
  242. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/config.py +0 -0
  243. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/helpers.py +0 -0
  244. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/persist.py +0 -0
  245. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/profile.py +0 -0
  246. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/providers.py +0 -0
  247. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/registry.py +0 -0
  248. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models_registry.py +0 -0
  249. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/__init__.py +0 -0
  250. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/debug_inspector.html +0 -0
  251. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/exit_trace.py +0 -0
  252. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/heap_dump.py +0 -0
  253. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/llm_debug.py +0 -0
  254. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/startup_trace.py +0 -0
  255. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/planner/__init__.py +0 -0
  256. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/planner/task_planner.py +0 -0
  257. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/projects/__init__.py +0 -0
  258. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/projects/catalog.py +0 -0
  259. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/rag/__init__.py +0 -0
  260. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/rag/knowledge_base.py +0 -0
  261. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/__init__.py +0 -0
  262. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/agent_loop/__init__.py +0 -0
  263. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/agent_loop/model.py +0 -0
  264. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/agent_loop/request.py +0 -0
  265. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/agent_loop/turn.py +0 -0
  266. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/async_runtime.py +0 -0
  267. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/backends.py +0 -0
  268. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/cancellation.py +0 -0
  269. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/context_compact.py +0 -0
  270. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/debug_capture_middleware.py +0 -0
  271. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/execute_capture.py +0 -0
  272. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/filesystem_tool_prompt_middleware.py +0 -0
  273. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/fs_permissions.py +0 -0
  274. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/harness.py +0 -0
  275. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/hitl.py +0 -0
  276. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/interaction_ledger.py +0 -0
  277. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/middleware.py +0 -0
  278. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/pathing.py +0 -0
  279. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/projects/__init__.py +0 -0
  280. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/projects/identity.py +0 -0
  281. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/projects/runtime.py +0 -0
  282. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/safety.py +0 -0
  283. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/session_prewarm.py +0 -0
  284. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/__init__.py +0 -0
  285. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/events.py +0 -0
  286. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/manager.py +0 -0
  287. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/persistence.py +0 -0
  288. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/ref.py +0 -0
  289. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/runtime.py +0 -0
  290. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/steer.py +0 -0
  291. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/__init__.py +0 -0
  292. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/accumulator.py +0 -0
  293. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/adapters.py +0 -0
  294. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/events.py +0 -0
  295. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/parser.py +0 -0
  296. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/protocol.py +0 -0
  297. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/runtime.py +0 -0
  298. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/stream_events.py +0 -0
  299. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/tool_model.py +0 -0
  300. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/subagent_config_persist.py +0 -0
  301. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/timeline.py +0 -0
  302. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/token_rate.py +0 -0
  303. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/tool_ignore.py +0 -0
  304. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/tool_output_eval.py +0 -0
  305. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/tool_output_usage_middleware.py +0 -0
  306. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/cancel_repair.py +0 -0
  307. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/search_index.py +0 -0
  308. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/summary.py +0 -0
  309. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/transcript.py +0 -0
  310. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/transcript_migration.py +0 -0
  311. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/transcript_projection.py +0 -0
  312. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/settings/__init__.py +0 -0
  313. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/settings/config_paths.py +0 -0
  314. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/subagents.py +0 -0
  315. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/__init__.py +0 -0
  316. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/detection.py +0 -0
  317. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/metrics.py +0 -0
  318. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/models.py +0 -0
  319. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/pipeline.py +0 -0
  320. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/repository.py +0 -0
  321. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/transformers.py +0 -0
  322. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tools/__init__.py +0 -0
  323. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tools/describe_image.py +0 -0
  324. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tools/filesystem_patch.py +0 -0
  325. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tools/filesystem_search.py +0 -0
  326. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/__init__.py +0 -0
  327. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/agent_lifecycle.py +0 -0
  328. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/answer_divider.py +0 -0
  329. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/approval.py +0 -0
  330. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/__init__.py +0 -0
  331. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/__init__.py +0 -0
  332. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/codex_usage.py +0 -0
  333. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/fast.py +0 -0
  334. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/goal.py +0 -0
  335. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/key_hints.py +0 -0
  336. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/mcp.py +0 -0
  337. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/mode.py +0 -0
  338. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/model.py +0 -0
  339. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/thread.py +0 -0
  340. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/turbo.py +0 -0
  341. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/turn_stats.py +0 -0
  342. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/context.py +0 -0
  343. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/core.py +0 -0
  344. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/chrome/__init__.py +0 -0
  345. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/chrome/controller.py +0 -0
  346. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/clipboard.py +0 -0
  347. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/__init__.py +0 -0
  348. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/active_session_switcher.py +0 -0
  349. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/base.py +0 -0
  350. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/codex_config_import.py +0 -0
  351. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/codex_reset.py +0 -0
  352. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/codex_session_list.py +0 -0
  353. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/compression_diagnostics.py +0 -0
  354. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/git_explore.py +0 -0
  355. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/mcp_panel.py +0 -0
  356. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/model_form.py +0 -0
  357. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/model_manager.py +0 -0
  358. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/model_picker.py +0 -0
  359. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/provider_catalog.py +0 -0
  360. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/safety_panel.py +0 -0
  361. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/session_list.py +0 -0
  362. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/subagent_config.py +0 -0
  363. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/theme_designer.py +0 -0
  364. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/theme_picker.py +0 -0
  365. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/drawer.py +0 -0
  366. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/formatters.py +0 -0
  367. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/git_explore/__init__.py +0 -0
  368. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/git_explore/engine.py +0 -0
  369. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/git_explore/provider.py +0 -0
  370. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/git_explore/unified.py +0 -0
  371. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/image_preview.py +0 -0
  372. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/image_render.py +0 -0
  373. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/image_viewer.py +0 -0
  374. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/math_image.py +0 -0
  375. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/mermaid_image.py +0 -0
  376. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/rendering.py +0 -0
  377. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/selectable_static.py +0 -0
  378. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/selectable_text.py +0 -0
  379. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/sink.py +0 -0
  380. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/status_controller.py +0 -0
  381. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/steer_controller.py +0 -0
  382. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/steer_widget.py +0 -0
  383. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/stream.py +0 -0
  384. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/stream_events.py +0 -0
  385. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/stream_runtime.py +0 -0
  386. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/textual_lifecycle.py +0 -0
  387. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/textual_stream_sink.py +0 -0
  388. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/theme.py +0 -0
  389. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/theme_controller.py +0 -0
  390. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/timeline.py +0 -0
  391. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/tool_blocks.py +0 -0
  392. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/__init__.py +0 -0
  393. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/__init__.py +0 -0
  394. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/branch.py +0 -0
  395. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/title.py +0 -0
  396. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/tool_output.py +0 -0
  397. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/usage.py +0 -0
  398. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/workspace.py +0 -0
  399. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/context.py +0 -0
  400. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/core.py +0 -0
  401. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/git_changes_popover.py +0 -0
  402. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/git_chrome.py +0 -0
  403. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/tool_output_popover.py +0 -0
  404. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/widget.py +0 -0
  405. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript/__init__.py +0 -0
  406. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript/controller.py +0 -0
  407. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript/factory.py +0 -0
  408. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript/history.py +0 -0
  409. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript/state.py +0 -0
  410. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript_blocks.py +0 -0
  411. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/tui_launch.py +0 -0
  412. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/tui_styles.py +0 -0
  413. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/__init__.py +0 -0
  414. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/controller.py +0 -0
  415. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/event_bridge.py +0 -0
  416. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/event_renderer.py +0 -0
  417. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/persistence.py +0 -0
  418. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/request.py +0 -0
  419. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn_rail.py +0 -0
  420. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn_rail_widgets.py +0 -0
  421. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/user_turn.py +0 -0
  422. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/user_turn_block.py +0 -0
  423. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/welcome.py +0 -0
  424. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/web.py +0 -0
  425. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/synapse.cmd +0 -0
  426. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/__init__.py +0 -0
  427. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/acp/initialize.jsonl +0 -0
  428. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/agent_stream/core_scenarios.json +0 -0
  429. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/duplicate_response_item.jsonl +0 -0
  430. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/incomplete_and_aborted.jsonl +0 -0
  431. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/legacy_compaction.jsonl +0 -0
  432. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/normal_completed.jsonl +0 -0
  433. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/replacement_history.jsonl +0 -0
  434. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/rollback.jsonl +0 -0
  435. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/unsupported_replacement.jsonl +0 -0
  436. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/sample_repo/calculator.py +0 -0
  437. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/sample_repo/test_calculator.py +0 -0
  438. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/tool_output_eval.json +0 -0
  439. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test.py +0 -0
  440. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p0_baseline.py +0 -0
  441. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p1_core.py +0 -0
  442. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p1_transport.py +0 -0
  443. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p2_content.py +0 -0
  444. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p2_events.py +0 -0
  445. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p2_updates.py +0 -0
  446. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p3_agent.py +0 -0
  447. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p3_permissions.py +0 -0
  448. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p4_history.py +0 -0
  449. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p4_lifecycle.py +0 -0
  450. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p5_mcp.py +0 -0
  451. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p6_client_services.py +0 -0
  452. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p8_compliance.py +0 -0
  453. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_agent_factory.py +0 -0
  454. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_agent_lifecycle.py +0 -0
  455. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_agent_turn_runtime.py +0 -0
  456. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_approval.py +0 -0
  457. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_async_checkpointer.py +0 -0
  458. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_backends.py +0 -0
  459. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_bottombar_registry.py +0 -0
  460. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_cancel_repair.py +0 -0
  461. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_checkpoint_seed.py +0 -0
  462. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_chrome_controller.py +0 -0
  463. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_cli.py +0 -0
  464. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_cli_codex_import.py +0 -0
  465. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_clipboard.py +0 -0
  466. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_codex_config.py +0 -0
  467. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_codex_history.py +0 -0
  468. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_codex_import.py +0 -0
  469. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_codex_sessions.py +0 -0
  470. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_codex_sessions_windows.py +0 -0
  471. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_compact_tool_descriptions.py +0 -0
  472. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_context_compact.py +0 -0
  473. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_context_window.py +0 -0
  474. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_debug_capture_middleware.py +0 -0
  475. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_debug_inspector.py +0 -0
  476. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_describe_image.py +0 -0
  477. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_dialogs.py +0 -0
  478. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_entry.py +0 -0
  479. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_filesystem_patch_tool.py +0 -0
  480. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_filesystem_search_tools.py +0 -0
  481. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_git_changes_popover.py +0 -0
  482. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_git_chrome.py +0 -0
  483. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_git_explore.py +0 -0
  484. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_goal_live_tui.py +0 -0
  485. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_goals.py +0 -0
  486. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_heap_dump.py +0 -0
  487. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_herdr_integration.py +0 -0
  488. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_http_clients.py +0 -0
  489. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_image_render.py +0 -0
  490. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_image_viewer.py +0 -0
  491. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_input_history.py +0 -0
  492. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_iteration_abc.py +0 -0
  493. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_layered_config.py +0 -0
  494. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_math_image_render.py +0 -0
  495. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_mcp_schema.py +0 -0
  496. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_mermaid_image.py +0 -0
  497. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_mermaid_render.py +0 -0
  498. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_middleware_async.py +0 -0
  499. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_model_dialogs.py +0 -0
  500. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_model_providers.py +0 -0
  501. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_model_request_compression_middleware.py +0 -0
  502. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_model_retry.py +0 -0
  503. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_models_persist.py +0 -0
  504. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_multimodal.py +0 -0
  505. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_native_math_render.py +0 -0
  506. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_openai_compat_reasoning.py +0 -0
  507. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_openai_oauth.py +0 -0
  508. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_openai_oauth_middleware.py +0 -0
  509. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_openai_usage.py +0 -0
  510. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_openai_websocket.py +0 -0
  511. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_pathing.py +0 -0
  512. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_project_catalog.py +0 -0
  513. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_project_drawer.py +0 -0
  514. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_project_runtime.py +0 -0
  515. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_project_switch.py +0 -0
  516. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_prompts.py +0 -0
  517. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_runtime_hardening.py +0 -0
  518. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_runtime_manager.py +0 -0
  519. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_runtime_streaming.py +0 -0
  520. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_safety.py +0 -0
  521. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_search_index.py +0 -0
  522. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_session_prewarm.py +0 -0
  523. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_session_runtime.py +0 -0
  524. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_session_store.py +0 -0
  525. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_session_summary.py +0 -0
  526. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_slash_and_mcp.py +0 -0
  527. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_slash_complete.py +0 -0
  528. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_startup_defer.py +0 -0
  529. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_startup_trace.py +0 -0
  530. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_steer.py +0 -0
  531. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_steer_controller.py +0 -0
  532. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_stream_cancel.py +0 -0
  533. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_stream_semantic_fixtures.py +0 -0
  534. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_stream_tool_items.py +0 -0
  535. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_stream_ui.py +0 -0
  536. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_subagent_config_dialog.py +0 -0
  537. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_subagent_config_persist.py +0 -0
  538. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_subagent_status.py +0 -0
  539. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_subagents.py +0 -0
  540. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_textual_stream_sink.py +0 -0
  541. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_theme.py +0 -0
  542. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_theme_controller.py +0 -0
  543. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_timeline.py +0 -0
  544. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_token_rate.py +0 -0
  545. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_blocks.py +0 -0
  546. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_ignore.py +0 -0
  547. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_intent.py +0 -0
  548. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_output.py +0 -0
  549. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_output_eval.py +0 -0
  550. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_output_slash.py +0 -0
  551. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_output_usage_middleware.py +0 -0
  552. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_topbar_context_ratio.py +0 -0
  553. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_topbar_registry.py +0 -0
  554. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript.py +0 -0
  555. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript_controller.py +0 -0
  556. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript_history.py +0 -0
  557. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript_history_controller.py +0 -0
  558. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript_migration.py +0 -0
  559. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript_projection.py +0 -0
  560. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tui_active_session_switcher.py +0 -0
  561. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tui_codex_import.py +0 -0
  562. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tui_paste.py +0 -0
  563. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tui_selection.py +0 -0
  564. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_turn_controller.py +0 -0
  565. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_turn_event_renderer.py +0 -0
  566. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_turn_rail_minimap.py +0 -0
  567. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_turn_request.py +0 -0
  568. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_usage_restore.py +0 -0
  569. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_user_turn_style.py +0 -0
  570. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_welcome.py +0 -0
  571. {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/tool_output_plugin_fixture.py +0 -0
@@ -102,6 +102,7 @@ jobs:
102
102
  --collect-all termaid `
103
103
  --collect-all texicode `
104
104
  --collect-all synapse_tool_compress_core `
105
+ --collect-data synapse `
105
106
  src/synapse/entry.py
106
107
 
107
108
  - name: Rename executable for artifact
@@ -4,7 +4,8 @@
4
4
 
5
5
  | Path | Responsibility |
6
6
  | --- | --- |
7
- | `src/synapse/app/` | Agent assembly and `AGENTS.md` injection |
7
+ | `src/synapse/app/` | Agent assembly (composition root in `agent.py`, contracts in `agent_assembly.py`) and `AGENTS.md` injection |
8
+ | `src/synapse/acp/` | Official Agent Client Protocol (ACP) adapter: run Synapse as an ACP agent over stdio; session registry, permission coordinator, event bridge |
8
9
  | `src/synapse/commands/` | Slash command parsing, completion, and results |
9
10
  | `src/synapse/content/` | Prompts, skills, input history, multimodal content |
10
11
  | `src/synapse/goals/` | Goal accounting, steering, and persistence |
@@ -29,7 +30,7 @@
29
30
 
30
31
  ## Architecture & compatibility
31
32
 
32
- - `src/synapse/app/agent.py` is the assembly layer; keep domain algorithms in their own packages.
33
+ - `src/synapse/app/agent.py` is the assembly composition root; the reusable assembly contracts (middleware build, typed resource wiring) live in `src/synapse/app/agent_assembly.py`. Keep domain algorithms in their own packages.
33
34
  - New features belong in the matching domain package; cross-domain wiring goes in `app/` or an explicit runtime middleware.
34
35
  - `src/synapse/config.py` is a compatibility re-export layer. Import from `synapse.settings` in new code; keep legacy import paths working.
35
36
  - `__init__.py` exports are public API. Keep necessary re-exports when moving implementations.
@@ -8,6 +8,28 @@ All entries are written in English.
8
8
 
9
9
  ---
10
10
 
11
+ ## v0.1.39
12
+
13
+ ### New Features
14
+
15
+ - Stamped session-affinity headers on model requests in both the Python runtime and the native Rust OpenAI client, for consistent session binding at upstream gateways.
16
+ - Added a `session-cache-analysis` skill for computing per-session prompt cache hit rates and diagnosing cache eviction.
17
+
18
+ ### Bug Fixes
19
+
20
+ - Hashed tools by their OpenAI wire form instead of the raw `StructuredTool` dump, keeping `tools_hash`/`schema_hash` stable across agent rebuilds (previously embedded the function object's memory address).
21
+ - Inserted pasted text at the cursor position in the TUI prompt instead of appending.
22
+ - Persisted the model binding before agent rebuild and on exit.
23
+ - Loaded the debug inspector HTML via `importlib.resources` for frozen (PyInstaller) builds.
24
+
25
+ ### Engineering
26
+
27
+ - Removed the tool-response truncation middleware and its settings.
28
+ - Deprecated the reversible compression middleware and reader.
29
+ - Kept the AGENTS.md repository-layout table in sync with the current tree.
30
+
31
+ ---
32
+
11
33
  ## v0.1.38
12
34
 
13
35
  ### New Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: synapse-cli-agent
3
- Version: 0.1.38
3
+ Version: 0.1.39
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
@@ -415,7 +415,6 @@ uv run synapse run "修复 calculator.sub 的 bug,使 tests 全部通过" -w t
415
415
  | `AGENT_MCP_CONFIG` | - | MCP servers JSON |
416
416
  | `CHECKPOINT_BACKEND` | `sqlite` | `sqlite` 或 `memory` |
417
417
  | `AGENT_SESSION_PREWARM_ENABLED` | `false` | 恢复大上下文会话后在后台预热 provider 缓存(首次请求仍按输入 token 计费;详见 `docs/config.md`) |
418
- | `AGENT_ENABLE_TOOL_RESPONSE_TRUNCATE` | `false` | 启用工具响应折叠(keep 窗口外的大工具输出压成摘要+引用,大上下文会话可省 20-30%;详见 `docs/config.md`) |
419
418
  | `INHERIT_ENV` | `true` | shell 继承主机环境 |
420
419
  | `VIRTUAL_MODE` | `true` | 文件路径虚拟根 |
421
420
  | `AGENT_SHOW_REASONING_PLACEHOLDERS` | `true` | 是否显示网关未暴露推理文本时的占位思考节点;Codex 加密推理可设为 `false` 隐藏 |
@@ -467,7 +467,7 @@ load_settings(**overrides):
467
467
  | 工作区 | workspace, shell_timeout(120s), max_output_bytes(100KB) | Path.cwd() |
468
468
  | 安全 | require_approval(False), safety_profile("dev-autopass") | -- |
469
469
  | 检查点 | checkpoint_backend("sqlite") | project/.synapse/ |
470
- | 工具输出 | enable_tool_output_transform(True), threshold_bytes(512) | -- |
470
+ | 工具输出 | enable_tool_output_transform(False), threshold_bytes(512) | -- |
471
471
  | 子代理 | enable_subagents(True) | -- |
472
472
  | MCP | enable_mcp(True), mcp_eager(False) | -- |
473
473
  | UI | theme("cursor-dark"), history_tail_turns(20) | -- |
@@ -77,13 +77,6 @@ Synapse 使用 **Pydantic Settings** 实现分层配置系统。
77
77
  | `SESSION_SUMMARY_MAX_CHARS` | `600` | 本地会话摘要的最大字符数(含多轮条目,超出时从最旧条目开始裁剪) |
78
78
  | `AGENT_HISTORY_TAIL_TURNS` | `20` | TUI 从轻量 transcript 投影初始读取/渲染的最近可见会话轮数;滚动到顶部后按 turn 游标加载更早历史,最多挂载 5 页 |
79
79
  | `AGENT_SESSION_PREWARM_ENABLED` | `false` | 恢复大上下文会话后,在后台对该会话历史发起一次最小模型请求,让 provider 预填充并缓存历史前缀,用户第一条消息可命中缓存、大幅缩短首 token 等待。注意:预热本身会按输入 token 计费一次,仅在需要时开启 |
80
- | `AGENT_ENABLE_TOOL_RESPONSE_TRUNCATE` | `false` | 启用工具响应裁剪:keep 窗口(默认最近 40K tokens)外的 `execute`/`read_file`/`search_files` 输出折叠为摘要,减小每轮请求体积(大上下文会话可省 20-30%)。请求层变换,不修改历史 |
81
- | `AGENT_TOOL_RESPONSE_TRUNCATE_KEEP_TOKENS` | `40000` | 工具响应裁剪的 keep 窗口(token),窗口内消息不裁剪 |
82
- | `AGENT_TOOL_RESPONSE_TRUNCATE_MAX_HEAD_CHARS` | `2000` | 关闭 fold 模式时,超长输出保留的头部字符数 |
83
- | `AGENT_TOOL_RESPONSE_TRUNCATE_MAX_TAIL_CHARS` | `0` | 关闭 fold 模式时,超长输出额外保留的尾部字符数(>0 表示 head+tail) |
84
- | `AGENT_TOOL_RESPONSE_TRUNCATE_FOLD_ENABLED` | `true` | fold 模式:窗口外输出一律折叠(有 `tool-output://` 引用的可经 `read_tool_result` 找回原文,无引用的保留头部锚点) |
85
- | `AGENT_TOOL_RESPONSE_TRUNCATE_FOLD_HEAD_CHARS` | `300` | fold 模式下无引用输出保留的头部锚点字符数 |
86
- | `AGENT_TOOL_RESPONSE_TRUNCATE_TOOLS` | `["execute","read_file","search_files"]` | 参与折叠/裁剪的工具名单(JSON 数组) |
87
80
 
88
81
  ### 长程目标(Goals)
89
82
 
@@ -250,7 +250,9 @@ py-agent/
250
250
  │ └── design.md # 本方案
251
251
  ├── AGENTS.md # 项目级记忆/约定(给 agent 读)
252
252
  ├── skills/ # 可选 skills(渐进披露)
253
- │ └── python-testing/
253
+ │ ├── session-crash-repair/
254
+ │ │ └── SKILL.md
255
+ │ └── session-cache-analysis/
254
256
  │ └── SKILL.md
255
257
  ├── src/
256
258
  │ └── coding_agent/
@@ -6,9 +6,9 @@ Skills 是 Synapse 的可扩展插件系统,位于项目 `skills/` 目录下
6
6
 
7
7
  ```
8
8
  skills/
9
- ├── python-testing/
9
+ ├── session-cache-analysis/
10
10
  │ └── SKILL.md
11
- └── python-memory-diagnostics/
11
+ └── session-crash-repair/
12
12
  └── SKILL.md
13
13
  ```
14
14
 
@@ -18,16 +18,16 @@ skills/
18
18
 
19
19
  ```markdown
20
20
  ---
21
- name: python-testing
22
- description: How to run and write Python tests in this project with uv and pytest.
23
- license: MIT
24
- compatibility: Requires uv and pytest in a Python 3.12+ project.
25
- allowed_tools: execute, run_tests, read_file, write_file, edit_file
21
+ name: session-cache-analysis
22
+ description: Analyze the prompt cache hit rate of a Synapse session (thread).
23
+ license: Apache-2.0
24
+ compatibility: Requires a synapse source checkout with uv and Python 3.12+.
25
+ allowed_tools: execute, read_file, write_file, search_files, find_files, search_session, read_session
26
26
  ---
27
27
 
28
- # Python Testing Skill
28
+ # Session Cache Hit-Rate Analysis
29
29
 
30
- ## Running Tests
30
+ ## 数据来源
31
31
  ...
32
32
  ```
33
33
 
@@ -47,8 +47,8 @@ Synapse 自带两个 Skills:
47
47
 
48
48
  | Skill | 说明 |
49
49
  |---|---|
50
- | `python-testing` | 使用 uv + pytest 运行和编写测试 |
51
- | `python-memory-diagnostics` | 诊断 Python 进程内存问题 |
50
+ | `session-crash-repair` | 检测并修复异常退出后 checkpoint 不一致的会话(悬挂工具调用、挂起图任务、过期转录投影) |
51
+ | `session-cache-analysis` | 分析会话的 prompt 缓存命中率,区分增量 miss 与全量逐出并定位根因 |
52
52
 
53
53
  ## 如何编写自定义 Skill
54
54
 
@@ -18,7 +18,7 @@ All transforms are deterministic. Synapse uses a low-cost `512` byte prefilter,
18
18
 
19
19
  ```json
20
20
  {
21
- "enable_tool_output_transform": true,
21
+ "enable_tool_output_transform": false,
22
22
  "tool_output_transform_threshold_bytes": 512,
23
23
  "tool_output_disabled_types": ["code"],
24
24
  "tool_output_transform_plugins": ["my_package.transforms:my_transformer"],
@@ -26,10 +26,12 @@ All transforms are deterministic. Synapse uses a low-cost `512` byte prefilter,
26
26
  }
27
27
  ```
28
28
 
29
+ Tool-output transformation is **off by default** (`enable_tool_output_transform: false`); set it to `true` to enable.
30
+
29
31
  Environment equivalents:
30
32
 
31
33
  ```text
32
- AGENT_ENABLE_TOOL_OUTPUT_TRANSFORM=true
34
+ AGENT_ENABLE_TOOL_OUTPUT_TRANSFORM=false
33
35
  AGENT_TOOL_OUTPUT_TRANSFORM_THRESHOLD_BYTES=512
34
36
  AGENT_TOOL_OUTPUT_DISABLED_TYPES=["code"]
35
37
  AGENT_TOOL_OUTPUT_TRANSFORM_PLUGINS=["my_package.transforms:my_transformer"]
@@ -328,9 +328,9 @@ synapse-agent/ # 项目根目录
328
328
  │ └── fixtures/ # 测试 fixtures
329
329
  │
330
330
  ├── skills/ # Agent Skills
331
- │ ├── python-testing/ # Python 测试技能
331
+ │ ├── session-crash-repair/ # 会话崩溃修复技能
332
332
  │ │ └── SKILL.md # 技能定义文件
333
- │ └── python-memory-diagnostics/ # 内存诊断技能
333
+ │ └── session-cache-analysis/ # 会话缓存命中率分析技能
334
334
  │ └── SKILL.md
335
335
  │
336
336
  ├── docs/ # 文档
@@ -1073,20 +1073,20 @@ Skills 是给 Agent 的可加载"专业说明手册"。
1073
1073
  ### 10.1 Skill 文件格式
1074
1074
 
1075
1075
  ```markdown
1076
- <!-- skills/python-testing/SKILL.md -->
1076
+ <!-- skills/session-cache-analysis/SKILL.md -->
1077
1077
 
1078
1078
  ---
1079
- name: python-testing
1080
- description: How to run and write Python tests in this project with uv and pytest.
1081
- license: MIT
1082
- allowed-tools: execute run_tests read_file write_file edit_file
1079
+ name: session-cache-analysis
1080
+ description: Analyze the prompt cache hit rate of a Synapse session (thread).
1081
+ license: Apache-2.0
1082
+ allowed-tools: execute read_file write_file search_files find_files
1083
1083
  ---
1084
1084
 
1085
- # Python testing skill
1085
+ # Session cache hit-rate analysis
1086
1086
 
1087
- ## Run tests
1087
+ ## Data source
1088
1088
  Prefer:
1089
- `uv run pytest`
1089
+ `load_messages_from_sqlite_file(checkpoints.sqlite, thread_id)`
1090
1090
 
1091
1091
  ...
1092
1092
  ```
@@ -1114,8 +1114,8 @@ Agent 启动时会扫描 `skills/` 目录,将所有 Skill 的描述注入系
1114
1114
 
1115
1115
  ### 10.3 现有 Skills
1116
1116
 
1117
- - **python-testing**: 告诉 Agent 如何正确地运行和编写 Python 测试
1118
- - **python-memory-diagnostics**: 告诉 Agent 如何诊断 Python 进程的内存问题
1117
+ - **session-crash-repair**: 告诉 Agent 如何检测并修复异常退出后 checkpoint 不一致的会话
1118
+ - **session-cache-analysis**: 告诉 Agent 如何分析会话的 prompt 缓存命中率并定位逐出根因
1119
1119
 
1120
1120
  ### 10.4 如何创建新 Skill
1121
1121
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synapse-cli-agent"
3
- version = "0.1.38"
3
+ version = "0.1.39"
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,21 @@
1
+ ## v0.1.39
2
+
3
+ ### New Features
4
+
5
+ - Stamped session-affinity headers on model requests in both the Python runtime and the native Rust OpenAI client, for consistent session binding at upstream gateways.
6
+ - Added a `session-cache-analysis` skill for computing per-session prompt cache hit rates and diagnosing cache eviction.
7
+
8
+ ### Bug Fixes
9
+
10
+ - Hashed tools by their OpenAI wire form instead of the raw `StructuredTool` dump, keeping `tools_hash`/`schema_hash` stable across agent rebuilds (previously embedded the function object's memory address).
11
+ - Inserted pasted text at the cursor position in the TUI prompt instead of appending.
12
+ - Persisted the model binding before agent rebuild and on exit.
13
+ - Loaded the debug inspector HTML via `importlib.resources` for frozen (PyInstaller) builds.
14
+
15
+ ### Engineering
16
+
17
+ - Removed the tool-response truncation middleware and its settings.
18
+ - Deprecated the reversible compression middleware and reader.
19
+ - Kept the AGENTS.md repository-layout table in sync with the current tree.
20
+
21
+ ---
@@ -29,11 +29,6 @@ from synapse.runtime.model_request_compression_middleware import (
29
29
  build_model_request_compression_middleware,
30
30
  )
31
31
  from synapse.runtime.steer import SteerQueue, build_steer_middleware
32
- from synapse.runtime.tool_output_middleware import build_tool_output_transform_middleware
33
- from synapse.runtime.tool_output_usage_middleware import build_tool_output_usage_middleware
34
- from synapse.runtime.tool_response_truncate_middleware import (
35
- build_tool_response_truncate_middleware,
36
- )
37
32
  from synapse.tool_output.pipeline import ToolOutputTransformPipeline
38
33
  from synapse.tool_output.repository import ToolOutputRepository
39
34
  from synapse.tool_output.transformers import load_transformer_plugins
@@ -105,7 +100,11 @@ class MiddlewareContext:
105
100
 
106
101
 
107
102
  def build_tool_output_pipeline(settings: Any) -> ToolOutputTransformPipeline:
108
- """Build the reversible tool-output pipeline with plugin fallback."""
103
+ """Deprecated: build the reversible tool-output pipeline with plugin fallback.
104
+
105
+ The transform middleware is no longer registered; this helper is kept for
106
+ compatibility and for anyone reviving the feature.
107
+ """
109
108
  try:
110
109
  return ToolOutputTransformPipeline(
111
110
  transformers=load_transformer_plugins(settings.tool_output_transform_plugins),
@@ -128,9 +127,15 @@ def build_agent_middleware(context: MiddlewareContext) -> list[Any]:
128
127
  from synapse.runtime.filesystem_tool_prompt_middleware import (
129
128
  build_filesystem_tool_prompt_middleware,
130
129
  )
130
+ from synapse.runtime.session_header_middleware import (
131
+ build_session_header_middleware,
132
+ )
131
133
 
132
134
  settings = context.settings
133
135
  middleware: list[Any] = [
136
+ # Publish the active thread id so the httpx layer can stamp
137
+ # X-Session-ID / Session-Id on every model request (gateway affinity).
138
+ build_session_header_middleware(),
134
139
  build_agent_md_middleware(context.project_root),
135
140
  build_filesystem_tool_prompt_middleware(),
136
141
  build_describe_image_middleware(
@@ -145,22 +150,11 @@ def build_agent_middleware(context: MiddlewareContext) -> list[Any]:
145
150
  service=context.goal_service,
146
151
  ),
147
152
  ]
148
- transform_enabled = bool(getattr(settings, "enable_tool_output_transform", True))
149
- if context.turbo:
150
- # Turbo routes tool outputs through the headroom proxy for compression;
151
- # running the built-in transformer too would double-compress and break
152
- # the proxy's content-type routing.
153
- transform_enabled = False
154
- middleware.append(
155
- build_tool_output_transform_middleware(
156
- context.output_repository,
157
- threshold_bytes=getattr(settings, "tool_output_transform_threshold_bytes", 512),
158
- pipeline=build_tool_output_pipeline(settings),
159
- enabled=transform_enabled,
160
- )
161
- )
162
- if transform_enabled:
163
- middleware.append(build_tool_output_usage_middleware(context.output_repository))
153
+ # Deprecated: the reversible tool-output transform middleware
154
+ # (build_tool_output_transform_middleware / build_tool_output_usage_middleware)
155
+ # is intentionally NOT registered for now. The pipeline and read_tool_result
156
+ # stay in place for compatibility; re-enable by appending those builders
157
+ # here when the feature is revived.
164
158
  middleware.extend(
165
159
  [
166
160
  build_tool_error_recovery_middleware(),
@@ -173,7 +167,6 @@ def build_agent_middleware(context: MiddlewareContext) -> list[Any]:
173
167
  [
174
168
  build_strip_redundant_prompt_blocks(),
175
169
  build_compact_tool_descriptions(),
176
- build_tool_response_truncate_middleware(settings),
177
170
  build_model_request_compression_middleware(context.output_repository),
178
171
  ]
179
172
  )
@@ -18,7 +18,7 @@ def handle_model(
18
18
  thread_id: str | None = None,
19
19
  apply_thinking_inplace: Callable[[Any, Any, str], bool],
20
20
  rebuild_agent: Callable[..., Any],
21
- persist_model_binding: Callable[[Any, str | None], None],
21
+ persist_model_binding: Callable[[Any, str | None], str | None],
22
22
  mcp_attach_pending: Callable[[Any], bool],
23
23
  ) -> SlashResult:
24
24
  from synapse.models.registry import (
@@ -73,6 +73,9 @@ def handle_model(
73
73
  label = apply_thinking_to_settings(settings, args[1], allowed=allowed)
74
74
  except ValueError as exc:
75
75
  return SlashResult(handled=True, lines=[str(exc)], error=True)
76
+ # Persist before the (slow, fallible) rebuild so the user's choice is
77
+ # not lost when the rebuild fails or the process exits mid-switch.
78
+ persist_error = persist_model_binding(settings, thread_id)
76
79
  model_name = settings.active_model or reg.default
77
80
  new_agent = None
78
81
  note = ""
@@ -88,15 +91,16 @@ def handle_model(
88
91
  defer_mcp_reconnect=True,
89
92
  )
90
93
  except Exception as exc: # noqa: BLE001
91
- return SlashResult(
92
- handled=True,
93
- lines=[f"thinking update failed: {exc}"],
94
- error=True,
95
- )
96
- persist_model_binding(settings, thread_id)
94
+ lines = [f"thinking update failed: {exc}"]
95
+ if persist_error:
96
+ lines.append(persist_error)
97
+ return SlashResult(handled=True, lines=lines, error=True)
98
+ lines = [f"thinking set to {label}{note} ({format_model_status(settings)})"]
99
+ if persist_error:
100
+ lines.append(persist_error)
97
101
  return SlashResult(
98
102
  handled=True,
99
- lines=[f"thinking set to {label}{note} ({format_model_status(settings)})"],
103
+ lines=lines,
100
104
  agent=new_agent,
101
105
  settings_changed=True,
102
106
  mcp_attach_pending=bool(new_agent is not None and mcp_attach_pending(settings)),
@@ -148,6 +152,11 @@ def handle_model(
148
152
  except ValueError as exc:
149
153
  return SlashResult(handled=True, lines=[str(exc)], error=True)
150
154
 
155
+ # Persist the selection before the (slow, fallible) agent rebuild so a
156
+ # rebuild failure or an immediate quit cannot silently drop the user's
157
+ # model choice (it would otherwise live only in process memory).
158
+ persist_error = persist_model_binding(settings, thread_id)
159
+
151
160
  try:
152
161
  new_agent = rebuild_agent(
153
162
  settings,
@@ -157,16 +166,21 @@ def handle_model(
157
166
  defer_mcp_reconnect=True,
158
167
  )
159
168
  except Exception as exc: # noqa: BLE001
169
+ lines = [f"model switch failed: {exc}"]
170
+ if persist_error:
171
+ lines.append(persist_error)
160
172
  return SlashResult(
161
173
  handled=True,
162
- lines=[f"model switch failed: {exc}"],
174
+ lines=lines,
163
175
  error=True,
164
176
  )
165
- persist_model_binding(settings, thread_id)
166
177
  mcp_attach_pending = mcp_attach_pending(settings)
178
+ lines = [f"model switched to {profile.name} ({format_model_status(settings)})"]
179
+ if persist_error:
180
+ lines.append(persist_error)
167
181
  return SlashResult(
168
182
  handled=True,
169
- lines=[f"model switched to {profile.name} ({format_model_status(settings)})"],
183
+ lines=lines,
170
184
  agent=new_agent,
171
185
  settings_changed=True,
172
186
  mcp_attach_pending=mcp_attach_pending,
@@ -141,12 +141,17 @@ def _store(settings: Any) -> SessionStore:
141
141
  return SessionStore(settings.resolved_sessions_path())
142
142
 
143
143
 
144
- def _persist_model_binding(settings: Any, thread_id: str | None) -> None:
144
+ def _persist_model_binding(settings: Any, thread_id: str | None) -> str | None:
145
+ """Persist the current settings as the session's model binding.
146
+
147
+ Returns an error message when the write failed (never raises), else None.
148
+ """
145
149
  try:
146
150
  store = _store(settings)
147
151
  store.save_model_binding(thread_id, binding_from_settings(settings), also_last=True)
148
- except Exception: # noqa: BLE001
149
- pass
152
+ except Exception as exc: # noqa: BLE001 - persistence must never raise into the caller
153
+ return f"failed to persist model binding: {exc}"
154
+ return None
150
155
 
151
156
 
152
157
  def _restore_thread_model(
@@ -352,7 +357,9 @@ def handle_slash(
352
357
  and result.thread_id != thread_id
353
358
  and cmd in {"/switch", "/session", "/new"}
354
359
  ):
355
- _persist_model_binding(settings, thread_id)
360
+ persist_error = _persist_model_binding(settings, thread_id)
361
+ if persist_error:
362
+ result.lines = [*result.lines, persist_error]
356
363
  # When switching sessions, restore that session's model binding.
357
364
  if (
358
365
  result.handled
@@ -142,9 +142,14 @@ def build_openai_async_http_client(
142
142
  )
143
143
  if capture_store is not None:
144
144
  transport = _CapturingAsyncTransport(transport, capture_store)
145
+ # Inject session-affinity headers (X-Session-ID / Session-Id) from the
146
+ # active thread context so gateways can keep one session on one key.
147
+ from synapse.runtime.session_headers import attach_session_headers
148
+
145
149
  return httpx.AsyncClient(
146
150
  transport=transport,
147
151
  timeout=DEFAULT_TIMEOUT if timeout is None else timeout,
152
+ event_hooks={"request": [attach_session_headers]},
148
153
  )
149
154
 
150
155
  client = runtime.run(_build())
@@ -13,6 +13,7 @@ Requests are sent as raw JSON so non-standard fields (DeepSeek
13
13
  from __future__ import annotations
14
14
 
15
15
  import asyncio
16
+ import contextvars
16
17
  import json
17
18
  import os
18
19
  from collections.abc import AsyncIterator, Iterator
@@ -33,6 +34,8 @@ from langchain_core.messages import (
33
34
  from langchain_core.outputs import ChatGeneration, ChatGenerationChunk, ChatResult
34
35
  from pydantic import Field, PrivateAttr, SecretStr
35
36
 
37
+ from synapse.runtime.session_headers import get_session_id, session_header_values
38
+
36
39
  _OPENAI_ROLE_MAP = {
37
40
  "system": "system",
38
41
  "human": "user",
@@ -234,6 +237,10 @@ class RustOpenAIChatModel(BaseChatModel):
234
237
  parallel_tool_calls: bool | None = None
235
238
 
236
239
  _client: Any = PrivateAttr(default=None)
240
+ # Session id the cached native client was built for; a mismatch means the
241
+ # client must be rebuilt so the session-affinity headers are stamped on
242
+ # every request of the conversation.
243
+ _client_session_id: str | None = PrivateAttr(default=None)
237
244
 
238
245
  @property
239
246
  def _llm_type(self) -> str:
@@ -256,15 +263,29 @@ class RustOpenAIChatModel(BaseChatModel):
256
263
  return params
257
264
 
258
265
  def _ensure_client(self) -> Any:
259
- if self._client is None:
266
+ # Not thread-safe for concurrent calls from *different* sessions on the
267
+ # same instance (a rebuild race could serve the wrong session headers);
268
+ # registry caches one model per agent session, so this does not happen
269
+ # in practice. Within one session the same client is reused.
270
+ session_id = get_session_id()
271
+ if self._client is None or self._client_session_id != session_id:
260
272
  from synapse_core_tool import RustOpenAIClient
261
273
 
274
+ # The native client bakes headers into the async-openai config at
275
+ # construction, so a per-session client is (re)built whenever the
276
+ # active session id changes; within one session the same client
277
+ # (and its reqwest connection pool) is reused.
278
+ headers = dict(self.default_headers)
279
+ session_headers = session_header_values()
280
+ if session_headers:
281
+ headers.update(session_headers)
262
282
  self._client = RustOpenAIClient(
263
283
  api_key=self.api_key.get_secret_value() if self.api_key else None,
264
284
  base_url=self.base_url,
265
- headers=self.default_headers,
285
+ headers=headers,
266
286
  timeout_secs=self.timeout,
267
287
  )
288
+ self._client_session_id = session_id
268
289
  return self._client
269
290
 
270
291
  def _build_request(
@@ -379,7 +400,12 @@ class RustOpenAIChatModel(BaseChatModel):
379
400
  finally:
380
401
  queue.put_nowait(None)
381
402
 
382
- task = asyncio.get_running_loop().run_in_executor(None, _run)
403
+ # run_in_executor does not propagate contextvars, so the sync streamer
404
+ # would lose the session id published by the agent middleware. Copy the
405
+ # current context explicitly so the native client stamps session
406
+ # headers on streaming requests too.
407
+ ctx = contextvars.copy_context()
408
+ task = asyncio.get_running_loop().run_in_executor(None, lambda: ctx.run(_run))
383
409
  while True:
384
410
  chunk = await queue.get()
385
411
  if chunk is None:
@@ -423,7 +449,9 @@ class RustOpenAIChatModel(BaseChatModel):
423
449
  converted.append(tool)
424
450
  bound._bound_tools = converted # type: ignore[attr-defined]
425
451
  bound._bound_tool_choice = tool_choice # type: ignore[attr-defined]
426
- # Shallow copy shares the native client; a new client is not needed.
452
+ # Shallow copy takes a snapshot of the native client at bind time; a
453
+ # new client is only needed when the session changes, in which case
454
+ # ``_ensure_client`` rebuilds on the bound instance too.
427
455
  bound._client = self._client
428
456
  return bound
429
457
 
@@ -434,6 +462,7 @@ class RustOpenAIChatModel(BaseChatModel):
434
462
 
435
463
  def close(self) -> None:
436
464
  self._client = None
465
+ self._client_session_id = None
437
466
 
438
467
  async def aclose(self) -> None:
439
468
  self.close()
@@ -25,6 +25,7 @@ import threading
25
25
  import time
26
26
  import webbrowser
27
27
  from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
28
+ from importlib.resources import files as package_files
28
29
  from pathlib import Path
29
30
  from typing import Any
30
31
  from urllib.parse import parse_qs, urlparse
@@ -224,7 +225,13 @@ def _record_summary(record: Any, index: int) -> dict[str, Any]:
224
225
  # Inspector page
225
226
  # ---------------------------------------------------------------------------
226
227
 
227
- _PAGE_HTML = (Path(__file__).with_name("debug_inspector.html")).read_text(encoding="utf-8")
228
+ # Read via importlib.resources so the page also works under PyInstaller
229
+ # (frozen) builds, where ``Path(__file__)`` points into the unpacked bundle.
230
+ _PAGE_HTML = (
231
+ package_files("synapse.observability")
232
+ .joinpath("debug_inspector.html")
233
+ .read_text(encoding="utf-8")
234
+ )
228
235
 
229
236
 
230
237
  # ---------------------------------------------------------------------------