synapse-cli-agent 0.1.27__tar.gz → 0.1.29__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.27 → synapse_cli_agent-0.1.29}/CHANGELOG.md +45 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/PKG-INFO +22 -2
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/README.md +18 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/baseline-report.md +79 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/decisions.md +87 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/index.md +323 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/migration.md +76 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/phase-0-baseline.md +161 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/phase-1-streaming-core.md +236 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/phase-2-turn-runtime.md +184 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/phase-3-tui-cutover.md +174 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/phase-4-session-runtime.md +172 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/phase-5-multi-session.md +147 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/phase-6-project-runtime.md +176 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/phase-7-global-control-plane.md +165 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/phase-8-hardening.md +180 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/post-review-fix-plan.md +236 -0
- synapse_cli_agent-0.1.29/docs/agent-runtime-decoupling/progress.md +198 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/architecture-flow.md +1 -5
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/architecture.md +3 -38
- synapse_cli_agent-0.1.29/docs/math-formulas-test.md +119 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/sessions.md +17 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/tutorial.md +8 -9
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/mkdocs.yml +16 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/pyproject.toml +3 -1
- synapse_cli_agent-0.1.29/release_body.md +19 -0
- synapse_cli_agent-0.1.29/rust/synapse-core-tool/Cargo.lock +1229 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-core-tool/Cargo.toml +5 -1
- {synapse_cli_agent-0.1.27/rust/synapse-tool-compress-core → synapse_cli_agent-0.1.29/rust/synapse-core-tool}/NOTICE +12 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-core-tool/README.md +16 -1
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-core-tool/pyproject.toml +1 -1
- synapse_cli_agent-0.1.29/rust/synapse-core-tool/python/synapse_core_tool/__init__.py +3 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-core-tool/src/lib.rs +2 -0
- synapse_cli_agent-0.1.29/rust/synapse-core-tool/src/math_render.rs +141 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/app/agent.py +63 -116
- synapse_cli_agent-0.1.29/src/synapse/app/agent_assembly.py +216 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/cli.py +179 -25
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/goal.py +2 -1
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/result.py +3 -1
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/slash_cmds.py +21 -44
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/goals/middleware.py +8 -5
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/goals/runtime.py +62 -9
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/goals/store.py +5 -1
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/goals/tools.py +19 -6
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/mcp_client.py +100 -2
- synapse_cli_agent-0.1.29/src/synapse/observability/exit_trace.py +110 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/projects/catalog.py +119 -5
- synapse_cli_agent-0.1.29/src/synapse/runtime/agent_loop/__init__.py +27 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/agent_loop/model.py +138 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/agent_loop/request.py +115 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/agent_loop/turn.py +259 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/async_runtime.py +76 -6
- synapse_cli_agent-0.1.29/src/synapse/runtime/cancellation.py +24 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/middleware.py +19 -10
- synapse_cli_agent-0.1.29/src/synapse/runtime/projects/__init__.py +25 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/projects/identity.py +83 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/projects/runtime.py +305 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/session_prewarm.py +18 -6
- synapse_cli_agent-0.1.29/src/synapse/runtime/sessions/__init__.py +49 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/sessions/events.py +158 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/sessions/manager.py +352 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/sessions/persistence.py +159 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/sessions/ref.py +155 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/sessions/runtime.py +575 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/streaming/__init__.py +59 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/streaming/accumulator.py +169 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/streaming/adapters.py +279 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/streaming/events.py +241 -0
- synapse_cli_agent-0.1.27/src/synapse/ui/stream.py → synapse_cli_agent-0.1.29/src/synapse/runtime/streaming/parser.py +115 -522
- synapse_cli_agent-0.1.29/src/synapse/runtime/streaming/protocol.py +68 -0
- synapse_cli_agent-0.1.29/src/synapse/runtime/streaming/runtime.py +304 -0
- {synapse_cli_agent-0.1.27/src/synapse/ui → synapse_cli_agent-0.1.29/src/synapse/runtime/streaming}/stream_events.py +6 -34
- synapse_cli_agent-0.1.29/src/synapse/runtime/streaming/tool_model.py +22 -0
- {synapse_cli_agent-0.1.27/src/synapse/ui → synapse_cli_agent-0.1.29/src/synapse/runtime}/timeline.py +2 -15
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/sessions/cancel_repair.py +34 -7
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/sessions/store.py +2 -0
- synapse_cli_agent-0.1.29/src/synapse/settings/__init__.py +19 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/settings/schema.py +58 -12
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/agent_lifecycle.py +9 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/chrome/controller.py +121 -18
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/__init__.py +6 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/dialogs/active_session_switcher.py +145 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/base.py +68 -19
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/controller.py +592 -118
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/session_list.py +10 -1
- synapse_cli_agent-0.1.29/src/synapse/ui/drawer.py +604 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/image_preview.py +68 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/image_render.py +351 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/image_viewer.py +105 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/math_image.py +222 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/mermaid_image.py +148 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/prompt_controller.py +20 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/rendering.py +188 -5
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/status_controller.py +2 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/steer_controller.py +11 -2
- synapse_cli_agent-0.1.29/src/synapse/ui/stream.py +572 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/stream_events.py +46 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/stream_runtime.py +52 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/timeline.py +81 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/widget.py +42 -4
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/transcript/controller.py +41 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/transcript/history.py +19 -1
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/transcript_blocks.py +150 -1
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/tui.py +544 -65
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/tui_launch.py +8 -1
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/tui_styles.py +28 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/turn/controller.py +1632 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/turn/event_bridge.py +166 -0
- synapse_cli_agent-0.1.29/src/synapse/ui/turn/event_renderer.py +209 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/turn/persistence.py +90 -49
- synapse_cli_agent-0.1.29/src/synapse/ui/turn/request.py +44 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/user_turn_block.py +33 -3
- synapse_cli_agent-0.1.29/tests/fixtures/agent_stream/core_scenarios.json +63 -0
- synapse_cli_agent-0.1.29/tests/test_agent_turn_runtime.py +476 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_cancel_repair.py +36 -0
- synapse_cli_agent-0.1.29/tests/test_chrome_controller.py +328 -0
- synapse_cli_agent-0.1.29/tests/test_cli.py +249 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_dialogs.py +623 -11
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_git_changes_popover.py +11 -0
- synapse_cli_agent-0.1.29/tests/test_goal_live_tui.py +173 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_goals.py +191 -2
- synapse_cli_agent-0.1.29/tests/test_image_render.py +537 -0
- synapse_cli_agent-0.1.29/tests/test_image_viewer.py +40 -0
- synapse_cli_agent-0.1.29/tests/test_math_image_render.py +132 -0
- synapse_cli_agent-0.1.29/tests/test_mermaid_image.py +485 -0
- synapse_cli_agent-0.1.29/tests/test_native_math_render.py +56 -0
- synapse_cli_agent-0.1.29/tests/test_project_drawer.py +635 -0
- synapse_cli_agent-0.1.29/tests/test_project_runtime.py +470 -0
- synapse_cli_agent-0.1.29/tests/test_project_switch.py +112 -0
- synapse_cli_agent-0.1.29/tests/test_runtime_hardening.py +299 -0
- synapse_cli_agent-0.1.29/tests/test_runtime_manager.py +586 -0
- synapse_cli_agent-0.1.29/tests/test_runtime_streaming.py +498 -0
- synapse_cli_agent-0.1.29/tests/test_session_runtime.py +819 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_slash_and_mcp.py +104 -40
- synapse_cli_agent-0.1.29/tests/test_slash_effects.py +592 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_stream_cancel.py +74 -1
- synapse_cli_agent-0.1.29/tests/test_stream_semantic_fixtures.py +140 -0
- synapse_cli_agent-0.1.29/tests/test_tui_active_session_switcher.py +106 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_tui_codex_import.py +51 -0
- synapse_cli_agent-0.1.29/tests/test_turn_controller.py +1820 -0
- synapse_cli_agent-0.1.29/tests/test_turn_event_renderer.py +372 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/uv.lock +103 -2
- synapse_cli_agent-0.1.27/release_body.md +0 -19
- synapse_cli_agent-0.1.27/rust/synapse-core-tool/Cargo.lock +0 -459
- synapse_cli_agent-0.1.27/rust/synapse-core-tool/python/synapse_core_tool/__init__.py +0 -3
- synapse_cli_agent-0.1.27/src/synapse/sessions/session_recap.py +0 -174
- synapse_cli_agent-0.1.27/src/synapse/settings/__init__.py +0 -5
- synapse_cli_agent-0.1.27/src/synapse/ui/stream_runtime.py +0 -252
- synapse_cli_agent-0.1.27/src/synapse/ui/turn/controller.py +0 -541
- synapse_cli_agent-0.1.27/src/synapse/ui/turn/request.py +0 -52
- synapse_cli_agent-0.1.27/tests/test_chrome_controller.py +0 -107
- synapse_cli_agent-0.1.27/tests/test_cli.py +0 -108
- synapse_cli_agent-0.1.27/tests/test_session_recap.py +0 -97
- synapse_cli_agent-0.1.27/tests/test_slash_effects.py +0 -53
- synapse_cli_agent-0.1.27/tests/test_turn_controller.py +0 -180
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/.dockerignore +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/.github/workflows/ci.yml +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/.github/workflows/docs.yml +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/.github/workflows/native-compression-wheels.yml +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/.github/workflows/native-core-tool-wheels.yml +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/.github/workflows/release.yml +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/.gitignore +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/.python-version +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/.readthedocs.yaml +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/AGENTS.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/Dockerfile.web +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/LICENSE +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/README.zh-CN.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/agent-studio-prototype/favicon.svg +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/agent-studio-prototype/index.html +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/agent-studio-prototype/script.js +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/agent-studio-prototype/styles.css +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/agent_upstream.txt +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/assets/synapse-logo.svg +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/assets/tui-preview.png +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/cli_upstream.txt +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/debug_compact.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/decode_screenshot.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/agent-development-guide.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/cli.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/codex-session-discovery-phase-1.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/codex-session-import-phase-2.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/config.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/design.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/docker-web.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/index.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/install.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/mcp.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/models.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/native-compression-core.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/native-core-tool.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/permissions.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/quickstart.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/skills.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/smith_output.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/subagent-architecture-survey.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/tool-output-transform.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/tui-cursor-refactor.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/docs/x-agent-development-guide.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/examples/mcp.example.json +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/examples/models.example.json +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/examples/settings.example.json +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/middleware_upstream.txt +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-core-tool/LICENSE +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-core-tool/src/file_access.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-core-tool/src/file_tools.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-core-tool/src/search.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-core-tool/uv.lock +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/Cargo.lock +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/Cargo.toml +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/LICENSE +0 -0
- {synapse_cli_agent-0.1.27/rust/synapse-core-tool → synapse_cli_agent-0.1.29/rust/synapse-tool-compress-core}/NOTICE +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/README.md +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/pyproject.toml +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/python/synapse_tool_compress_core/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/ccr.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/ccr_in_memory.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/mod.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/relevance/base.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/relevance/bm25.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/signals/keyword_detector.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/signals/line_importance.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/adaptive_sizer.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/anchor_selector.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/code_compressor.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/diff_compressor.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/log_compressor.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/search_compressor.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/analyzer.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/anchors.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/builder.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/classifier.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/classifier.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/compactor.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/formatter.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/ir.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/mod.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/walker.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/config.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/constraints.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crusher.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crushers.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/error_keywords.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/field_detect.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/hashing.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/mod.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/observer.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/orchestration.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/outliers.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/planning.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/statistics.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/stats_math.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/traits.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/types.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/rust/synapse-tool-compress-core/src/lib.rs +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/scripts/install.ps1 +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/scripts/release.ps1 +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/scripts/serve_web.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/slash_cmds_upstream.txt +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/__main__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/app/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/app/agent_md.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/compression.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/helpers.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/mcp.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/model.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/sessions.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/slash_complete.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/commands/theme.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/config.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/content/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/content/input_history.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/content/multimodal.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/content/prompts.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/content/skills_catalog.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/goals/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/goals/model.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/goals/steering.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/checkpoint_seed.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/codex_history.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/codex_import.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/codex_sessions.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/describe_image.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/http_clients.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/llm_openai_compat.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/llm_openai_websocket.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/openai_oauth.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/openai_oauth_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/openai_usage.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/integrations/vision_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/memory/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/memory/auto_recorder.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/memory/embedder.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/memory/long_term.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/models/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/models/config.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/models/helpers.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/models/profile.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/models/registry.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/models_registry.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/observability/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/observability/debug_inspector.html +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/observability/debug_server.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/observability/heap_dump.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/observability/llm_debug.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/observability/startup_trace.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/parallel_subagents.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/planner/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/planner/task_planner.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/projects/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/rag/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/rag/knowledge_base.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/backends.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/context_compact.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/debug_capture_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/execute_capture.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/filesystem_tool_prompt_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/fs_permissions.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/harness.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/hitl.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/interaction_ledger.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/model_request_compression_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/pathing.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/safety.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/steer.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/subagent_routing.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/subagents.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/token_rate.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/tool_ignore.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/tool_output_eval.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/tool_output_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/tool_output_usage_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/runtime/tool_response_truncate_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/sessions/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/sessions/search_index.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/sessions/summary.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/sessions/transcript.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/sessions/transcript_migration.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/sessions/transcript_projection.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/settings/config_paths.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/subagent_monitor.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/subagents.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tool_output/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tool_output/detection.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tool_output/metrics.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tool_output/models.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tool_output/pipeline.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tool_output/repository.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tool_output/transformers.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tools/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tools/describe_image.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tools/filesystem_patch.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tools/filesystem_search.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/tools/session_tools.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/answer_divider.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/components/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/components/codex_usage.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/components/fast.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/components/goal.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/components/key_hints.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/components/mcp.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/components/mode.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/components/model.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/components/thread.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/context.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/bottombar/core.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/chrome/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/clipboard.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/codex_reset.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/codex_session_list.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/compression_diagnostics.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/git_explore.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/mcp_panel.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/model_picker.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/safety_panel.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/subagent_monitor.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/theme_designer.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/dialogs/theme_picker.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/formatters.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/git_explore/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/git_explore/engine.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/git_explore/provider.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/git_explore/unified.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/selectable_static.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/selectable_text.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/sink.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/steer_widget.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/subagent_status_bar.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/textual_lifecycle.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/textual_stream_sink.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/theme.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/theme_controller.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/tool_blocks.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/components/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/components/branch.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/components/title.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/components/tool_output.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/components/usage.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/components/workspace.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/context.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/core.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/git_changes_popover.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/git_chrome.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/topbar/tool_output_popover.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/transcript/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/transcript/factory.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/transcript/state.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/turn/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/turn_rail.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/turn_rail_widgets.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/user_turn.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/ui/welcome.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/src/synapse/web.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/synapse.cmd +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/__init__.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/fixtures/codex_rollouts/duplicate_response_item.jsonl +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/fixtures/codex_rollouts/incomplete_and_aborted.jsonl +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/fixtures/codex_rollouts/legacy_compaction.jsonl +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/fixtures/codex_rollouts/normal_completed.jsonl +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/fixtures/codex_rollouts/replacement_history.jsonl +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/fixtures/codex_rollouts/rollback.jsonl +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/fixtures/codex_rollouts/unsupported_replacement.jsonl +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/fixtures/sample_repo/calculator.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/fixtures/sample_repo/test_calculator.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/fixtures/tool_output_eval.json +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_agent_factory.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_agent_lifecycle.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_async_checkpointer.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_backends.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_bottombar_registry.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_capabilities.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_checkpoint_seed.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_cli_codex_import.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_codex_history.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_codex_import.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_codex_sessions.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_codex_sessions_windows.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_compact_tool_descriptions.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_config.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_context_compact.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_context_window.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_dag_parallel.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_debug_capture_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_debug_inspector.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_describe_image.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_filesystem_patch_tool.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_filesystem_search_tools.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_git_chrome.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_git_explore.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_heap_dump.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_http_clients.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_input_history.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_iteration_abc.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_layered_config.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_mcp_schema.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_mermaid_render.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_middleware_async.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_model_request_compression_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_model_retry.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_multimodal.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_openai_compat_reasoning.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_openai_oauth.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_openai_oauth_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_openai_usage.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_openai_websocket.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_pathing.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_project_catalog.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_prompt_controller.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_prompts.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_safety.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_search_index.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_session_prewarm.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_session_store.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_session_summary.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_slash_complete.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_startup_defer.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_steer.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_steer_controller.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_stream_tool_items.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_stream_ui.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_subagent_monitor_dialog.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_subagent_status.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_textual_stream_sink.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_theme.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_theme_controller.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_timeline.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_token_rate.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_tool_ignore.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_tool_intent.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_tool_output.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_tool_output_eval.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_tool_output_slash.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_tool_output_usage_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_tool_response_truncate_middleware.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_topbar_context_ratio.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_topbar_registry.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_transcript.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_transcript_controller.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_transcript_history.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_transcript_history_controller.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_transcript_migration.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_transcript_projection.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_tui_selection.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_turn_rail_minimap.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_turn_request.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_usage_restore.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_user_turn_style.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/test_welcome.py +0 -0
- {synapse_cli_agent-0.1.27 → synapse_cli_agent-0.1.29}/tests/tool_output_plugin_fixture.py +0 -0
|
@@ -7,6 +7,51 @@ The release workflow automatically extracts the matching section as release note
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## v0.1.29
|
|
11
|
+
|
|
12
|
+
### 新增功能
|
|
13
|
+
|
|
14
|
+
- TUI 图片查看器:点击 transcript 中的图片可在模态窗口中放大查看,修复点击事件在模态栈切换时的误关闭问题。
|
|
15
|
+
- TUI Mermaid 渲染优化:Mermaid 图片在后台线程渲染,渲染期间显示占位提示,避免原生渲染阻塞事件循环。
|
|
16
|
+
- 后台会话结束时通知前台会话;跨事件边界携带取消原因。
|
|
17
|
+
|
|
18
|
+
### 修复
|
|
19
|
+
|
|
20
|
+
- 修复图片查看器点击关闭时可能移除默认 screen 并抛出 ScreenStackError 的问题。
|
|
21
|
+
- 修复会话切换时 Mermaid 占位渲染的竞态,渲染结果仅在仍处于当前世代且已挂载时替换。
|
|
22
|
+
|
|
23
|
+
### 工程改进
|
|
24
|
+
|
|
25
|
+
- synapse-core-tool 原生扩展发布 0.1.2(修复 pyproject.toml 版本未同步导致的 PyPI 上传失败)。
|
|
26
|
+
- 新增 `make_mermaid_widget_from_png`,将 PNG 渲染与 widget 构建解耦,明确 UI 线程边界。
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## v0.1.28
|
|
31
|
+
|
|
32
|
+
### 新增功能
|
|
33
|
+
|
|
34
|
+
- TUI 支持终端内 LaTeX 数学公式渲染:transcript 中 display math(`$$...$$`)块经原生 RaTeX 内核渲染为 PNG 图片展示,支持前景/背景色、字号、padding 与 device pixel ratio,无需 Node.js、浏览器或系统 TeX。
|
|
35
|
+
- TUI 图片渲染增强:粘贴图片可在终端内预览(textual-image),transcript 显示图片,点击图片可在模态窗口中放大查看。
|
|
36
|
+
- 会话切换器:Ctrl+Tab 快速切换最近 10 个会话并高亮当前项,冷历史合并进 recents。
|
|
37
|
+
- 项目抽屉(project drawer)绑定 F12 并支持交互,可读性与渲染稳定性改进。
|
|
38
|
+
- 跨项目进程内切换与多会话并发支持(runtime 与 TUI 解耦重构)。
|
|
39
|
+
|
|
40
|
+
### 修复
|
|
41
|
+
|
|
42
|
+
- 修复退出死锁,新增退出耗时诊断。
|
|
43
|
+
- 修复会话切换后 turn 轮换内容丢失、replay 终态关闭、断链渲染冻结等问题。
|
|
44
|
+
- 修复事件渲染阻塞输入的问题。
|
|
45
|
+
- 隔离各会话的 model 与 MCP 状态,避免跨会话切换串扰。
|
|
46
|
+
- 修复 goal follow-up 轮次的 reservation/settlement 竞态。
|
|
47
|
+
|
|
48
|
+
### 工程改进
|
|
49
|
+
|
|
50
|
+
- runtime 与 TUI 解耦:stream parser 移出 UI 包,工具事件结构化输出并保留工具 item 生命周期。
|
|
51
|
+
- synapse-core-tool 原生扩展新增 `render_math_png`(RaTeX 内核 + 嵌入 KaTeX 字体)。
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
10
55
|
## v0.1.27
|
|
11
56
|
|
|
12
57
|
### 新增功能
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: synapse-cli-agent
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.29
|
|
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
|
|
@@ -208,6 +208,7 @@ Requires-Dist: langchain==1.3.14
|
|
|
208
208
|
Requires-Dist: langgraph-checkpoint-sqlite==3.1.0
|
|
209
209
|
Requires-Dist: langgraph==1.2.9
|
|
210
210
|
Requires-Dist: mcp==1.28.1
|
|
211
|
+
Requires-Dist: mmdr==0.3.0
|
|
211
212
|
Requires-Dist: pydantic-settings==2.14.2
|
|
212
213
|
Requires-Dist: python-dotenv==1.2.2
|
|
213
214
|
Requires-Dist: rich==15.0.0
|
|
@@ -215,6 +216,7 @@ Requires-Dist: synapse-core-tool<0.2.0,>=0.1.0
|
|
|
215
216
|
Requires-Dist: termaid==0.7.1
|
|
216
217
|
Requires-Dist: texicode==1.0.3
|
|
217
218
|
Requires-Dist: textual-diff-view==0.1.5
|
|
219
|
+
Requires-Dist: textual-image==0.13.2
|
|
218
220
|
Requires-Dist: textual-serve==1.1.3
|
|
219
221
|
Requires-Dist: textual==8.2.8
|
|
220
222
|
Requires-Dist: typer==0.27.0
|
|
@@ -268,6 +270,24 @@ Then start the TUI from anywhere:
|
|
|
268
270
|
synapse tui -w .
|
|
269
271
|
```
|
|
270
272
|
|
|
273
|
+
Open a session in any registered project from the global catalog:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
synapse --session <project_id>:<thread_id> # global session reference
|
|
277
|
+
synapse --project <ref> # project by id prefix, name, or path
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Inside the TUI, click the topbar `≡` (or the workspace label) to open the
|
|
281
|
+
floating project drawer: it lists every registered project, groups their
|
|
282
|
+
sessions, marks live runtime status, and lets you switch sessions in place or
|
|
283
|
+
jump to another project (the TUI restarts into that project).
|
|
284
|
+
|
|
285
|
+
Press `Ctrl+Tab` for a lighter active-session switcher: it lists only sessions
|
|
286
|
+
that are doing work right now (across projects), lets you `Tab` / `Shift+Tab`
|
|
287
|
+
through them and `Enter` to switch — the old session keeps running in the
|
|
288
|
+
background and is never cancelled. Some terminals never forward `Ctrl+Tab` to
|
|
289
|
+
the app; `Ctrl+O` is a drop-in alternative.
|
|
290
|
+
|
|
271
291
|
<details>
|
|
272
292
|
<summary><b>Or run from source</b></summary>
|
|
273
293
|
|
|
@@ -39,6 +39,24 @@ Then start the TUI from anywhere:
|
|
|
39
39
|
synapse tui -w .
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
+
Open a session in any registered project from the global catalog:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
synapse --session <project_id>:<thread_id> # global session reference
|
|
46
|
+
synapse --project <ref> # project by id prefix, name, or path
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Inside the TUI, click the topbar `≡` (or the workspace label) to open the
|
|
50
|
+
floating project drawer: it lists every registered project, groups their
|
|
51
|
+
sessions, marks live runtime status, and lets you switch sessions in place or
|
|
52
|
+
jump to another project (the TUI restarts into that project).
|
|
53
|
+
|
|
54
|
+
Press `Ctrl+Tab` for a lighter active-session switcher: it lists only sessions
|
|
55
|
+
that are doing work right now (across projects), lets you `Tab` / `Shift+Tab`
|
|
56
|
+
through them and `Enter` to switch — the old session keeps running in the
|
|
57
|
+
background and is never cancelled. Some terminals never forward `Ctrl+Tab` to
|
|
58
|
+
the app; `Ctrl+O` is a drop-in alternative.
|
|
59
|
+
|
|
42
60
|
<details>
|
|
43
61
|
<summary><b>Or run from source</b></summary>
|
|
44
62
|
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# P0 Agent Stream 基线报告
|
|
2
|
+
|
|
3
|
+
> 状态:P0 基线已固化
|
|
4
|
+
> 日期:2026-08-07
|
|
5
|
+
> 原则:只记录可重复测试和脱敏指标,不记录用户消息、密钥或私有配置正文。
|
|
6
|
+
|
|
7
|
+
## 1. 当前行为基线
|
|
8
|
+
|
|
9
|
+
当前生产链路:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
TurnController.submit
|
|
13
|
+
-> CodingAgentApp.run_turn (@work thread=True, exclusive=True)
|
|
14
|
+
-> TurnController.run_turn
|
|
15
|
+
-> stream_agent
|
|
16
|
+
-> _iter_stream_events
|
|
17
|
+
-> TextualStreamSink
|
|
18
|
+
-> TranscriptController
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 行为矩阵
|
|
22
|
+
|
|
23
|
+
| 场景 | 当前语义 | 主要回归测试 |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| answer token + final update | delta 实时显示,完整消息只提交一次 | `test_runtime_streaming.py`, `test_stream_ui.py` |
|
|
26
|
+
| reasoning + answer | reasoning 先闭合,再提交 answer | `test_textual_stream_sink.py`, `test_stream_ui.py` |
|
|
27
|
+
| tool round | tool call/result 匹配并独立闭合 group | `test_stream_tool_items.py` |
|
|
28
|
+
| parallel tools | 以 call id 优先匹配,不随结果顺序串项 | `test_stream_tool_items.py` |
|
|
29
|
+
| nested subagents | nested item 归属对应 parent task | `test_stream_tool_items.py` |
|
|
30
|
+
| steer | model-only steer 不进入可见 answer | `test_stream_tool_items.py` |
|
|
31
|
+
| context compact | summary wrapper 隐藏,仅记录 compact | stream 相关测试 |
|
|
32
|
+
| HITL | 保留结果并标记 `interrupted=True`,提示 approve/reject | `test_stream_semantic_fixtures.py` |
|
|
33
|
+
| cancel | producer 被取消,checkpoint best-effort repair | `test_stream_cancel.py` |
|
|
34
|
+
| sync saver fallback | async 不兼容时回退 sync stream | `test_stream_cancel.py` |
|
|
35
|
+
| session switch late event | generation 变化后旧 renderer 丢弃回调 | `test_textual_stream_sink.py` |
|
|
36
|
+
|
|
37
|
+
## 2. P1 新基线
|
|
38
|
+
|
|
39
|
+
P1 引入 runtime-owned `TurnAccumulator` 后,增加以下契约:
|
|
40
|
+
|
|
41
|
+
- `StreamResult` 不再读取 Rich/Textual renderer 的 answer/reasoning buffer。
|
|
42
|
+
- runtime 事件携带 `thread_id`、`turn_id` 和严格递增 `sequence`。
|
|
43
|
+
- observer 失败不影响 Agent turn。
|
|
44
|
+
- `synapse.runtime.streaming` 不依赖 `synapse.ui` 或 Textual。
|
|
45
|
+
- retry notifier 使用 `ContextVar` 隔离并发 turn。
|
|
46
|
+
- 旧 `StreamSink` 和 `synapse.ui.stream` 调用方式保持兼容。
|
|
47
|
+
|
|
48
|
+
## 3. 性能测量方法
|
|
49
|
+
|
|
50
|
+
测试环境:Windows 11 `10.0.26200`、Python 3.12.9、AMD64 Family 23 Model 96。所有数据均为本机观测值,不作为跨平台硬阈值。
|
|
51
|
+
|
|
52
|
+
| 指标 | 方法 | 结果 |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| stream 单元测试总时长 | 62 个针对性 pytest 用例 wall time | 2.80s |
|
|
55
|
+
| 10k 字符事件累积 | `TurnAccumulator`,关闭网络和 DOM | 0.0175s,约 570k events/s |
|
|
56
|
+
| 50k 字符事件累积 | `TurnAccumulator`,关闭网络和 DOM | 0.0955s,约 523k events/s |
|
|
57
|
+
| runtime streaming 冷导入 | 独立 Python 进程,5 次 | 0.162-0.198s(不启用 tracemalloc) |
|
|
58
|
+
| 导入后 Python 工作集 | `Get-Process`,2s 快照,5 次 | 约 5.12 MB;该 Windows 沙箱的工作集数值仅作相对参考 |
|
|
59
|
+
| tracemalloc 当前/峰值 | 独立 Python 进程,导入 runtime streaming | 约 6.08/6.18 MB;启用追踪后导入 2.53-2.97s |
|
|
60
|
+
| cancel 返回时间 | `test_stream_cancel.py`,含固定 0.12s 触发延迟 | 1.13s call wall time |
|
|
61
|
+
| 文档构建 | `mkdocs build` wall time | 9.08s |
|
|
62
|
+
|
|
63
|
+
当前没有无 provider、无用户配置且能代表真实产品的“Agent ready”和“TUI mounted”端到端基准,因此 P0 不把网络/provider 初始化混入可重复门禁。第一 answer token 的 runtime 增量由同步 fake-agent trace 覆盖,DOM 刷新次数继续由 Textual sink 测试约束。P5 创建多个 SessionRuntime 后再测量每会话增量,并在 P8 确定内存预算。
|
|
64
|
+
|
|
65
|
+
## 4. 门禁命令
|
|
66
|
+
|
|
67
|
+
```powershell
|
|
68
|
+
uv run --no-sync pytest tests/test_runtime_streaming.py -q
|
|
69
|
+
uv run --no-sync pytest tests/test_stream_cancel.py tests/test_stream_tool_items.py -q
|
|
70
|
+
uv run --no-sync pytest tests/test_textual_stream_sink.py tests/test_turn_controller.py -q
|
|
71
|
+
uv run --no-sync ruff check .
|
|
72
|
+
uv run --no-sync pytest -q
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 5. 已知基线风险
|
|
76
|
+
|
|
77
|
+
- 当前 `stream_agent()` 语义解析主循环仍位于 `synapse.ui.stream`;P1 先建立 runtime 契约、累积器和 adapter,再迁移主循环,避免一次性重写成熟状态机。
|
|
78
|
+
- 当前 Textual worker 仍为 `exclusive=True`;这是 P3/P5 的目标,不在 P0-P1 提前开放并行。
|
|
79
|
+
- 当前 GoalService、MCP pool 等单例尚未项目化;P6 处理。
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Agent Runtime 解耦架构决策记录
|
|
2
|
+
|
|
3
|
+
> 状态说明:`Accepted` 表示当前实施基线;发生变化时追加新决策,不覆盖历史原因。
|
|
4
|
+
|
|
5
|
+
## ADR-001:采用单进程双 loop,不采用每项目常驻进程
|
|
6
|
+
|
|
7
|
+
- 状态:Accepted
|
|
8
|
+
- 决策:保留 Textual 主线程 loop 和现有进程级 Agent `AsyncRuntime` loop;所有项目运行时共享该 Agent loop。
|
|
9
|
+
- 原因:当前进程基线内存较高,每项目进程会重复加载 Python、DeepAgents、模型和中间件;同时还需引入高频流事件 IPC,成本与当前目标不匹配。
|
|
10
|
+
- 影响:项目隔离必须通过显式 `ProjectRuntime` 和资源 registry 完成,不能依赖进程边界。
|
|
11
|
+
- 重审条件:未来出现无法隔离的原生崩溃、高风险工具或明确的 daemon/RPC 产品需求。
|
|
12
|
+
|
|
13
|
+
## ADR-002:先解耦 Agent turn,再实现多会话和多项目
|
|
14
|
+
|
|
15
|
+
- 状态:Accepted
|
|
16
|
+
- 决策:P0-P3 只建立 UI-independent turn runtime 和 Textual adapter,不同时引入跨项目。
|
|
17
|
+
- 原因:当前 turn 生命周期、事件解析、DOM 更新和持久化交织;直接叠加多项目会扩大状态串线风险。
|
|
18
|
+
- 影响:P3 完成前不实现“切换后继续运行”的用户功能。
|
|
19
|
+
|
|
20
|
+
## ADR-003:Runtime 产生语义事件,TUI 负责展示策略
|
|
21
|
+
|
|
22
|
+
- 状态:Accepted
|
|
23
|
+
- 决策:运行层产生 answer、reasoning、tool、usage、activity 和终态事件;颜色、折叠、限频、DAG task 隐藏、Git chrome 刷新属于 UI renderer。
|
|
24
|
+
- 原因:DOM 命令无法供 CLI、测试和未来前端复用,也会让无订阅者运行失效。
|
|
25
|
+
- 影响:事件 payload 必须是纯领域数据,不能包含 Textual widget。
|
|
26
|
+
|
|
27
|
+
## ADR-004:运行结果不能依赖事件消费者状态
|
|
28
|
+
|
|
29
|
+
- 状态:Accepted
|
|
30
|
+
- 决策:answer/reasoning 累积、去重、usage 和最终状态由 runtime accumulator 保存;不能再从 `TextualStreamSink.answer_buf` 推导结果。
|
|
31
|
+
- 原因:消费者可能未订阅、丢弃预览事件或在会话切换时被替换。
|
|
32
|
+
- 影响:P1 需要建立独立 accumulator 和 legacy adapter。
|
|
33
|
+
|
|
34
|
+
## ADR-005:事件分为 turn-local 与 session-local 两层序号
|
|
35
|
+
|
|
36
|
+
- 状态:Accepted
|
|
37
|
+
- 决策:`AgentTurnRuntime` 产生 turn-local 单调序号;P4 的 SessionEventBroker 再分配 session-local 单调序号。
|
|
38
|
+
- 原因:P1 不应提前依赖全局项目身份;P4 attach/reattach 又需要跨 turn 的稳定游标。
|
|
39
|
+
- 影响:事件必须同时携带 `turn_id`,终态事件必须可去重。
|
|
40
|
+
|
|
41
|
+
## ADR-006:Catalog 是发现投影,不是运行时或会话正文真源
|
|
42
|
+
|
|
43
|
+
- 状态:Accepted
|
|
44
|
+
- 决策:`~/.synapse/catalog.sqlite` 继续只保存项目与会话元数据;项目本地 `.synapse` 数据库是 checkpoint、transcript 和 session 真源。
|
|
45
|
+
- 原因:避免全局库成为大体量单点,并保留项目可迁移和独立修复能力。
|
|
46
|
+
- 影响:选择全局会话时必须回源验证 workspace 和 thread。
|
|
47
|
+
|
|
48
|
+
## ADR-007:第一版并行会话使用独立 Agent graph,共享项目级昂贵资源
|
|
49
|
+
|
|
50
|
+
- 状态:Accepted
|
|
51
|
+
- 决策:P5 中每个正在运行的会话拥有独立 Agent graph、SteerQueue 和取消状态;同项目可共享 model client/cache、checkpointer 和 MCP scope。
|
|
52
|
+
- 原因:当前 SteerQueue 和部分中间件状态绑定 Agent graph,直接共享 graph 容易串线。
|
|
53
|
+
- 影响:P8 必须测量 graph 增量内存,并为 idle runtime 增加回收策略。
|
|
54
|
+
|
|
55
|
+
## ADR-008:项目切换不修改进程 cwd 和全局环境
|
|
56
|
+
|
|
57
|
+
- 状态:Accepted
|
|
58
|
+
- 决策:backend 通过固定 `root_dir` 工作;项目 `.env` 解析为项目私有 mapping,不使用 `load_dotenv(..., override=True)` 在并行运行期间修改 `os.environ`。
|
|
59
|
+
- 原因:进程 cwd 和环境变量是全局可变状态,无法支持并发项目。
|
|
60
|
+
- 影响:P6 需要调整 Settings/bootstrap 和 backend 子进程环境构造。
|
|
61
|
+
|
|
62
|
+
## ADR-009:迁移期保留兼容导出
|
|
63
|
+
|
|
64
|
+
- 状态:Accepted
|
|
65
|
+
- 决策:移动 `stream_agent`、`StreamResult`、normalizer 等实现时,保留现有 `synapse.ui.stream` 等公共导入路径的 re-export,直到调用方和扩展完成迁移。
|
|
66
|
+
- 原因:项目指南将包导出视为公共 API;一次性破坏会扩大回归面。
|
|
67
|
+
- 影响:每次删除兼容层必须有仓库搜索和迁移说明。
|
|
68
|
+
|
|
69
|
+
## ADR-010:不在本计划中实现跨程序退出持续运行
|
|
70
|
+
|
|
71
|
+
- 状态:Accepted
|
|
72
|
+
- 决策:运行实例生命周期以当前 Synapse 进程为边界;退出程序统一取消和关闭所有任务。
|
|
73
|
+
- 原因:daemon 需要进程管理、鉴权、IPC、重连和版本兼容,是独立产品能力。
|
|
74
|
+
- 影响:P8 只验证可靠 shutdown,不实现后台服务。
|
|
75
|
+
|
|
76
|
+
## 决策更新模板
|
|
77
|
+
|
|
78
|
+
```text
|
|
79
|
+
## ADR-NNN:标题
|
|
80
|
+
|
|
81
|
+
- 状态:Proposed | Accepted | Superseded
|
|
82
|
+
- 决策:
|
|
83
|
+
- 原因:
|
|
84
|
+
- 影响:
|
|
85
|
+
- 替代方案:
|
|
86
|
+
- 重审条件:
|
|
87
|
+
```
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
# Agent Runtime 与 TUI 解耦及全局项目管理总体方案
|
|
2
|
+
|
|
3
|
+
> 文档状态:Accepted<br>
|
|
4
|
+
> 实施状态:已完成(P0-P8 及 P7 UI 收尾)<br>
|
|
5
|
+
> 完成范围:Agent loop 与 TUI 的生命周期解耦、后台多会话、跨项目能力及稳定性收口均已完成。<br>
|
|
6
|
+
> 权威进度台账:[progress.md](progress.md)<br>
|
|
7
|
+
> 架构决策记录:[decisions.md](decisions.md)
|
|
8
|
+
|
|
9
|
+
## 1. 结论
|
|
10
|
+
|
|
11
|
+
本次演进采用以下总体架构:
|
|
12
|
+
|
|
13
|
+
- 保持单进程,不为每个项目创建常驻进程。
|
|
14
|
+
- 保持 Textual UI loop 与现有进程级 Agent `AsyncRuntime` loop。
|
|
15
|
+
- Agent turn、session 和 project runtime 不由 TUI widget 或 Textual worker 拥有。
|
|
16
|
+
- Agent runtime 只产生带明确归属和顺序的语义事件。
|
|
17
|
+
- TUI 通过进程内事件桥订阅事件并在主线程渲染。
|
|
18
|
+
- 项目是资源隔离域,会话是执行和取消域,TUI 是可随时 attach/detach 的客户端。
|
|
19
|
+
- `catalog.sqlite` 只负责全局发现和定位;项目本地数据库仍是会话数据真源。
|
|
20
|
+
|
|
21
|
+
第一阶段目标不是立即实现多项目,而是证明:
|
|
22
|
+
|
|
23
|
+
> 即使没有 `CodingAgentApp`、Textual widget 或实时订阅者,一次 Agent turn 仍可完整运行、取消、持久化并产出标准事件。
|
|
24
|
+
|
|
25
|
+
## 2. 背景与问题
|
|
26
|
+
|
|
27
|
+
当前代码已经有部分可复用基础:
|
|
28
|
+
|
|
29
|
+
- `src/synapse/runtime/async_runtime.py` 提供进程生命周期的后台 asyncio loop。
|
|
30
|
+
- `src/synapse/ui/stream.py` 使用 `StreamSink` 抽象 CLI/TUI 输出。
|
|
31
|
+
- `src/synapse/ui/turn/controller.py` 会冻结当前回合的 Agent 和 `thread_id`。
|
|
32
|
+
- transcript generation 可以丢弃切换后的迟到 UI 回调。
|
|
33
|
+
- `~/.synapse/catalog.sqlite` 已有项目和会话元数据投影。
|
|
34
|
+
|
|
35
|
+
但是 Agent turn 的生命周期仍由 `CodingAgentApp` 和 Textual worker 控制:
|
|
36
|
+
|
|
37
|
+
- `_busy`、`_cancel_event`、`_active_turn_agent`、`_active_turn_thread_id` 是 App 级状态。
|
|
38
|
+
- `run_turn` 使用 Textual `@work(thread=True, exclusive=True)`。
|
|
39
|
+
- `TextualStreamSink` 在运行过程中直接修改当前 transcript DOM。
|
|
40
|
+
- 回合收尾、usage、goal、summary、catalog 投影依赖当前 App 状态。
|
|
41
|
+
- `stream_agent()` 的结果还依赖 sink 的可变缓冲区。
|
|
42
|
+
- retry notifier、GoalService、MCP pool 等存在进程级单例或单槽状态。
|
|
43
|
+
|
|
44
|
+
因此,当前“切换 thread”不等于切换完整执行上下文,也无法让旧会话在 UI 切走后独立继续运行。
|
|
45
|
+
|
|
46
|
+
## 3. 目标
|
|
47
|
+
|
|
48
|
+
### 3.1 功能目标
|
|
49
|
+
|
|
50
|
+
1. Agent turn 可在无 TUI 环境中独立执行。
|
|
51
|
+
2. TUI 切换或暂时不订阅时不影响 Agent 执行。
|
|
52
|
+
3. 同一项目的多个会话可独立运行、取消、steer 和恢复观察。
|
|
53
|
+
4. Synapse 可在任意目录启动并浏览全部已注册项目及会话。
|
|
54
|
+
5. 选择跨项目会话后,Agent 使用该会话所属 workspace、配置和数据库工作。
|
|
55
|
+
6. 其他已启动会话继续运行,直到完成、单独取消或程序退出。
|
|
56
|
+
|
|
57
|
+
### 3.2 架构目标
|
|
58
|
+
|
|
59
|
+
- 运行层不导入 Textual,也不调用 `CodingAgentApp`。
|
|
60
|
+
- UI 层不拥有 Agent task,只发送命令和消费事件。
|
|
61
|
+
- 所有运行事件都有稳定归属、顺序和终态。
|
|
62
|
+
- 持久化只依赖冻结的运行上下文和领域事件,不依赖 widget 状态。
|
|
63
|
+
- 项目配置、Goal、MCP、backend 和数据库资源可按项目隔离。
|
|
64
|
+
- 所有队列、缓存、搜索和历史读取均有界。
|
|
65
|
+
|
|
66
|
+
## 4. 非目标
|
|
67
|
+
|
|
68
|
+
本计划当前不包含:
|
|
69
|
+
|
|
70
|
+
- 每项目一个进程或每会话一个进程。
|
|
71
|
+
- TUI 退出后 Agent 仍跨进程继续运行的 daemon。
|
|
72
|
+
- 网络 RPC 或 IPC 协议。
|
|
73
|
+
- 将全部项目会话正文集中迁移到全局数据库。
|
|
74
|
+
- 第一阶段直接开放无限并行。
|
|
75
|
+
- 在运行时动态修改进程 `cwd`。
|
|
76
|
+
|
|
77
|
+
未来如需要关闭 TUI 后仍继续执行,可在稳定的 RuntimeManager API 之外增加 daemon;不能让该需求反向污染当前解耦步骤。
|
|
78
|
+
|
|
79
|
+
## 5. 当前与目标依赖方向
|
|
80
|
+
|
|
81
|
+
### 5.1 当前方向
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
CodingAgentApp
|
|
85
|
+
-> TurnController
|
|
86
|
+
-> stream_agent
|
|
87
|
+
-> TextualStreamSink
|
|
88
|
+
-> TranscriptController / DOM
|
|
89
|
+
-> goal / steer / persistence / catalog
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 5.2 解耦里程碑后的方向
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
CodingAgentApp
|
|
96
|
+
-> TUI command adapter
|
|
97
|
+
-> AgentTurnRuntime
|
|
98
|
+
-> runtime streaming core
|
|
99
|
+
-> AgentEventSink
|
|
100
|
+
|
|
101
|
+
AgentEvent
|
|
102
|
+
-> TextualEventRenderer
|
|
103
|
+
-> TranscriptController / DOM
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 5.3 最终方向
|
|
107
|
+
|
|
108
|
+
```text
|
|
109
|
+
Synapse 单进程
|
|
110
|
+
├─ Textual UI loop(主线程)
|
|
111
|
+
│ ├─ Global project/session views
|
|
112
|
+
│ ├─ active SessionRef
|
|
113
|
+
│ └─ TextualEventRenderer
|
|
114
|
+
│
|
|
115
|
+
└─ Agent AsyncRuntime loop(后台线程)
|
|
116
|
+
└─ RuntimeManager
|
|
117
|
+
├─ ProjectRuntime A
|
|
118
|
+
│ ├─ SessionRuntime A/1
|
|
119
|
+
│ └─ SessionRuntime A/2
|
|
120
|
+
└─ ProjectRuntime B
|
|
121
|
+
└─ SessionRuntime B/1
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 6. 核心领域边界
|
|
125
|
+
|
|
126
|
+
### 6.1 Turn
|
|
127
|
+
|
|
128
|
+
一次用户提交或 HITL resume 对应一个不可变 `TurnContext`:
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
@dataclass(frozen=True)
|
|
132
|
+
class TurnContext:
|
|
133
|
+
thread_id: str
|
|
134
|
+
turn_id: str
|
|
135
|
+
agent: Any
|
|
136
|
+
settings: Settings
|
|
137
|
+
request: TurnRequest
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
运行开始后,TUI 的当前页面、活动 thread 或 model picker 都不能改变该上下文。
|
|
141
|
+
|
|
142
|
+
### 6.2 Session
|
|
143
|
+
|
|
144
|
+
会话是实际执行和取消域:
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
class SessionRuntime:
|
|
148
|
+
ref: SessionRef
|
|
149
|
+
agent: Any
|
|
150
|
+
status: SessionStatus
|
|
151
|
+
active_turn: TurnHandle | None
|
|
152
|
+
cancel_token: CancelToken
|
|
153
|
+
steer_queue: SteerQueue
|
|
154
|
+
usage: SessionUsage
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
同一会话同时最多一个 graph run;不同会话可在受控并发限制内运行。
|
|
158
|
+
|
|
159
|
+
### 6.3 Project
|
|
160
|
+
|
|
161
|
+
项目是资源和配置隔离域:
|
|
162
|
+
|
|
163
|
+
```python
|
|
164
|
+
class ProjectRuntime:
|
|
165
|
+
project_id: str
|
|
166
|
+
workspace: Path
|
|
167
|
+
settings: Settings
|
|
168
|
+
session_store: SessionStore
|
|
169
|
+
checkpointer: Any
|
|
170
|
+
goal_service: GoalService
|
|
171
|
+
mcp_scope: McpScope
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
项目不是独立进程,也不是独立 event loop。
|
|
175
|
+
|
|
176
|
+
### 6.4 UI
|
|
177
|
+
|
|
178
|
+
TUI 只负责:
|
|
179
|
+
|
|
180
|
+
- 查询项目和会话。
|
|
181
|
+
- 向 RuntimeManager 发送 open/submit/steer/cancel 命令。
|
|
182
|
+
- attach/detach 某个 `SessionRef`。
|
|
183
|
+
- 从 snapshot 和有序事件恢复并实时渲染。
|
|
184
|
+
- 展示状态,不决定运行是否继续。
|
|
185
|
+
|
|
186
|
+
## 7. 事件模型原则
|
|
187
|
+
|
|
188
|
+
Turn 层首先产出 turn-local 事件;SessionEventBroker 后续为其包装 session-local 序号。
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
@dataclass(frozen=True)
|
|
192
|
+
class TurnEvent:
|
|
193
|
+
thread_id: str
|
|
194
|
+
turn_id: str
|
|
195
|
+
sequence: int
|
|
196
|
+
kind: TurnEventKind
|
|
197
|
+
payload: object
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
最少事件集合:
|
|
201
|
+
|
|
202
|
+
- `turn_started`
|
|
203
|
+
- `activity_changed`
|
|
204
|
+
- `reasoning_delta` / `reasoning_completed`
|
|
205
|
+
- `answer_delta` / `answer_completed`
|
|
206
|
+
- `tool_batch_started`
|
|
207
|
+
- `tool_started` / `tool_updated` / `tool_finished`
|
|
208
|
+
- `tool_batch_finished`
|
|
209
|
+
- `usage_updated`
|
|
210
|
+
- `context_compacted`
|
|
211
|
+
- `info`
|
|
212
|
+
- `turn_cancelled`
|
|
213
|
+
- `turn_failed`
|
|
214
|
+
- `turn_completed`
|
|
215
|
+
|
|
216
|
+
约束:
|
|
217
|
+
|
|
218
|
+
- payload 必须是 runtime 领域数据,不能是 Textual widget。
|
|
219
|
+
- 运行结果不能依赖消费者是否存在或是否渲染了事件。
|
|
220
|
+
- delta 可以合并显示,但 completed/failed/cancelled 终态不能丢。
|
|
221
|
+
- UI 策略如 DAG task group 隐藏、Git chrome 刷新、颜色和折叠均留在 renderer。
|
|
222
|
+
|
|
223
|
+
## 8. 实施阶段
|
|
224
|
+
|
|
225
|
+
| 阶段 | 名称 | 核心产物 | 完成后的能力 |
|
|
226
|
+
|---|---|---|---|
|
|
227
|
+
| P0 | 基线与护栏 | 行为矩阵、回归 trace、依赖约束 | 可安全开始重构 |
|
|
228
|
+
| P1 | Streaming core 与事件契约 | UI-independent 事件、accumulator、兼容 adapter | 流解析不再以 UI sink 状态为真源 |
|
|
229
|
+
| P2 | AgentTurnRuntime | 无 TUI 的独立 turn 状态机与 API | headless turn 可完整运行 |
|
|
230
|
+
| P3 | TUI 事件适配与切换 | Textual renderer、现有 TUI 接入 | Agent loop 与 TUI 解耦里程碑完成 |
|
|
231
|
+
| P4 | SessionRuntime 与事件 Broker | task/cancel/goal/persistence 会话化 | 无订阅者时会话仍继续 |
|
|
232
|
+
| P5 | 同项目多会话 | RuntimeManager、会话并发与 attach/detach | 切换后旧会话继续运行 |
|
|
233
|
+
| P6 | ProjectRuntime | 项目配置和资源隔离 | 单进程内安全打开多个项目 |
|
|
234
|
+
| P7 | 全局控制面 | 任意位置启动、项目分组会话与操作 | 达成全局项目/会话管理目标 |
|
|
235
|
+
| P8 | 稳定性与性能收口 | 负载、内存、关闭、故障恢复验证 | 达到可长期运行标准 |
|
|
236
|
+
|
|
237
|
+
详细方案:
|
|
238
|
+
|
|
239
|
+
- [P0:基线与护栏](phase-0-baseline.md)
|
|
240
|
+
- [P1:Streaming core 与事件契约](phase-1-streaming-core.md)
|
|
241
|
+
- [P2:AgentTurnRuntime](phase-2-turn-runtime.md)
|
|
242
|
+
- [P3:TUI 事件适配与切换](phase-3-tui-cutover.md)
|
|
243
|
+
- [P4:SessionRuntime 与事件 Broker](phase-4-session-runtime.md)
|
|
244
|
+
- [P5:同项目多会话](phase-5-multi-session.md)
|
|
245
|
+
- [P6:ProjectRuntime](phase-6-project-runtime.md)
|
|
246
|
+
- [P7:全局控制面](phase-7-global-control-plane.md)
|
|
247
|
+
- [P8:稳定性与性能收口](phase-8-hardening.md)
|
|
248
|
+
|
|
249
|
+
## 9. 阶段门禁
|
|
250
|
+
|
|
251
|
+
每个阶段必须满足:
|
|
252
|
+
|
|
253
|
+
1. 上一阶段验收项全部通过。
|
|
254
|
+
2. `progress.md` 中不存在未处理的阻塞项。
|
|
255
|
+
3. 新公共边界有类型标注和最小文档。
|
|
256
|
+
4. 先运行最窄测试,再运行相关领域测试。
|
|
257
|
+
5. 涉及导入路径移动时保留必要 re-export。
|
|
258
|
+
6. 不允许通过关闭测试、放宽断言或吞异常绕过门禁。
|
|
259
|
+
7. 行为或配置变化同步更新用户文档。
|
|
260
|
+
|
|
261
|
+
P3 是首个强制停顿点:只有证明 Agent turn 在 TUI 无订阅时仍正确运行,才能开始 P4。
|
|
262
|
+
|
|
263
|
+
P5 是第二个强制停顿点:只有同项目多会话不串线,才能开始跨项目资源隔离。
|
|
264
|
+
|
|
265
|
+
## 10. 测试策略
|
|
266
|
+
|
|
267
|
+
### 10.1 分层测试
|
|
268
|
+
|
|
269
|
+
- 纯事件测试:fake LangGraph events -> ordered `TurnEvent`。
|
|
270
|
+
- Turn runtime 测试:headless 运行、取消、错误、HITL、retry。
|
|
271
|
+
- Adapter 合约测试:同一事件 trace 在 Rich/Textual 中语义一致。
|
|
272
|
+
- Session 测试:detach、reattach、后台完成、按会话取消。
|
|
273
|
+
- Project 测试:两个临时 workspace 的配置、文件和数据库不串线。
|
|
274
|
+
- TUI pilot 测试:实时 token、工具组、状态栏和历史恢复。
|
|
275
|
+
- 长时测试:并行任务、内存回收、程序关闭和异常恢复。
|
|
276
|
+
|
|
277
|
+
### 10.2 常用验证命令
|
|
278
|
+
|
|
279
|
+
```powershell
|
|
280
|
+
uv run --no-sync pytest tests/test_stream_cancel.py -q
|
|
281
|
+
uv run --no-sync pytest tests/test_stream_tool_items.py -q
|
|
282
|
+
uv run --no-sync pytest tests/test_textual_stream_sink.py -q
|
|
283
|
+
uv run --no-sync pytest tests/test_turn_controller.py -q
|
|
284
|
+
uv run --no-sync pytest tests/test_project_catalog.py -q
|
|
285
|
+
uv run --no-sync ruff check .
|
|
286
|
+
uv run --no-sync pytest -q
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
具体阶段的最窄测试见对应阶段文档。
|
|
290
|
+
|
|
291
|
+
## 11. 兼容与回滚策略
|
|
292
|
+
|
|
293
|
+
- 旧导入路径如 `synapse.ui.stream.stream_agent` 在迁移期继续 re-export。
|
|
294
|
+
- 每一阶段保持一个可工作的兼容 adapter,不允许同时重写 runtime 和所有 renderer。
|
|
295
|
+
- 先建立新路径和契约测试,再切换调用方,最后删除旧路径。
|
|
296
|
+
- 数据库 schema 变化必须向前迁移,不能要求用户删除本地状态。
|
|
297
|
+
- P0-P3 不改变现有用户命令和会话数据格式。
|
|
298
|
+
- 每阶段独立提交,出现回归时可按阶段回退。
|
|
299
|
+
|
|
300
|
+
## 12. 进度与方案更新规则
|
|
301
|
+
|
|
302
|
+
`progress.md` 是实施状态的单一真源:
|
|
303
|
+
|
|
304
|
+
- 开始任务前,将对应任务标为 `in_progress` 并更新“当前工作”。
|
|
305
|
+
- 完成任务后记录验证命令和结果,再标为 `completed`。
|
|
306
|
+
- 阻塞时记录证据、影响和解除条件,不能仅写“有问题”。
|
|
307
|
+
- 设计变化先更新 `decisions.md` 和对应阶段文档,再修改代码。
|
|
308
|
+
- 阶段完成时更新阶段验收、风险余项和变更日志。
|
|
309
|
+
- 阶段文档中的任务表定义范围,不重复维护实时状态。
|
|
310
|
+
|
|
311
|
+
## 13. 整体完成定义
|
|
312
|
+
|
|
313
|
+
只有同时满足以下条件,本计划才算完成:
|
|
314
|
+
|
|
315
|
+
- Agent runtime 包不依赖 Textual。
|
|
316
|
+
- TUI 切换订阅不会取消后台会话。
|
|
317
|
+
- 不同会话的事件、usage、goal、取消和持久化不串线。
|
|
318
|
+
- 不同项目的 workspace、配置、MCP、Goal 和数据库不串线。
|
|
319
|
+
- 任意目录启动不污染该目录,仍能浏览和打开已注册项目。
|
|
320
|
+
- 全局会话操作使用 `(project_id, thread_id)` 唯一定位。
|
|
321
|
+
- 运行中的会话只在完成、单独取消或程序退出时终止。
|
|
322
|
+
- 全量 Ruff、pytest 和文档构建通过。
|
|
323
|
+
- 长时运行的内存和任务数量符合 P8 确定的预算。
|