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