synapse-cli-agent 0.1.20__tar.gz → 0.1.22__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.20/.github/workflows/native-search-wheels.yml → synapse_cli_agent-0.1.22/.github/workflows/native-core-tool-wheels.yml +11 -11
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/CHANGELOG.md +42 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/PKG-INFO +21 -21
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/agent-development-guide.md +8 -4
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/architecture-flow.md +2 -2
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/architecture.md +3 -3
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/config.md +2 -0
- synapse_cli_agent-0.1.22/docs/native-core-tool.md +41 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/permissions.md +3 -2
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/sessions.md +11 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/tutorial.md +16 -10
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/mkdocs.yml +1 -1
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/pyproject.toml +24 -21
- synapse_cli_agent-0.1.22/release_body.md +16 -0
- {synapse_cli_agent-0.1.20/rust/synapse-search-core → synapse_cli_agent-0.1.22/rust/synapse-core-tool}/Cargo.lock +15 -37
- {synapse_cli_agent-0.1.20/rust/synapse-search-core → synapse_cli_agent-0.1.22/rust/synapse-core-tool}/Cargo.toml +6 -5
- synapse_cli_agent-0.1.22/rust/synapse-core-tool/README.md +29 -0
- {synapse_cli_agent-0.1.20/rust/synapse-search-core → synapse_cli_agent-0.1.22/rust/synapse-core-tool}/pyproject.toml +4 -4
- synapse_cli_agent-0.1.22/rust/synapse-core-tool/python/synapse_core_tool/__init__.py +3 -0
- synapse_cli_agent-0.1.22/rust/synapse-core-tool/src/file_access.rs +148 -0
- synapse_cli_agent-0.1.22/rust/synapse-core-tool/src/file_tools.rs +386 -0
- synapse_cli_agent-0.1.22/rust/synapse-core-tool/src/lib.rs +15 -0
- synapse_cli_agent-0.1.20/rust/synapse-search-core/src/lib.rs → synapse_cli_agent-0.1.22/rust/synapse-core-tool/src/search.rs +9 -30
- {synapse_cli_agent-0.1.20/rust/synapse-search-core → synapse_cli_agent-0.1.22/rust/synapse-core-tool}/uv.lock +3 -3
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/app/agent.py +11 -3
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/content/prompts.py +33 -10
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/mcp_client.py +1 -1
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/models/registry.py +2 -2
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/backends.py +82 -9
- synapse_cli_agent-0.1.22/src/synapse/runtime/filesystem_tool_prompt_middleware.py +37 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/harness.py +3 -2
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/model_request_compression_middleware.py +3 -3
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/safety.py +2 -1
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/subagents.py +6 -5
- synapse_cli_agent-0.1.22/src/synapse/sessions/search_index.py +282 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/sessions/store.py +8 -2
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/sessions/transcript.py +184 -16
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/settings/schema.py +13 -4
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tool_output/detection.py +15 -7
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tools/__init__.py +3 -1
- synapse_cli_agent-0.1.22/src/synapse/tools/filesystem_patch.py +33 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tools/session_tools.py +127 -21
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/base.py +40 -5
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/theme.py +1 -1
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/timeline.py +2 -2
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/transcript_blocks.py +9 -6
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/tui.py +371 -31
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/welcome.py +4 -3
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_agent_factory.py +6 -1
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_backends.py +74 -3
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_config.py +20 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_dialogs.py +72 -0
- synapse_cli_agent-0.1.22/tests/test_filesystem_patch_tool.py +48 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_layered_config.py +5 -1
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_prompts.py +44 -2
- synapse_cli_agent-0.1.22/tests/test_search_index.py +102 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_tool_output.py +43 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_transcript.py +126 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_tui_selection.py +37 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/uv.lock +25 -31
- synapse_cli_agent-0.1.20/docs/native-search-core.md +0 -44
- synapse_cli_agent-0.1.20/release_body.md +0 -21
- synapse_cli_agent-0.1.20/rust/synapse-search-core/README.md +0 -25
- synapse_cli_agent-0.1.20/rust/synapse-search-core/python/synapse_search_core/__init__.py +0 -3
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/.github/workflows/ci.yml +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/.github/workflows/docs.yml +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/.github/workflows/native-compression-wheels.yml +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/.github/workflows/release.yml +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/.gitignore +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/.python-version +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/.readthedocs.yaml +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/AGENTS.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/README.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/agent_upstream.txt +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/cli_upstream.txt +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/decode_screenshot.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/cli.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/codex-session-discovery-phase-1.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/codex-session-import-phase-2.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/design.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/index.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/install.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/mcp.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/models.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/native-compression-core.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/quickstart.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/skills.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/smith_output.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/tool-output-transform.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/tui-cursor-refactor.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/docs/x-agent-development-guide.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/examples/mcp.example.json +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/examples/models.example.json +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/examples/settings.example.json +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/middleware_upstream.txt +0 -0
- {synapse_cli_agent-0.1.20/rust/synapse-search-core → synapse_cli_agent-0.1.22/rust/synapse-core-tool}/LICENSE +0 -0
- {synapse_cli_agent-0.1.20/rust/synapse-search-core → synapse_cli_agent-0.1.22/rust/synapse-core-tool}/NOTICE +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/Cargo.lock +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/Cargo.toml +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/LICENSE +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/NOTICE +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/README.md +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/pyproject.toml +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/python/synapse_tool_compress_core/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/ccr.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/ccr_in_memory.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/mod.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/relevance/base.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/relevance/bm25.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/signals/keyword_detector.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/signals/line_importance.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/adaptive_sizer.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/anchor_selector.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/code_compressor.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/diff_compressor.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/log_compressor.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/search_compressor.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/analyzer.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/anchors.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/builder.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/classifier.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/classifier.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/compactor.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/formatter.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/ir.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/mod.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/compaction/walker.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/config.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/constraints.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crusher.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/crushers.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/error_keywords.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/field_detect.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/hashing.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/mod.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/observer.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/orchestration.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/outliers.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/planning.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/statistics.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/stats_math.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/traits.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/headroom_port/transforms/smart_crusher/types.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/rust/synapse-tool-compress-core/src/lib.rs +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/scripts/install.ps1 +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/scripts/release.ps1 +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/slash_cmds_upstream.txt +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/__main__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/app/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/app/agent_md.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/cli.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/commands/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/commands/compression.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/commands/helpers.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/commands/mcp.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/commands/model.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/commands/result.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/commands/sessions.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/commands/slash_cmds.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/commands/slash_complete.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/commands/theme.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/config.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/content/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/content/input_history.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/content/multimodal.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/content/skills_catalog.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/checkpoint_seed.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/codex_history.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/codex_import.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/codex_sessions.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/describe_image.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/http_clients.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/llm_openai_compat.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/llm_openai_websocket.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/openai_oauth.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/openai_oauth_middleware.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/openai_usage.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/integrations/vision_middleware.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/memory/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/memory/auto_recorder.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/memory/embedder.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/memory/long_term.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/models/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/models/config.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/models/helpers.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/models/profile.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/models_registry.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/observability/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/observability/debug_inspector.html +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/observability/debug_server.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/observability/llm_debug.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/observability/startup_trace.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/parallel_subagents.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/planner/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/planner/task_planner.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/rag/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/rag/knowledge_base.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/async_runtime.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/context_compact.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/debug_capture_middleware.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/execute_capture.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/fs_permissions.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/hitl.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/interaction_ledger.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/middleware.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/pathing.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/steer.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/subagent_routing.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/tool_ignore.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/tool_output_eval.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/tool_output_middleware.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/runtime/tool_output_usage_middleware.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/sessions/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/sessions/cancel_repair.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/sessions/session_recap.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/settings/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/settings/config_paths.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/subagent_monitor.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/subagents.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tool_output/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tool_output/metrics.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tool_output/models.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tool_output/pipeline.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tool_output/repository.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tool_output/transformers.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tools/describe_image.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/tools/filesystem_search.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/answer_divider.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/bottombar/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/bottombar/components/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/bottombar/components/codex_usage.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/bottombar/components/key_hints.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/bottombar/components/mcp.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/bottombar/components/mode.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/bottombar/components/model.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/bottombar/components/thread.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/bottombar/context.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/bottombar/core.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/clipboard.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/codex_reset.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/codex_session_list.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/compression_diagnostics.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/git_explore.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/mcp_panel.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/model_picker.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/safety_panel.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/session_list.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/subagent_monitor.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/theme_designer.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/dialogs/theme_picker.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/formatters.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/git_explore/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/git_explore/engine.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/git_explore/provider.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/git_explore/unified.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/rendering.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/selectable_static.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/selectable_text.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/sink.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/steer_widget.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/stream.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/stream_events.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/stream_runtime.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/textual_stream_sink.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/tool_blocks.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/components/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/components/branch.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/components/title.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/components/tool_output.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/components/usage.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/components/workspace.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/context.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/core.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/git_changes_popover.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/git_chrome.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/tool_output_popover.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/topbar/widget.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/turn_rail.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/turn_rail_widgets.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/user_turn.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/src/synapse/ui/user_turn_block.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/synapse.cmd +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/__init__.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/fixtures/codex_rollouts/duplicate_response_item.jsonl +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/fixtures/codex_rollouts/incomplete_and_aborted.jsonl +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/fixtures/codex_rollouts/legacy_compaction.jsonl +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/fixtures/codex_rollouts/normal_completed.jsonl +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/fixtures/codex_rollouts/replacement_history.jsonl +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/fixtures/codex_rollouts/rollback.jsonl +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/fixtures/codex_rollouts/unsupported_replacement.jsonl +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/fixtures/sample_repo/calculator.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/fixtures/sample_repo/test_calculator.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/fixtures/tool_output_eval.json +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_async_checkpointer.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_bottombar_registry.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_cancel_repair.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_capabilities.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_checkpoint_seed.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_cli.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_cli_codex_import.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_codex_history.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_codex_import.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_codex_sessions.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_codex_sessions_windows.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_compact_tool_descriptions.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_context_compact.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_context_window.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_dag_parallel.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_debug_capture_middleware.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_debug_inspector.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_describe_image.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_filesystem_search_tools.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_git_changes_popover.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_git_chrome.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_git_explore.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_http_clients.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_input_history.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_iteration_abc.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_mcp_schema.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_mermaid_render.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_middleware_async.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_model_request_compression_middleware.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_model_retry.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_multimodal.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_openai_compat_reasoning.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_openai_oauth.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_openai_oauth_middleware.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_openai_usage.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_openai_websocket.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_pathing.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_safety.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_session_recap.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_slash_and_mcp.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_slash_complete.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_startup_defer.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_steer.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_stream_cancel.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_stream_tool_items.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_stream_ui.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_subagent_monitor_dialog.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_subagent_status.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_textual_stream_sink.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_theme.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_timeline.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_tool_ignore.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_tool_intent.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_tool_output_eval.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_tool_output_slash.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_tool_output_usage_middleware.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_topbar_context_ratio.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_topbar_registry.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_tui_codex_import.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_turn_rail_minimap.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_usage_restore.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_user_turn_style.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/test_welcome.py +0 -0
- {synapse_cli_agent-0.1.20 → synapse_cli_agent-0.1.22}/tests/tool_output_plugin_fixture.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
name: Native
|
|
1
|
+
name: Native Core Tool Wheels
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
5
|
tags:
|
|
6
|
-
- "synapse-
|
|
6
|
+
- "synapse-core-tool-v*"
|
|
7
7
|
pull_request:
|
|
8
8
|
paths:
|
|
9
|
-
- "rust/synapse-
|
|
10
|
-
- ".github/workflows/native-
|
|
9
|
+
- "rust/synapse-core-tool/**"
|
|
10
|
+
- ".github/workflows/native-core-tool-wheels.yml"
|
|
11
11
|
workflow_dispatch:
|
|
12
12
|
|
|
13
13
|
permissions:
|
|
@@ -35,17 +35,17 @@ jobs:
|
|
|
35
35
|
- uses: PyO3/maturin-action@v1
|
|
36
36
|
with:
|
|
37
37
|
command: build
|
|
38
|
-
working-directory: rust/synapse-
|
|
38
|
+
working-directory: rust/synapse-core-tool
|
|
39
39
|
target: ${{ matrix.target }}
|
|
40
40
|
args: --release --locked --compatibility pypi --out dist
|
|
41
41
|
manylinux: 2014
|
|
42
42
|
- uses: actions/upload-artifact@v4
|
|
43
43
|
with:
|
|
44
44
|
name: wheel-${{ matrix.target }}
|
|
45
|
-
path: rust/synapse-
|
|
45
|
+
path: rust/synapse-core-tool/dist/*.whl
|
|
46
46
|
|
|
47
47
|
publish:
|
|
48
|
-
if: startsWith(github.ref, 'refs/tags/synapse-
|
|
48
|
+
if: startsWith(github.ref, 'refs/tags/synapse-core-tool-v')
|
|
49
49
|
needs: wheel
|
|
50
50
|
runs-on: ubuntu-latest
|
|
51
51
|
permissions:
|
|
@@ -59,15 +59,15 @@ jobs:
|
|
|
59
59
|
- uses: softprops/action-gh-release@v2
|
|
60
60
|
with:
|
|
61
61
|
files: dist/*.whl
|
|
62
|
-
name: synapse-
|
|
62
|
+
name: synapse-core-tool ${{ github.ref_name }}
|
|
63
63
|
|
|
64
64
|
publish-pypi:
|
|
65
|
-
if: startsWith(github.ref, 'refs/tags/synapse-
|
|
65
|
+
if: startsWith(github.ref, 'refs/tags/synapse-core-tool-v')
|
|
66
66
|
needs: wheel
|
|
67
67
|
runs-on: ubuntu-latest
|
|
68
68
|
environment:
|
|
69
69
|
name: pypi
|
|
70
|
-
url: https://pypi.org/p/synapse-
|
|
70
|
+
url: https://pypi.org/p/synapse-core-tool
|
|
71
71
|
permissions:
|
|
72
72
|
id-token: write
|
|
73
73
|
steps:
|
|
@@ -79,4 +79,4 @@ jobs:
|
|
|
79
79
|
- name: Publish wheels to PyPI
|
|
80
80
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
81
81
|
with:
|
|
82
|
-
packages-dir: dist/
|
|
82
|
+
packages-dir: dist/
|
|
@@ -7,6 +7,48 @@ The release workflow automatically extracts the matching section as release note
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## v0.1.22
|
|
11
|
+
|
|
12
|
+
### 新增功能
|
|
13
|
+
|
|
14
|
+
- TUI 恢复会话时改为分页加载:启动只渲染最近 `AGENT_HISTORY_TAIL_TURNS` 轮(默认 20),滚动到 transcript 顶部时异步加载更早历史并保持滚动位置,避免超长会话导致启动卡顿。
|
|
15
|
+
- 新增 `AGENT_HISTORY_TAIL_TURNS` 设置,控制 TUI 启动时初始渲染的最近可见会话轮数(支持环境变量与分层 `settings.json`)。
|
|
16
|
+
|
|
17
|
+
### 修复
|
|
18
|
+
|
|
19
|
+
- 修复历史分页异步加载的请求代际竞争:切换/重新加载会话后,旧分页 worker 的回调不再清除当前请求的加载状态或插入过期数据。
|
|
20
|
+
|
|
21
|
+
### 工程改进
|
|
22
|
+
|
|
23
|
+
- 直接依赖版本固定到 `uv.lock` 对应版本。
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## v0.1.21
|
|
28
|
+
|
|
29
|
+
### 新增功能
|
|
30
|
+
|
|
31
|
+
- 会话工具 `list_sessions` 重构为 `search_session`:新增本地增量全文索引(`SessionSearchIndex`),除标题/摘要/模型外支持会话消息全文双路命中;`query` 为空时列出最近会话,支持 `limit`/`offset` 分页与摘要。
|
|
32
|
+
- `read_session` 支持 `include_tools`(默认去掉工具消息,输出体积最多缩小 13 倍)与 `offset`/`limit` 轮次分页。
|
|
33
|
+
- 新增原生 `patch` 工具,`read_file`/`edit_file`/`patch` 全部路由到 `synapse-core-tool` 编码保持的原生实现。
|
|
34
|
+
- 新增 `AGENT_EXPAND_THINKING` 设置,控制 reasoning 块的展开/收起。
|
|
35
|
+
|
|
36
|
+
### 修复
|
|
37
|
+
|
|
38
|
+
- 修复 `load_messages_from_checkpointer` 只读最新 checkpoint 导致新版 SqliteSaver(delta 存储)下读不到消息:改为 delta 重建优先、旧逻辑兜底。
|
|
39
|
+
- 修复 `search_session` 索引库并发写锁竞争(`database is locked`):WAL + busy_timeout + 同步降级容错。
|
|
40
|
+
- 修复 JSON 类型检测晚于 LOG、无法识别括号风格日志的问题。
|
|
41
|
+
- 修复长对话框行标签被裁剪的问题。
|
|
42
|
+
|
|
43
|
+
### 工程改进
|
|
44
|
+
|
|
45
|
+
- 文件系统核心由 `synapse-search-core` 迁移并更名为 `synapse-core-tool`(新增原生 read/edit/patch),CI workflow 同步迁移为 `native-core-tool-wheels.yml`。
|
|
46
|
+
- 隐藏 DeepAgents 内置 `ls`/`glob`/`grep`,新增 prompt 中间件注入权威文件工具指引。
|
|
47
|
+
- 主 TUI 欢迎 logo 动画时机调整。
|
|
48
|
+
- 清理 `list_sessions` 旧名残留(docstring、错误提示、prompts、文档)。
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
10
52
|
## v0.1.20
|
|
11
53
|
|
|
12
54
|
### 新增功能
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: synapse-cli-agent
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.22
|
|
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
|
|
@@ -8,26 +8,26 @@ Project-URL: Issues, https://github.com/alex8224/synapse-agent/issues
|
|
|
8
8
|
Project-URL: Changelog, https://github.com/alex8224/synapse-agent/blob/main/CHANGELOG.md
|
|
9
9
|
Author-email: alex8224 <alex8224@gmail.com>
|
|
10
10
|
Requires-Python: >=3.12
|
|
11
|
-
Requires-Dist: aiosqlite
|
|
12
|
-
Requires-Dist: deepagents
|
|
13
|
-
Requires-Dist: httpx[socks]
|
|
14
|
-
Requires-Dist: langchain-anthropic
|
|
15
|
-
Requires-Dist: langchain-openai
|
|
16
|
-
Requires-Dist: langchain
|
|
17
|
-
Requires-Dist: langgraph-checkpoint-sqlite
|
|
18
|
-
Requires-Dist: langgraph
|
|
19
|
-
Requires-Dist: mcp
|
|
20
|
-
Requires-Dist: pydantic-settings
|
|
21
|
-
Requires-Dist: python-dotenv
|
|
22
|
-
Requires-Dist: rich
|
|
23
|
-
Requires-Dist: synapse-
|
|
24
|
-
Requires-Dist: termaid
|
|
25
|
-
Requires-Dist: texicode
|
|
26
|
-
Requires-Dist: textual-diff-view
|
|
27
|
-
Requires-Dist: textual
|
|
28
|
-
Requires-Dist: typer
|
|
29
|
-
Requires-Dist: websockets
|
|
30
|
-
Requires-Dist: zstandard
|
|
11
|
+
Requires-Dist: aiosqlite==0.22.1
|
|
12
|
+
Requires-Dist: deepagents==0.6.12
|
|
13
|
+
Requires-Dist: httpx[socks]==0.28.1
|
|
14
|
+
Requires-Dist: langchain-anthropic==1.4.8
|
|
15
|
+
Requires-Dist: langchain-openai==1.3.5
|
|
16
|
+
Requires-Dist: langchain==1.3.14
|
|
17
|
+
Requires-Dist: langgraph-checkpoint-sqlite==3.1.0
|
|
18
|
+
Requires-Dist: langgraph==1.2.9
|
|
19
|
+
Requires-Dist: mcp==1.28.1
|
|
20
|
+
Requires-Dist: pydantic-settings==2.14.2
|
|
21
|
+
Requires-Dist: python-dotenv==1.2.2
|
|
22
|
+
Requires-Dist: rich==15.0.0
|
|
23
|
+
Requires-Dist: synapse-core-tool<0.2.0,>=0.1.0
|
|
24
|
+
Requires-Dist: termaid==0.7.1
|
|
25
|
+
Requires-Dist: texicode==1.0.3
|
|
26
|
+
Requires-Dist: textual-diff-view==0.1.5
|
|
27
|
+
Requires-Dist: textual==8.2.8
|
|
28
|
+
Requires-Dist: typer==0.27.0
|
|
29
|
+
Requires-Dist: websockets==15.0.1
|
|
30
|
+
Requires-Dist: zstandard==0.25.0
|
|
31
31
|
Provides-Extra: dev
|
|
32
32
|
Requires-Dist: mkdocs-material>=9.7.7; extra == 'dev'
|
|
33
33
|
Requires-Dist: mkdocs>=1.6.1; extra == 'dev'
|
|
@@ -349,11 +349,15 @@ def git_status(workspace: str = ".") -> str:
|
|
|
349
349
|
|
|
350
350
|
| 来源 | 工具 | 如何注册 |
|
|
351
351
|
|------|------|---------|
|
|
352
|
-
| `deepagents`
|
|
353
|
-
|
|
|
354
|
-
| 会话工具 | `
|
|
352
|
+
| `deepagents` 框架内置(当前保留) | `read_file`, `write_file`, `edit_file`, `execute`, `write_todos`, `task` | `create_deep_agent` 自动注入;文件读写由 Synapse backend 接管 |
|
|
353
|
+
| Synapse 文件工具 | `find_files`, `search_files`, `patch` | 传入 `tools=[...]`;底层调用 `synapse-core-tool` |
|
|
354
|
+
| 会话工具 | `search_session`, `read_session` | 通过 `build_session_tools()` 动态创建 |
|
|
355
355
|
| MCP 工具 | 由外部 MCP Server 提供 | `load_mcp_tools()` 动态加载 |
|
|
356
356
|
|
|
357
|
+
DeepAgents 的 `ls`、`glob`、`grep` 会从模型请求中隐藏,避免与 Synapse 的
|
|
358
|
+
`find_files`、`search_files` 产生重名语义冲突。最终系统提示词也会注入与实际 schema
|
|
359
|
+
一致的权威工具说明。
|
|
360
|
+
|
|
357
361
|
### 6.3 `run_tests` 工具
|
|
358
362
|
|
|
359
363
|
```python
|
|
@@ -657,4 +661,4 @@ agent = create_deep_agent(
|
|
|
657
661
|
result = agent.invoke({"messages": [{"role": "user", "content": "..."}]})
|
|
658
662
|
```
|
|
659
663
|
|
|
660
|
-
这就是 Synapse 的核心骨架——在它的基础上,Synapse 增加了:SQLite 持久化、TUI 界面、MCP 集成、分层配置、子 Agent、中运行引导、安全审批等工程化能力。
|
|
664
|
+
这就是 Synapse 的核心骨架——在它的基础上,Synapse 增加了:SQLite 持久化、TUI 界面、MCP 集成、分层配置、子 Agent、中运行引导、安全审批等工程化能力。
|
|
@@ -423,11 +423,11 @@ idle > 180s + turn_count >= 3 → 单行摘要: `"任务 {user};工具 {tools}
|
|
|
423
423
|
|
|
424
424
|
### 9.1 跨会话查阅工具
|
|
425
425
|
|
|
426
|
-
`build_session_tools()` → `[
|
|
426
|
+
`build_session_tools()` → `[search_session, read_session, read_tool_result]`
|
|
427
427
|
|
|
428
428
|
| 工具 | 依赖 | 数据源 |
|
|
429
429
|
|---|---|---|
|
|
430
|
-
| `
|
|
430
|
+
| `search_session` | SessionStore + SessionSearchIndex | sessions.sqlite + search-index.sqlite |
|
|
431
431
|
| `read_session` | SessionStore + SqliteSaver | sessions.sqlite + checkpoints.sqlite |
|
|
432
432
|
| `read_tool_result` | ToolOutputRepository | tool-outputs.sqlite |
|
|
433
433
|
|
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
│ │
|
|
147
147
|
│ ┌──────────────────── 工具系统 ──────────────────────────────┐ │
|
|
148
148
|
│ │ tools/session_tools.py (工厂+闭包依赖注入) │ │
|
|
149
|
-
│ │ ├─
|
|
149
|
+
│ │ ├─ search_session(query, ...) 搜索本地会话 │ │
|
|
150
150
|
│ │ ├─ read_session(thread_id, ...) 读取对话历史 │ │
|
|
151
151
|
│ │ └─ read_tool_result(ref, ...) 读取压缩工具输出原文 │ │
|
|
152
152
|
│ │ │ │
|
|
@@ -312,7 +312,7 @@ cli.py
|
|
|
312
312
|
│ └→ CodingLocalShellBackend (subprocess)
|
|
313
313
|
├─ task (子Agent)
|
|
314
314
|
│ └→ DAGSubAgentMiddleware (缓存结果)
|
|
315
|
-
├─
|
|
315
|
+
├─ search_session/read_session
|
|
316
316
|
│ └→ SessionStore (SQLite)
|
|
317
317
|
├─ MCP tools
|
|
318
318
|
│ └→ McpSessionPool (stdio/SSE/HTTP)
|
|
@@ -589,7 +589,7 @@ Schema 演进:`_ensure_column()` 用 `PRAGMA table_info` 检测 `active_model`
|
|
|
589
589
|
|
|
590
590
|
**`resolve_startup_binding()` 模型恢复**:CLI --model 显式 > 会话级绑定 (`get_model_binding(thread_id)`) > 全局最后使用 (`get_last_model_binding`)。通过 `apply_binding_to_settings()` 写回 settings。
|
|
591
591
|
|
|
592
|
-
**`build_session_tools()` 闭包依赖注入**:`SessionStore` 和 `
|
|
592
|
+
**`build_session_tools()` 闭包依赖注入**:`SessionStore`、`checkpoint_path` 和 `tool_output_db_path` 通过闭包注入三个工具(`search_session` / `read_session` / `read_tool_result`)。三个工具标记了 `**默认禁止调用**` docstring。
|
|
593
593
|
|
|
594
594
|
### Codex 导入完整流水线
|
|
595
595
|
|
|
@@ -70,6 +70,7 @@ Synapse 使用 **Pydantic Settings** 实现分层配置系统。
|
|
|
70
70
|
| `CHECKPOINT_BACKEND` | `sqlite` | 检查点后端(`sqlite`/`memory`) |
|
|
71
71
|
| `CHECKPOINT_PATH` | `.coding-agent/checkpoints.sqlite` | 检查点存储路径 |
|
|
72
72
|
| `SESSIONS_PATH` | — | 会话元数据路径 |
|
|
73
|
+
| `AGENT_HISTORY_TAIL_TURNS` | `20` | TUI 启动时初始渲染的最近可见会话轮数;滚动到顶部后加载更早历史 |
|
|
73
74
|
|
|
74
75
|
### 子代理
|
|
75
76
|
|
|
@@ -94,6 +95,7 @@ Synapse 使用 **Pydantic Settings** 实现分层配置系统。
|
|
|
94
95
|
|---|---|---|
|
|
95
96
|
| `AGENT_THEME` | `cursor-dark` | TUI 主题 |
|
|
96
97
|
| `AGENT_TOOL_DETAILS_EXPANDED` | `true` | 工具详情默认展开 |
|
|
98
|
+
| `AGENT_EXPAND_THINKING` | `false` | 推理块不自动展开:流式时仅显示状态行,结束后折叠为一行预览;设为 `true` 时流式与结束后均完整展开 |
|
|
97
99
|
| `AGENT_DEBUG` | `false` | 调试模式 |
|
|
98
100
|
|
|
99
101
|
### 其他
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Native Core Tool
|
|
2
|
+
|
|
3
|
+
`synapse-core-tool` is the required PyO3 package that implements Synapse filesystem search, reading, exact editing, and unified-diff patching.
|
|
4
|
+
|
|
5
|
+
## Package Boundary
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
rust/synapse-core-tool/
|
|
9
|
+
Cargo.toml
|
|
10
|
+
pyproject.toml
|
|
11
|
+
src/
|
|
12
|
+
lib.rs
|
|
13
|
+
search.rs
|
|
14
|
+
file_access.rs
|
|
15
|
+
file_tools.rs
|
|
16
|
+
python/synapse_core_tool/__init__.py
|
|
17
|
+
.github/workflows/native-core-tool-wheels.yml
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`CodingLocalShellBackend` retains responsibility for resolving agent paths, enforcing workspace boundaries, applying configured deny paths, and converting host paths back to virtual paths. The native package receives only absolute authorized host paths.
|
|
21
|
+
|
|
22
|
+
The backend's existing `read_file` and `edit_file` model tools call the native `read` and `edit`
|
|
23
|
+
implementations. Synapse registers `find_files`, `search_files`, and `patch` as model-facing tools
|
|
24
|
+
backed by native `glob`, `grep`, and unified-diff implementations. DeepAgents' generic `ls`,
|
|
25
|
+
`glob`, and `grep` tools are hidden from model requests, and an authoritative system-prompt suffix
|
|
26
|
+
documents only the active Synapse schemas to prevent conflicting tool guidance.
|
|
27
|
+
|
|
28
|
+
## Distribution
|
|
29
|
+
|
|
30
|
+
A `synapse-core-tool-v*` tag triggers `.github/workflows/native-core-tool-wheels.yml`, which builds abi3 wheels for Windows x86_64, macOS Apple Silicon arm64, and Linux x86_64/aarch64, attaches them to a GitHub Release, and publishes them to PyPI.
|
|
31
|
+
|
|
32
|
+
For repository development, `uv` maps the dependency to `rust/synapse-core-tool`. Published Synapse wheels still declare the normal `synapse-core-tool` package dependency, so the native package must be published before a Synapse release that depends on it.
|
|
33
|
+
|
|
34
|
+
## Local Development
|
|
35
|
+
|
|
36
|
+
```powershell
|
|
37
|
+
maturin develop --manifest-path rust/synapse-core-tool/Cargo.toml
|
|
38
|
+
cargo test --manifest-path rust/synapse-core-tool/Cargo.toml
|
|
39
|
+
cargo fmt --manifest-path rust/synapse-core-tool/Cargo.toml --check
|
|
40
|
+
uv run --no-sync python -m pytest tests/test_backends.py -q
|
|
41
|
+
```
|
|
@@ -41,7 +41,8 @@ synapse tui -w . --readonly
|
|
|
41
41
|
export AGENT_READONLY=true
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
只读模式通过 harness 工具排除实现,会移除 `write_file`、`edit_file`、`
|
|
44
|
+
只读模式通过 harness 工具排除实现,会移除 `write_file`、`edit_file`、`patch`、
|
|
45
|
+
`execute` 等写入或执行类工具。
|
|
45
46
|
|
|
46
47
|
## 文件系统权限
|
|
47
48
|
|
|
@@ -104,4 +105,4 @@ export ENABLE_COMMAND_BLACKLIST=false
|
|
|
104
105
|
| `AGENT_DENY_FS_PATHS` | `[]` | 禁止访问路径 |
|
|
105
106
|
| `AGENT_ENABLE_FS_PERMISSIONS` | `false` | 启用 FS 权限 |
|
|
106
107
|
| `AGENT_EXCLUDED_TOOLS` | `[]` | 排除工具列表 |
|
|
107
|
-
| `ENABLE_COMMAND_BLACKLIST` | `true` | 命令黑名单 |
|
|
108
|
+
| `ENABLE_COMMAND_BLACKLIST` | `true` | 命令黑名单 |
|
|
@@ -34,6 +34,17 @@ synapse run "继续刚才的工作" --thread-id <thread_id> -w .
|
|
|
34
34
|
|
|
35
35
|
TUI 模式下也可以在界面内浏览和切换历史会话。
|
|
36
36
|
|
|
37
|
+
### TUI 恢复会话的分页加载
|
|
38
|
+
|
|
39
|
+
TUI 启动恢复会话时不会一次性渲染整个 transcript,而是只绘制最后
|
|
40
|
+
`history_tail_turns` 轮(默认 20 轮,可在配置中覆盖),避免超长会话
|
|
41
|
+
导致启动卡顿。更早的历史通过滚动分页加载:
|
|
42
|
+
|
|
43
|
+
- 启动后自动滚动到 transcript 底部,显示最近 N 轮。
|
|
44
|
+
- 滚动到 transcript 顶部时,异步加载更早的一批历史并插入到当前内容上方,
|
|
45
|
+
滚动位置保持不变,直到加载完整个会话。
|
|
46
|
+
- 切换会话(`/session`)或重新加载后,分页状态随 transcript 一起重置。
|
|
47
|
+
|
|
37
48
|
## 导出会话
|
|
38
49
|
|
|
39
50
|
将对话记录导出为 Markdown:
|
|
@@ -744,19 +744,25 @@ def _build_checkpointer(settings):
|
|
|
744
744
|
|
|
745
745
|
Agent 本身只是一个语言模型,只能"说"不能"做"。**工具**赋予了它行动能力。
|
|
746
746
|
|
|
747
|
-
### 7.1
|
|
747
|
+
### 7.1 当前 Agent 工具
|
|
748
748
|
|
|
749
749
|
| 工具名 | 功能 | 对应的人类操作 |
|
|
750
750
|
|--------|------|---------------|
|
|
751
751
|
| `read_file` | 读取文件内容 | 用编辑器打开文件 |
|
|
752
|
-
| `write_file` |
|
|
753
|
-
| `edit_file` | 精确替换文件片段 |
|
|
754
|
-
| `
|
|
752
|
+
| `write_file` | 创建新文件 | 新建文件并写入 |
|
|
753
|
+
| `edit_file` | 精确替换文件片段 | 修改一个唯一的小片段 |
|
|
754
|
+
| `patch` | 应用 unified diff | 修改已有文件中的多行内容 |
|
|
755
|
+
| `find_files` | 按 glob 模式查找路径 | 在资源管理器里搜索 `*.py` |
|
|
756
|
+
| `search_files` | 使用正则搜索文件内容 | 在代码中查找符号或文本 |
|
|
755
757
|
| `execute` | 执行 Shell 命令 | 在终端里输入命令 |
|
|
756
758
|
| `write_todos` | 创建/更新任务列表 | 写待办事项清单 |
|
|
757
759
|
| `task` | 委派子 Agent | 把任务分给同事 |
|
|
758
760
|
| `compact_conversation` | 压缩对话上下文 | 清空不需要的聊天记录 |
|
|
759
761
|
|
|
762
|
+
其中 `read_file`、`edit_file`、`find_files`、`search_files` 和 `patch` 的文件处理底层由
|
|
763
|
+
`synapse-core-tool` 提供。Deep Agents 原有的 `ls`、`glob`、`grep` 不会暴露给主 Agent,
|
|
764
|
+
以避免与 Synapse 文件搜索工具产生冲突。
|
|
765
|
+
|
|
760
766
|
### 7.2 自定义工具:会话查阅工具
|
|
761
767
|
|
|
762
768
|
除了内置工具,Synapse 还注册了两个自定义工具:
|
|
@@ -765,8 +771,8 @@ Agent 本身只是一个语言模型,只能"说"不能"做"。**工具**赋予
|
|
|
765
771
|
# src/synapse/tools/session_tools.py
|
|
766
772
|
|
|
767
773
|
@tool
|
|
768
|
-
def
|
|
769
|
-
"""
|
|
774
|
+
def search_session(query="", limit=20):
|
|
775
|
+
"""搜索本地会话,支持按标题/摘要/消息全文匹配;query 为空时列出最近会话。"""
|
|
770
776
|
# 默认禁止调用,只有用户明确要求才用
|
|
771
777
|
...
|
|
772
778
|
|
|
@@ -986,8 +992,8 @@ Parallel Sub-Agent 系统的核心是 `DAGSubAgentMiddleware`,它**替换了**
|
|
|
986
992
|
|
|
987
993
|
每个子 Agent 也是一个完整的 `CompiledStateGraph`(LangGraph 图),有自己的模型、系统提示词和工具集。创建时遵循以下原则:
|
|
988
994
|
|
|
989
|
-
- **共享 backend**:researcher/tester/reviewer 共用同一个 `CodingLocalShellBackend`,否则子 Agent
|
|
990
|
-
- **通过工具排除实现隔离**(而非 `FilesystemPermission`):因为 `LocalShellBackend` 不支持权限模式,改用 `ToolExclusionMiddleware` 从模型可见工具列表中直接移除被禁工具(如 researcher 的 `write_file`、`edit_file`、`execute`)。
|
|
995
|
+
- **共享 backend**:researcher/tester/reviewer 共用同一个 `CodingLocalShellBackend`,否则子 Agent 的文件读取、搜索和 `execute` 会变成"空壳"。
|
|
996
|
+
- **通过工具排除实现隔离**(而非 `FilesystemPermission`):因为 `LocalShellBackend` 不支持权限模式,改用 `ToolExclusionMiddleware` 从模型可见工具列表中直接移除被禁工具(如 researcher 的 `write_file`、`edit_file`、`patch`、`execute`)。
|
|
991
997
|
- **禁用 write_todos**:所有子 Agent 额外排除 `write_todos` 类任务规划工具,防止子 Agent 内部再拆解出"子子 Agent",造成递归复杂度爆炸。
|
|
992
998
|
- **每个子 Agent 可指定不同模型**:通过 `tester_model` / `reviewer_model` / `researcher_model` 设置,比如 tester 用便宜的模型(如 DeepSeek),researcher 用强推理模型(如 Claude)。
|
|
993
999
|
|
|
@@ -1612,7 +1618,7 @@ synapse tui --readonly
|
|
|
1612
1618
|
```
|
|
1613
1619
|
|
|
1614
1620
|
只读模式下,Agent 不能:
|
|
1615
|
-
- 写文件(`write_file`、`edit_file` 被排除)
|
|
1621
|
+
- 写文件(`write_file`、`edit_file`、`patch` 被排除)
|
|
1616
1622
|
- 执行命令(`execute` 被排除)
|
|
1617
1623
|
|
|
1618
1624
|
只能读取和搜索代码。
|
|
@@ -1876,4 +1882,4 @@ uv run --no-sync ruff check . # 代码检查
|
|
|
1876
1882
|
4. **关键模块**:agent.py(组装)、config.py(配置)、subagents.py(子 Agent)、middleware.py(中间件)
|
|
1877
1883
|
5. **如何扩展**:添加自定义工具、注册中间件、定义子 Agent、加载 Skills
|
|
1878
1884
|
|
|
1879
|
-
最重要的是:**动手实践**。把 15.1 节的代码复制到本地,运行它,修改它,打破它,修复它。这是最快的学会方式。
|
|
1885
|
+
最重要的是:**动手实践**。把 15.1 节的代码复制到本地,运行它,修改它,打破它,修复它。这是最快的学会方式。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "synapse-cli-agent"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.22"
|
|
4
4
|
description = "Local coding agent built on LangChain Deep Agents (LocalShell, no sandbox)"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [
|
|
@@ -9,26 +9,26 @@ authors = [
|
|
|
9
9
|
requires-python = ">=3.12"
|
|
10
10
|
|
|
11
11
|
dependencies = [
|
|
12
|
-
"synapse-
|
|
13
|
-
"aiosqlite
|
|
14
|
-
"deepagents
|
|
15
|
-
"httpx[socks]
|
|
16
|
-
"langchain
|
|
17
|
-
"langchain-anthropic
|
|
18
|
-
"langchain-openai
|
|
19
|
-
"langgraph
|
|
20
|
-
"langgraph-checkpoint-sqlite
|
|
21
|
-
"mcp
|
|
22
|
-
"pydantic-settings
|
|
23
|
-
"python-dotenv
|
|
24
|
-
"rich
|
|
25
|
-
"termaid
|
|
26
|
-
"texicode
|
|
27
|
-
"textual
|
|
28
|
-
"textual-diff-view
|
|
29
|
-
"typer
|
|
30
|
-
"websockets
|
|
31
|
-
"zstandard
|
|
12
|
+
"synapse-core-tool>=0.1.0,<0.2.0",
|
|
13
|
+
"aiosqlite==0.22.1",
|
|
14
|
+
"deepagents==0.6.12",
|
|
15
|
+
"httpx[socks]==0.28.1",
|
|
16
|
+
"langchain==1.3.14",
|
|
17
|
+
"langchain-anthropic==1.4.8",
|
|
18
|
+
"langchain-openai==1.3.5",
|
|
19
|
+
"langgraph==1.2.9",
|
|
20
|
+
"langgraph-checkpoint-sqlite==3.1.0",
|
|
21
|
+
"mcp==1.28.1",
|
|
22
|
+
"pydantic-settings==2.14.2",
|
|
23
|
+
"python-dotenv==1.2.2",
|
|
24
|
+
"rich==15.0.0",
|
|
25
|
+
"termaid==0.7.1",
|
|
26
|
+
"texicode==1.0.3",
|
|
27
|
+
"textual==8.2.8",
|
|
28
|
+
"textual-diff-view==0.1.5",
|
|
29
|
+
"typer==0.27.0",
|
|
30
|
+
"websockets==15.0.1",
|
|
31
|
+
"zstandard==0.25.0",
|
|
32
32
|
]
|
|
33
33
|
|
|
34
34
|
[project.urls]
|
|
@@ -55,6 +55,9 @@ build-backend = "hatchling.build"
|
|
|
55
55
|
[tool.hatch.build.targets.wheel]
|
|
56
56
|
packages = ["src/synapse"]
|
|
57
57
|
|
|
58
|
+
[tool.uv.sources]
|
|
59
|
+
synapse-core-tool = { path = "rust/synapse-core-tool" }
|
|
60
|
+
|
|
58
61
|
[tool.pytest.ini_options]
|
|
59
62
|
testpaths = ["tests"]
|
|
60
63
|
pythonpath = ["src"]
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
## v0.1.22
|
|
2
|
+
|
|
3
|
+
### 新增功能
|
|
4
|
+
|
|
5
|
+
- TUI 恢复会话时改为分页加载:启动只渲染最近 `AGENT_HISTORY_TAIL_TURNS` 轮(默认 20),滚动到 transcript 顶部时异步加载更早历史并保持滚动位置,避免超长会话导致启动卡顿。
|
|
6
|
+
- 新增 `AGENT_HISTORY_TAIL_TURNS` 设置,控制 TUI 启动时初始渲染的最近可见会话轮数(支持环境变量与分层 `settings.json`)。
|
|
7
|
+
|
|
8
|
+
### 修复
|
|
9
|
+
|
|
10
|
+
- 修复历史分页异步加载的请求代际竞争:切换/重新加载会话后,旧分页 worker 的回调不再清除当前请求的加载状态或插入过期数据。
|
|
11
|
+
|
|
12
|
+
### 工程改进
|
|
13
|
+
|
|
14
|
+
- 直接依赖版本固定到 `uv.lock` 对应版本。
|
|
15
|
+
|
|
16
|
+
---
|
|
@@ -34,6 +34,17 @@ version = "1.0.4"
|
|
|
34
34
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
35
35
|
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|
36
36
|
|
|
37
|
+
[[package]]
|
|
38
|
+
name = "chardetng"
|
|
39
|
+
version = "0.1.17"
|
|
40
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
41
|
+
checksum = "14b8f0b65b7b08ae3c8187e8d77174de20cb6777864c6b832d8ad365999cf1ea"
|
|
42
|
+
dependencies = [
|
|
43
|
+
"cfg-if",
|
|
44
|
+
"encoding_rs",
|
|
45
|
+
"memchr",
|
|
46
|
+
]
|
|
47
|
+
|
|
37
48
|
[[package]]
|
|
38
49
|
name = "crossbeam-deque"
|
|
39
50
|
version = "0.8.7"
|
|
@@ -158,12 +169,6 @@ dependencies = [
|
|
|
158
169
|
"rustversion",
|
|
159
170
|
]
|
|
160
171
|
|
|
161
|
-
[[package]]
|
|
162
|
-
name = "itoa"
|
|
163
|
-
version = "1.0.18"
|
|
164
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
165
|
-
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
|
166
|
-
|
|
167
172
|
[[package]]
|
|
168
173
|
name = "libc"
|
|
169
174
|
version = "0.2.189"
|
|
@@ -325,15 +330,6 @@ dependencies = [
|
|
|
325
330
|
"winapi-util",
|
|
326
331
|
]
|
|
327
332
|
|
|
328
|
-
[[package]]
|
|
329
|
-
name = "serde"
|
|
330
|
-
version = "1.0.229"
|
|
331
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
332
|
-
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
|
|
333
|
-
dependencies = [
|
|
334
|
-
"serde_core",
|
|
335
|
-
]
|
|
336
|
-
|
|
337
333
|
[[package]]
|
|
338
334
|
name = "serde_core"
|
|
339
335
|
version = "1.0.229"
|
|
@@ -354,19 +350,6 @@ dependencies = [
|
|
|
354
350
|
"syn 3.0.3",
|
|
355
351
|
]
|
|
356
352
|
|
|
357
|
-
[[package]]
|
|
358
|
-
name = "serde_json"
|
|
359
|
-
version = "1.0.151"
|
|
360
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
361
|
-
checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
|
|
362
|
-
dependencies = [
|
|
363
|
-
"itoa",
|
|
364
|
-
"memchr",
|
|
365
|
-
"serde",
|
|
366
|
-
"serde_core",
|
|
367
|
-
"zmij",
|
|
368
|
-
]
|
|
369
|
-
|
|
370
353
|
[[package]]
|
|
371
354
|
name = "syn"
|
|
372
355
|
version = "2.0.119"
|
|
@@ -390,15 +373,16 @@ dependencies = [
|
|
|
390
373
|
]
|
|
391
374
|
|
|
392
375
|
[[package]]
|
|
393
|
-
name = "synapse-
|
|
394
|
-
version = "0.1.
|
|
376
|
+
name = "synapse-core-tool"
|
|
377
|
+
version = "0.1.0"
|
|
395
378
|
dependencies = [
|
|
379
|
+
"chardetng",
|
|
380
|
+
"encoding_rs",
|
|
396
381
|
"globset",
|
|
397
382
|
"grep-regex",
|
|
398
383
|
"grep-searcher",
|
|
399
384
|
"ignore",
|
|
400
385
|
"pyo3",
|
|
401
|
-
"serde_json",
|
|
402
386
|
"thiserror",
|
|
403
387
|
]
|
|
404
388
|
|
|
@@ -473,9 +457,3 @@ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
|
|
|
473
457
|
dependencies = [
|
|
474
458
|
"windows-link",
|
|
475
459
|
]
|
|
476
|
-
|
|
477
|
-
[[package]]
|
|
478
|
-
name = "zmij"
|
|
479
|
-
version = "1.0.23"
|
|
480
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
481
|
-
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
[package]
|
|
2
|
-
name = "synapse-
|
|
3
|
-
version = "0.1.
|
|
2
|
+
name = "synapse-core-tool"
|
|
3
|
+
version = "0.1.0"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
rust-version = "1.80"
|
|
6
6
|
license = "Apache-2.0"
|
|
7
|
-
description = "Native
|
|
7
|
+
description = "Native filesystem tools for Synapse."
|
|
8
8
|
publish = false
|
|
9
9
|
|
|
10
10
|
[lib]
|
|
11
|
-
name = "
|
|
11
|
+
name = "synapse_core_tool"
|
|
12
12
|
crate-type = ["cdylib", "rlib"]
|
|
13
13
|
|
|
14
14
|
[dependencies]
|
|
15
|
+
chardetng = "0.1"
|
|
16
|
+
encoding_rs = "0.8"
|
|
15
17
|
grep-regex = "0.1"
|
|
16
18
|
grep-searcher = "0.1"
|
|
17
19
|
globset = "0.4"
|
|
18
20
|
ignore = "0.4"
|
|
19
21
|
pyo3 = { version = "0.23", features = ["abi3-py312", "extension-module"] }
|
|
20
|
-
serde_json = "1.0"
|
|
21
22
|
thiserror = "2.0"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# synapse-core-tool
|
|
2
|
+
|
|
3
|
+
Required Rust/PyO3 implementation of Synapse filesystem operations.
|
|
4
|
+
|
|
5
|
+
The Python module `synapse_core_tool` exports:
|
|
6
|
+
|
|
7
|
+
- `grep` and `glob` for ignore-aware workspace search;
|
|
8
|
+
- `read` for bounded file or directory reads;
|
|
9
|
+
- `edit` for exact string replacement with line-ending compatibility;
|
|
10
|
+
- `patch` for unified-diff updates.
|
|
11
|
+
|
|
12
|
+
Text edits preserve detected UTF-8/UTF-16 BOMs and legacy encodings. The Python backend resolves and authorizes paths before calling this module; the native package accepts only absolute host paths.
|
|
13
|
+
|
|
14
|
+
## Distribution
|
|
15
|
+
|
|
16
|
+
Release tags use the format `synapse-core-tool-v{version}`. The `native-core-tool-wheels` workflow builds abi3 wheels for Windows x86_64, macOS Apple Silicon arm64, and Linux x86_64/aarch64, then publishes them to PyPI.
|
|
17
|
+
|
|
18
|
+
Build and install locally:
|
|
19
|
+
|
|
20
|
+
```powershell
|
|
21
|
+
maturin develop --manifest-path rust/synapse-core-tool/Cargo.toml
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Run Rust checks:
|
|
25
|
+
|
|
26
|
+
```powershell
|
|
27
|
+
cargo test --manifest-path rust/synapse-core-tool/Cargo.toml
|
|
28
|
+
cargo fmt --manifest-path rust/synapse-core-tool/Cargo.toml --check
|
|
29
|
+
```
|