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.
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.github/workflows/release.yml +1 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/AGENTS.md +3 -2
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/CHANGELOG.md +22 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/PKG-INFO +1 -1
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/README.zh-CN.md +0 -1
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/architecture-flow.md +1 -1
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/config.md +0 -7
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/design.md +3 -1
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/skills.md +11 -11
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/tool-output-transform.md +4 -2
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/tutorial.md +12 -12
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/pyproject.toml +1 -1
- synapse_cli_agent-0.1.39/release_body.md +21 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/app/agent_assembly.py +16 -23
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/model.py +25 -11
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/slash_cmds.py +11 -4
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/http_clients.py +5 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/rust_openai.py +33 -4
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/debug_server.py +8 -1
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/model_request_compression_middleware.py +39 -5
- synapse_cli_agent-0.1.39/src/synapse/runtime/session_header_middleware.py +52 -0
- synapse_cli_agent-0.1.39/src/synapse/runtime/session_headers.py +95 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/subagent_specs.py +7 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/subagents.py +2 -24
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/tool_output_middleware.py +4 -1
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/__init__.py +2 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/store.py +72 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/settings/schema.py +1 -40
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tools/session_tools.py +9 -4
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/controller.py +8 -1
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/prompt_controller.py +3 -6
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/tui.py +25 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_capabilities.py +68 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_config.py +1 -1
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_prompt_controller.py +51 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_rust_openai_model.py +112 -0
- synapse_cli_agent-0.1.39/tests/test_session_headers.py +248 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_slash_effects.py +120 -1
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/uv.lock +1 -1
- synapse_cli_agent-0.1.38/release_body.md +0 -21
- synapse_cli_agent-0.1.38/src/synapse/runtime/tool_response_truncate_middleware.py +0 -236
- synapse_cli_agent-0.1.38/tests/test_tool_response_truncate_middleware.py +0 -206
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.dockerignore +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.github/workflows/ci.yml +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.github/workflows/docs.yml +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.github/workflows/native-compression-wheels.yml +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.github/workflows/native-core-tool-wheels.yml +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.gitignore +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.python-version +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.readthedocs.yaml +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/.zed/settings.json +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/Dockerfile.web +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/LICENSE +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/README.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/agent_upstream.txt +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/approval-behavior.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/assets/demo.gif +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/assets/synapse-logo.svg +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/assets/tui-preview.png +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/cli_upstream.txt +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/debug_compact.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/decode_screenshot.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/capability-matrix.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/decisions.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/index.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-0-protocol-baseline.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-1-core-transport.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-2-prompt-semantics.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-3-permissions.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-4-session-lifecycle.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-5-session-mcp.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-6-client-services.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-7-advanced-capabilities.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/phase-8-compliance.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/acp-adapter/progress.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-development-guide.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/baseline-report.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/decisions.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/index.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/migration.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-0-baseline.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-1-streaming-core.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-2-turn-runtime.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-3-tui-cutover.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-4-session-runtime.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-5-multi-session.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-6-project-runtime.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-7-global-control-plane.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/phase-8-hardening.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/post-review-fix-plan.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/agent-runtime-decoupling/progress.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/architecture.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/cli.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/codex-session-discovery-phase-1.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/codex-session-import-phase-2.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/docker-web.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/index.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/install.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/math-formulas-test.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/mcp.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/models.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/native-compression-core.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/native-core-tool.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/permissions.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/quickstart.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/sessions.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/smith_output.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/subagents.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/tui-cursor-refactor.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/docs/x-agent-development-guide.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/examples/mcp.example.json +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/examples/models.example.json +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/examples/settings.example.json +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/middleware_upstream.txt +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/mkdocs.yml +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/Cargo.lock +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/Cargo.toml +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/LICENSE +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/NOTICE +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/README.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/pyproject.toml +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/python/synapse_core_tool/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/file_access.rs +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/file_tools.rs +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/lib.rs +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/llm.rs +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/math_render.rs +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/src/search.rs +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-core-tool/uv.lock +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/Cargo.lock +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/Cargo.toml +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/LICENSE +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/NOTICE +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/README.md +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/pyproject.toml +0 -0
- {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
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/ccr.rs +0 -0
- {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
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/headroom_port/mod.rs +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/rust/synapse-tool-compress-core/src/lib.rs +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/scripts/install.ps1 +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/scripts/release.ps1 +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/scripts/serve_web.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/slash_cmds_upstream.txt +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/__main__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/agent.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/client_services.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/content.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/events.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/lifecycle.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/mcp.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/permissions.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/server.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/sessions.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/acp/updates.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/app/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/app/agent.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/app/agent_md.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/cli.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/compression.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/goal.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/helpers.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/mcp.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/result.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/sessions.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/slash_complete.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/commands/theme.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/config.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/content/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/content/input_history.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/content/multimodal.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/content/prompts.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/content/skills_catalog.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/entry.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/model.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/runtime.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/steering.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/store.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/goals/tools.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/checkpoint_seed.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/codex_config.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/codex_history.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/codex_import.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/codex_sessions.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/describe_image.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/herdr.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/llm_openai_compat.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/llm_openai_websocket.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/mcp_client.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/openai_oauth.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/openai_oauth_middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/openai_usage.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/turbo.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/vision_middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/memory/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/memory/auto_recorder.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/memory/embedder.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/memory/long_term.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/config.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/helpers.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/persist.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/profile.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/providers.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models/registry.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/models_registry.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/debug_inspector.html +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/exit_trace.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/heap_dump.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/llm_debug.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/startup_trace.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/planner/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/planner/task_planner.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/projects/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/projects/catalog.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/rag/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/rag/knowledge_base.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/agent_loop/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/agent_loop/model.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/agent_loop/request.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/agent_loop/turn.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/async_runtime.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/backends.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/cancellation.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/context_compact.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/debug_capture_middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/execute_capture.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/filesystem_tool_prompt_middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/fs_permissions.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/harness.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/hitl.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/interaction_ledger.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/pathing.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/projects/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/projects/identity.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/projects/runtime.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/safety.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/session_prewarm.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/events.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/manager.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/persistence.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/ref.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/sessions/runtime.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/steer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/accumulator.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/adapters.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/events.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/parser.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/protocol.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/runtime.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/stream_events.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/streaming/tool_model.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/subagent_config_persist.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/timeline.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/token_rate.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/tool_ignore.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/tool_output_eval.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/runtime/tool_output_usage_middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/cancel_repair.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/search_index.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/summary.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/transcript.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/transcript_migration.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/sessions/transcript_projection.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/settings/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/settings/config_paths.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/subagents.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/detection.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/metrics.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/models.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/pipeline.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/repository.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tool_output/transformers.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tools/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tools/describe_image.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tools/filesystem_patch.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/tools/filesystem_search.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/agent_lifecycle.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/answer_divider.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/approval.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/codex_usage.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/fast.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/goal.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/key_hints.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/mcp.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/mode.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/model.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/thread.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/turbo.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/components/turn_stats.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/context.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/bottombar/core.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/chrome/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/chrome/controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/clipboard.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/active_session_switcher.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/base.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/codex_config_import.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/codex_reset.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/codex_session_list.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/compression_diagnostics.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/git_explore.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/mcp_panel.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/model_form.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/model_manager.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/model_picker.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/provider_catalog.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/safety_panel.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/session_list.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/subagent_config.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/theme_designer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/dialogs/theme_picker.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/drawer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/formatters.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/git_explore/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/git_explore/engine.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/git_explore/provider.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/git_explore/unified.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/image_preview.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/image_render.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/image_viewer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/math_image.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/mermaid_image.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/rendering.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/selectable_static.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/selectable_text.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/sink.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/status_controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/steer_controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/steer_widget.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/stream.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/stream_events.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/stream_runtime.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/textual_lifecycle.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/textual_stream_sink.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/theme.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/theme_controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/timeline.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/tool_blocks.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/branch.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/title.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/tool_output.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/usage.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/components/workspace.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/context.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/core.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/git_changes_popover.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/git_chrome.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/tool_output_popover.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/topbar/widget.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript/controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript/factory.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript/history.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript/state.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/transcript_blocks.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/tui_launch.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/tui_styles.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/event_bridge.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/event_renderer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/persistence.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn/request.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn_rail.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/turn_rail_widgets.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/user_turn.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/user_turn_block.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/ui/welcome.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/web.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/synapse.cmd +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/__init__.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/acp/initialize.jsonl +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/agent_stream/core_scenarios.json +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/duplicate_response_item.jsonl +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/incomplete_and_aborted.jsonl +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/legacy_compaction.jsonl +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/normal_completed.jsonl +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/replacement_history.jsonl +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/rollback.jsonl +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/codex_rollouts/unsupported_replacement.jsonl +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/sample_repo/calculator.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/sample_repo/test_calculator.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/fixtures/tool_output_eval.json +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p0_baseline.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p1_core.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p1_transport.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p2_content.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p2_events.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p2_updates.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p3_agent.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p3_permissions.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p4_history.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p4_lifecycle.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p5_mcp.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p6_client_services.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_acp_p8_compliance.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_agent_factory.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_agent_lifecycle.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_agent_turn_runtime.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_approval.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_async_checkpointer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_backends.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_bottombar_registry.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_cancel_repair.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_checkpoint_seed.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_chrome_controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_cli.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_cli_codex_import.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_clipboard.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_codex_config.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_codex_history.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_codex_import.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_codex_sessions.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_codex_sessions_windows.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_compact_tool_descriptions.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_context_compact.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_context_window.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_debug_capture_middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_debug_inspector.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_describe_image.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_dialogs.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_entry.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_filesystem_patch_tool.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_filesystem_search_tools.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_git_changes_popover.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_git_chrome.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_git_explore.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_goal_live_tui.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_goals.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_heap_dump.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_herdr_integration.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_http_clients.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_image_render.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_image_viewer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_input_history.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_iteration_abc.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_layered_config.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_math_image_render.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_mcp_schema.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_mermaid_image.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_mermaid_render.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_middleware_async.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_model_dialogs.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_model_providers.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_model_request_compression_middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_model_retry.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_models_persist.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_multimodal.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_native_math_render.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_openai_compat_reasoning.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_openai_oauth.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_openai_oauth_middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_openai_usage.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_openai_websocket.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_pathing.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_project_catalog.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_project_drawer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_project_runtime.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_project_switch.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_prompts.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_runtime_hardening.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_runtime_manager.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_runtime_streaming.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_safety.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_search_index.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_session_prewarm.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_session_runtime.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_session_store.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_session_summary.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_slash_and_mcp.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_slash_complete.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_startup_defer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_startup_trace.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_steer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_steer_controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_stream_cancel.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_stream_semantic_fixtures.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_stream_tool_items.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_stream_ui.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_subagent_config_dialog.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_subagent_config_persist.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_subagent_status.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_subagents.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_textual_stream_sink.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_theme.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_theme_controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_timeline.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_token_rate.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_blocks.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_ignore.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_intent.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_output.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_output_eval.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_output_slash.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tool_output_usage_middleware.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_topbar_context_ratio.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_topbar_registry.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript_controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript_history.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript_history_controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript_migration.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_transcript_projection.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tui_active_session_switcher.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tui_codex_import.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tui_paste.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_tui_selection.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_turn_controller.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_turn_event_renderer.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_turn_rail_minimap.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_turn_request.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_usage_restore.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_user_turn_style.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/test_welcome.py +0 -0
- {synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/tests/tool_output_plugin_fixture.py +0 -0
|
@@ -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
|
|
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.
|
|
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(
|
|
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
|
-
│
|
|
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
|
-
├──
|
|
9
|
+
├── session-cache-analysis/
|
|
10
10
|
│ └── SKILL.md
|
|
11
|
-
└──
|
|
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:
|
|
22
|
-
description:
|
|
23
|
-
license:
|
|
24
|
-
compatibility: Requires
|
|
25
|
-
allowed_tools: execute,
|
|
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
|
-
#
|
|
28
|
+
# Session Cache Hit-Rate Analysis
|
|
29
29
|
|
|
30
|
-
##
|
|
30
|
+
## 数据来源
|
|
31
31
|
...
|
|
32
32
|
```
|
|
33
33
|
|
|
@@ -47,8 +47,8 @@ Synapse 自带两个 Skills:
|
|
|
47
47
|
|
|
48
48
|
| Skill | 说明 |
|
|
49
49
|
|---|---|
|
|
50
|
-
| `
|
|
51
|
-
| `
|
|
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":
|
|
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=
|
|
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
|
-
│ ├──
|
|
331
|
+
│ ├── session-crash-repair/ # 会话崩溃修复技能
|
|
332
332
|
│ │ └── SKILL.md # 技能定义文件
|
|
333
|
-
│ └──
|
|
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/
|
|
1076
|
+
<!-- skills/session-cache-analysis/SKILL.md -->
|
|
1077
1077
|
|
|
1078
1078
|
---
|
|
1079
|
-
name:
|
|
1080
|
-
description:
|
|
1081
|
-
license:
|
|
1082
|
-
allowed-tools: execute
|
|
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
|
-
#
|
|
1085
|
+
# Session cache hit-rate analysis
|
|
1086
1086
|
|
|
1087
|
-
##
|
|
1087
|
+
## Data source
|
|
1088
1088
|
Prefer:
|
|
1089
|
-
`
|
|
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
|
-
- **
|
|
1118
|
-
- **
|
|
1117
|
+
- **session-crash-repair**: 告诉 Agent 如何检测并修复异常退出后 checkpoint 不一致的会话
|
|
1118
|
+
- **session-cache-analysis**: 告诉 Agent 如何分析会话的 prompt 缓存命中率并定位逐出根因
|
|
1119
1119
|
|
|
1120
1120
|
### 10.4 如何创建新 Skill
|
|
1121
1121
|
|
|
@@ -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
|
-
"""
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
lines
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
-
|
|
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
|
{synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/integrations/http_clients.py
RENAMED
|
@@ -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
|
-
|
|
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=
|
|
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
|
-
|
|
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
|
|
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()
|
{synapse_cli_agent-0.1.38 → synapse_cli_agent-0.1.39}/src/synapse/observability/debug_server.py
RENAMED
|
@@ -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
|
-
|
|
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
|
# ---------------------------------------------------------------------------
|