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