comate-cli 0.12.4b2__tar.gz → 0.12.4b3__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.
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/CHANGELOG.md +4 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/PKG-INFO +2 -2
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/main.py +20 -6
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/app.py +3 -2
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/rpc_relay.py +13 -1
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/render_panels.py +1 -1
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/docs/cli-rpc-stdio-guide.md +119 -43
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/pyproject.toml +2 -2
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_main_args.py +19 -3
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_rpc_mode_logging.py +1 -1
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_rpc_relay_dial_out.py +53 -6
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/uv.lock +2 -2
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/bash/3b0c312b1a234220818cb8cc15a12ea1565c69dc5f828351a492dab1add0cf84.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/bash/b0696d5d44fdde7597b8e9bd706d61237290ebca0c1c99273799393a7af99316.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/bash/e1164ab5f5f1e125db38bb44420532265c958f19533fbda8700db5a8aa4c3d68.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/00f8013ce28fed8e3076db6490d6a3de8dbc1f57f5248a1f5e2710f11ab6849c.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/0a5f3319bc1813a523b8d041831399f3ea694fcdb96f4b1df740300d08c60521.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/17dc19a9b5faddcd056013e7783c8d23525d060b7b20a73ee241c569bedea6d8.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/2b488f719c3431607773d9cebef4924ebfa33745adc68d8ee0f89596c608a218.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/32ce175150a77180dda04a76ea66b9ee5b0c46ea0fd0842172bacece964d57a4.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/43166c9eb998d1a426ce0c014348e39adc8c8e1d3d7a94ced4cc33ab268ecdeb.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/4afc47414280761b7c94ff91f7477c4eb5602396da89303b403c6f3ef9535fd0.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/56fca6c3112743a94cd0df58e04ee6dda31546ed53d50f8bf907dccb6f5329d3.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/605fcb1ca26d1cb632e364dd044d280a12ad4f188db698d5bad57fe1ff556ce3.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/6763a04477b314da76472e76696c8b03ee89fffc23ce74a22c634ea373840acd.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/6d1856ff719ee695ed9205cf68723a263f8c70fe090295037c1c9a837f8eac13.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/6e08c59431a214d8c3650a701cbaaf9125503d59d28476642f8b5a0ad6c8ed93.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/746f6a3b34e30583972816a0052d99e8297096ba522d66027b085e3a0069b7db.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/7c8fa2270ca7721e8619ba7eaec744100877330317dd5e8a1e42494a09579317.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/7cc3e32a61277dc3e35039fdc1cac3691e147cd50d8d16fa75447de7d11abb77.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/8203d4eaf35b0bb224cb12067e638b7f873ae0af05a590adedc02ae159a08099.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/82a7ce335091c00f8aee0ff54b6a75ed25fb6f7a2f4bf8d29921c3f2704ada81.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/82e9a29128ad224555ae0e85dddcc118d92a8f4faf4c8a3c3702c6b43dc71511.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/83be41699a979e16de16f3095981346f337fda56a3c254420df953e2de87d982.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/84074b6fda0e110d23094926c0d1846130be2b3870b1bcd5516243bae808b209.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/a92368734a2d79c15eaba1c7d282bab2d4150ccde0e41e30628cfb6b7be6a678.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/b02349374e026c124a60335b4b0e77698e4b7f8391f2466c827f6f80a8d596b2.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/b41279d93d2b1f03e99bf2fdcd4477781edf3546256489e2d37f082fa414ef94.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/bde0cfc02d38109cc02a28dd07611e464db9b47fef8b16fc25591866e5003316.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/c0e234da2bfe338ffbce547372af90d36ce7580361b69664823d12fac048a86e.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/c979b9589e166ae451c819fc8fc1efdf9eb042ce7af99e420a5b540f0d041a7a.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/dd39676b55965a3e04c1b28c82cd9c15e335776f39f325f61854d3e48aa87859.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/eac0d88d65c24b10af556c030b795f3312cc70fc80f8f64575205ea1a6476264.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/ef063804b585209aafbded7c27ad8d5eacbad17b3bb967022290a9efd01f6d13.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/f75a98ad1ac3c085060f90492292060b3720dfa98c776e61a643b9824d1dc237.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/faffcd8b4abd87e4abff3b72dcde673e844a4d7e230fbcc5c116ddd11815c37b.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/fb29e07995891317ca0daa3257e541238908889bc7a68efeba695c8ac3a2db86.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/grep_content/feed470ec463825f43ae4e1b92a5996b1dbad91605fe491f39c9ee60879b7155.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/index.json +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/ls/5a0a29a96857998fdfe5696c09b9c60027a6529e21108e22a20f5227afeddb59.json +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/tool_result/1f093e98c0f4026921bb2df0c7c04d6b55b51ec40c9fbf38ba57bd387399127d.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/tool_result/57c31009cc3665a6a672811ecf048cfb75ff7bae92598df943f492c53d39ca8e.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/tool_result/916a2e47f13fd22d3a73a4896c7a5edb3381b8a2c8322ce3ab8a4bf9da94c4a0.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/tool_result/91f5872f5b4b1b43f16589f7dd25e47236a805e848b37307cef464e881307fe1.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/tool_result/9871dc91ff9afef1303c74cf669996828a7db3dbff6c4c41fbac0a53fd7d195b.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/tool_result/af594562a5579ffc9bef105dc77ed26408b2408447005046c9c6505541e2776a.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/tool_result/c52ec3da48b3a731ed42cc357258a4627d2d11fab5ef14d3050fd50e748151d4.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/tool_result/f8c08a56feb0812b35a8e4b29a721d38c0aacd83ce3620c432d8b52114c14816.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/artifacts/tool_result/fa30187a59d255f168806ee0de7a0a32b00535e53e7c5420aad1bac44b54a667.txt +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.agent/scheduled_prompts.json +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/.gitignore +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/CONTEXT.md +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/README.md +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/__main__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/device_identity.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/distribution.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/mcp_cli.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/animations.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/approval_bridge.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/approval_content_preview.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/assistant_render.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/backend/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/backend/announcements.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/backend/client.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/backend/feedback.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/backend/provider_snapshot.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/backend/rating.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/backend/runtime.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/backend/session_report.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/backend/session_title.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/backend/tasks.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/bash_command_display.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/builtin_commands/.keep +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/builtin_commands/commit.md +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/builtin_commands/implement-plan.md +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/builtin_commands/learn.md +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/builtin_commands/pr.md +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/clipboard_image.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/codenames.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/config/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/config/model.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/config/picker.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/config/picker_state.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/config/store.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/config_check.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/console_profile.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/context_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/custom_slash_commands.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/effort_menu.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/effort_ruler.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/effort_style.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/env_utils.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/error_display.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/event_renderer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/exit_confirm_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/exit_watchdog.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/figures.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/file_ref_hint.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/fragment_utils.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/goal_edit_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/goal_resume_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/history_printer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/i18n/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/i18n/_en.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/i18n/_ja.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/i18n/_zh.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/i18n/message.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/image_chips.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/input_geometry.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/jobs_picker.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/jobs_state.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/layout_coordinator.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/locale.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/logging_adapter.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/logging_file_handler.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/logo.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/markdown_render.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/mcp_serve.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/mention_completer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/message_style.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/model_tier_style.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/models.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/output_style_menu.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/auto_update_runner.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/auto_update_store.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/components/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/components/detail_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/components/plugin_list.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/components/search_box.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/components/tab_bar.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/marketplace_install_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/operation_state.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/plugin_picker.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/tabs/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/tabs/discover_tab.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/tabs/errors_tab.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/tabs/installed_tab.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/plugins/tabs/marketplaces_tab.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/preflight.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/preflight_wizard.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/preflight_wizard_ui.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/print_mode.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/question_broker.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/question_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/recap/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/recap/controller.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/resume_picker.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/resume_preview.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/resume_selector.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/rpc_commands.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/rpc_stdio.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/rpc_ws.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/scm_request_status.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/selection_menu.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/side_install.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/sigint_guard.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/skill_slash_input.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/skills_menu.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/slash_commands.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/startup.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/startup_profile.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/status_bar.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/statusline/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/statusline/model.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/statusline/picker.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/statusline/picker_state.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/statusline/store.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/stream_pacer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/synchronized_output.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/text_effects.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/theme.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tips.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tool_approval_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tool_fold.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tool_fold_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tool_result_formatters.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tool_result_state.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tool_result_store.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tool_result_viewer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tool_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/transcript_viewer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/approval_queue.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/btw_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/commands.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/history_sync.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/input_behavior.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/key_bindings.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/mcp_connecting_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/resize_guard.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/run_clock.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/shell_mode.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/slash_command_registry.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/ui_mode.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/ultracode_keyword.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/update_check.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/update_messages.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/workflows_panel.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/workflows_panel_model.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_title.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/update_cli.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/docs/release-notes/0.12.3.md +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/docs/startup-performance.md +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/docs/superpowers/plans/2026-07-07-tui-first-repaint-before-sdk-submit.md +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/docs/superpowers/plans/2026-07-07-windows-update-manual-rollback.md +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/_fake_anthropic_server.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/_rpc_ws_client.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/config/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/config/test_model.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/config/test_picker_state.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/config/test_picker_ui.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/config/test_roundtrip.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/config/test_skills_denylist_migration.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/config/test_store_load.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/config/test_store_save.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/conftest.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/fixtures/exit_watchdog_child.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/fixtures/fake_mcp_misbehaving_stdout.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/recap/test_idle_recap_controller.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/recap/test_recap_history_rendering.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/recap/test_tui_idle_recap_integration.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/statusline/__init__.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/statusline/test_model.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/statusline/test_picker_state.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/statusline/test_store.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_animations_styles.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_animator_shuffle.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_config_check_gate.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_exit_lifecycle.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_mcp_preload.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_mcp_preload_kick.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_preflight_gate.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_print_mode.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_profile_threading.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_pty_ctrl_b.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_pty_ctrl_c_exit.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_pty_shell_mode.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_pty_smoke.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_shutdown.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_startup_latency.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_startup_order.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_token_cost_config.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_app_usage_line.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_approval_bridge.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_approval_content_preview.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_backend_announcements.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_backend_client.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_backend_feedback.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_backend_provider_snapshot.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_backend_rating.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_backend_session_report.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_backend_tasks.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_btw_slash_command.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_busy_slash_gating.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_cli_project_root.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_clipboard_image_reader.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_commands_system_messages.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_compact_command_semantics.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_completion_context_activation.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_completion_status_panel.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_config_check.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_console_profile.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_context_command.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_context_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_ctrl_b_background.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_ctrl_c_clear_input.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_custom_slash_commands.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_device_identity.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_discover_tab.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_distribution_contract.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_drain_frame_atomicity.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_effort_menu.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_effort_menu_frame_rate.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_effort_ruler.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_effort_slash_command.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_effort_style.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_errors_tab.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_approval_wait.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_boundary.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_e2e.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_jobs.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_log_boundary.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_log_queue.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_shell.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_stream_pacing.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_stream_staging.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_streaming.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_tool_args_progress.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_event_renderer_tool_fold.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_exit_confirm_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_exit_guard.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_exit_watchdog.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_exit_watchdog_subprocess.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_file_ref_hint.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_format_error.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_goal_edit_handlers.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_goal_edit_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_goal_paused_hint.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_goal_resume_tui.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_goal_resume_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_goal_slash_command.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_handle_error.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_history_drain_throttle.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_history_printer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_history_printer_log.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_history_printer_styles.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_history_printer_subtitle_position.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_history_printer_tool_fold.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_history_sync.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_history_sync_tool_fold.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_i18n.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_image_chips.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_image_preprocess_offload_lag.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_import_weight.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_input_behavior.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_input_history.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_input_separator_counter.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_installed_tab.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_interrupt_exit_semantics.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_jobs_panel.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_jobs_picker.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_key_bindings_system_messages.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_layout_coordinator.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_loading_modal_suppression.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_loading_tip_picker.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_logging_adapter.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_logging_file_handler.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_logo.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_main_args_yolo.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_main_profile_entry.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_markdown_render.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_marketplaces_tab.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_mcp_cli.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_mcp_cli_scope_defaults.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_mcp_serve.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_mcp_slash_command.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_mention_completer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_menu_cursor_unification.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_message_style.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_modal_freeze_timing.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_modal_panel_visibility.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_model_switch_command.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_model_tier_style.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_no_raw_colors.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_output_style_slash_command.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_permission_mode_cycle.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_plugin_auto_update_runner.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_plugin_auto_update_store.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_plugin_auto_update_tui.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_plugin_operation_state.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_plugin_slash_commands.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_plugin_tui_components.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_preflight.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_preflight_copilot.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_preflight_wizard_ui.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_pty_output_integrity.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_question_broker.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_question_key_bindings.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_question_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_resize_guard.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_resume_picker.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_resume_picker_exit_safety.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_resume_preview.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_resume_selector.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_rewind_command_semantics.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_rpc_relay_e2e_smoke.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_rpc_relay_process_smoke.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_rpc_v4_stdio_smoke.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_rpc_v4_ws_smoke.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_rpc_ws_bind_failure.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_run_clock.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_running_tool_status_line.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_scm_request_status.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_scrollback_write_encoding.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_selection_menu.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_session_auto_title.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_session_query_token_summary.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_settings_write_guard.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_shell_mode.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_shutdown_noise_guard.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_shutdown_noise_integration.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_side_install.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_sigint_guard.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_sigint_key_binding.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_skill_slash_input.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_skills_slash_command.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_slash_add_dir.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_slash_argument_hint.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_slash_clear.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_slash_completer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_slash_registry.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_startup_import_budget.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_startup_profile.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_status_bar.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_status_bar_mid_turn_refresh.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_status_bar_request_status.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_status_bar_transient.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_stream_pacer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_stream_pacing_tick.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_stream_staging_panel.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_style_class_coverage.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_synchronized_output.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tab_title.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_task_panel_format.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_task_panel_key_bindings.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_task_panel_rendering.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_task_poll.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_terminal_title.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_theme.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tips.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_todo_panel_busy_gating.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_approval_key_bindings.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_approval_tui.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_approval_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_approval_view_workflow.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_fold.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_fold_panel.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_fold_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_result_formatters.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_result_state.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_result_store.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_result_viewer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_result_viewer_key_bindings.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_view.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tool_view_styles.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_transcript_viewer.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_transcript_viewer_tool_fold.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_builtin_slash_chain.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_deferred_prewarm.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_elapsed_status.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_esc_queue.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_exit_idempotence.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_hot_reload.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_image_chip_seed.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_image_paste.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_image_path_upgrade.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_image_restore.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_image_submit.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_interrupt_queue_recall.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_llm_retry_panel.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_loading_tip_rotation.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_local_interactive_barrier.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_mcp_init_gate.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_paste_history_persistence.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_paste_newline_guard.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_paste_placeholder.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_plugin_load.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_provider_error_shield.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_queue_pop_images.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_queue_preview.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_queue_sdk_source.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_replace_session_resume_hint.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_scheduled_fire_log.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_scratchpad_fold_wiring.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_send_undo_window.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_session_observers.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_shutdown_cancel_propagation.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_split_invariance.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_startup_latency.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_surrogate_repair.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_thinking_display.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_tool_result_registry_lifecycle.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_tui_window_too_small_fallback.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_ui_mode_derivation.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_ui_tick_exception_isolation.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_ultracode_keyword.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_ultracode_keyword_frame_rate.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_ultracode_keyword_submit.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_ultracode_shimmer_render.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_update_check.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_update_cli.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_upstream_surrogate_merge_characterization.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_usage_command.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_wellformed_terminal_input.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_whitelabel_clear_logo.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_windows_sigint_console.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_workflows_panel.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_workflows_panel_model.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_wrap_user_text.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tests/test_zipapp_launcher_path.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tools/diagnose_windows_shim_rename.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tools/logo_lab.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tools/nico_preview.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tools/probe_conhost_char_width.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tools/probe_conhost_render_replay.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tools/startup_bench.py +0 -0
- {comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/tools/verify_windows_self_update_semantics.py +0 -0
|
@@ -71,6 +71,10 @@
|
|
|
71
71
|
标签不再展示 `uv tool install …` 长串(与 Windows 对齐),措辞改为「退出后运行」;
|
|
72
72
|
更新失败的兜底文案仍保留完整 uv 修复命令。源码 editable 安装下自更新必然被拒,
|
|
73
73
|
启动检测与第二次启动弹窗两个入口现在直接静音;PATH 缺 uv 不静音。
|
|
74
|
+
- compact 期间底部 loading 文案由 `Compacting context...`(三个半角点)改为
|
|
75
|
+
`Compacting context…`(单个省略号字符):与 `Running…` 等其它进行时状态词、
|
|
76
|
+
以及设计稿 docs/superpowers/specs/2026-05-18-auto-compact-awareness-design.md
|
|
77
|
+
已写的写法对齐,少占两列宽。
|
|
74
78
|
|
|
75
79
|
### Fixed
|
|
76
80
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: comate-cli
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.4b3
|
|
4
4
|
Summary: Comate terminal CLI built on comate-agent-sdk
|
|
5
5
|
Project-URL: Homepage, https://github.com/AndyLee1024/agent-sdk
|
|
6
6
|
Project-URL: Repository, https://github.com/AndyLee1024/agent-sdk
|
|
@@ -16,7 +16,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
16
16
|
Requires-Python: <3.14,>=3.11
|
|
17
17
|
Requires-Dist: charset-normalizer==3.4.7
|
|
18
18
|
Requires-Dist: comate-agent-sdk<0.13,>=0.12.10
|
|
19
|
-
Requires-Dist: comate-rpc<0.2,>=0.1.
|
|
19
|
+
Requires-Dist: comate-rpc<0.2,>=0.1.3
|
|
20
20
|
Requires-Dist: concurrent-log-handler>=0.9.25
|
|
21
21
|
Requires-Dist: curl-cffi==0.13.0
|
|
22
22
|
Requires-Dist: httpx<0.29.0,>=0.28.1
|
|
@@ -59,9 +59,9 @@ PRINT_OUTPUT_FORMAT_UNSUPPORTED = frozenset({"stream-json"})
|
|
|
59
59
|
|
|
60
60
|
# (rpc_stdio, resume_session_id, resume_select, print_prompt, output_format, rpc_relay,
|
|
61
61
|
# add_dirs, rpc_ws_port, yolo);rpc_ws_port 为 None 表示不是 --rpc-ws,0 表示由系统挑空闲端口;
|
|
62
|
-
# rpc_relay 为 None 表示不是 --rpc-relay,否则是(中转地址, Agent
|
|
62
|
+
# rpc_relay 为 None 表示不是 --rpc-relay,否则是(中转地址, Agent 令牌, 是否允许远程切到 bypassPermissions)。
|
|
63
63
|
ParsedArgs = tuple[
|
|
64
|
-
bool, str | None, bool, str | None, str, tuple[str, str] | None, tuple[str, ...], int | None, bool
|
|
64
|
+
bool, str | None, bool, str | None, str, tuple[str, str, bool] | None, tuple[str, ...], int | None, bool
|
|
65
65
|
]
|
|
66
66
|
# --rpc-relay 的 Agent 令牌优先从这里取(不进进程列表和 shell 历史)。
|
|
67
67
|
AGENT_TOKEN_ENV = "COMATE_AGENT_TOKEN"
|
|
@@ -274,7 +274,7 @@ def _usage_text(command_name: str = "comate") -> str:
|
|
|
274
274
|
f" {command_name} [--rpc-stdio] [--add-dir <path>]...\n"
|
|
275
275
|
f" {command_name} --rpc-ws [--port <n>] [--add-dir <path>]...\n"
|
|
276
276
|
f" {command_name} --rpc-relay --relay-url <ws(s)://...> [--agent-token <token>]"
|
|
277
|
-
" [--add-dir <path>]...\n"
|
|
277
|
+
" [--allow-bypass] [--add-dir <path>]...\n"
|
|
278
278
|
f" {command_name} -p [--output-format text|json] <prompt>\n"
|
|
279
279
|
f" {command_name} resume [<session_id>]\n"
|
|
280
280
|
f" {command_name} mcp <subcommand> [options]\n"
|
|
@@ -301,6 +301,8 @@ def _usage_text(command_name: str = "comate") -> str:
|
|
|
301
301
|
" --relay-url <url> (--rpc-relay) Relay address, ws:// or wss://\n"
|
|
302
302
|
" --agent-token <t> (--rpc-relay) Agent token; the COMATE_AGENT_TOKEN environment\n"
|
|
303
303
|
" variable takes precedence and is recommended\n"
|
|
304
|
+
" --allow-bypass (--rpc-relay) Let remote terminals switch sessions to\n"
|
|
305
|
+
" bypassPermissions; refused by default\n"
|
|
304
306
|
" --yolo Start in bypassPermissions (YOLO) mode\n"
|
|
305
307
|
" --version, -V Print version and exit\n"
|
|
306
308
|
" --pre (update) Also consider pre-release versions"
|
|
@@ -347,6 +349,8 @@ def _parse_args(argv: list[str]) -> ParsedArgs:
|
|
|
347
349
|
port_arg: str | None = None
|
|
348
350
|
relay_url_arg: str | None = None
|
|
349
351
|
agent_token_arg: str | None = None
|
|
352
|
+
# 故意没有对应的环境变量:放开远程免审批,必须在启动命令里明着写。
|
|
353
|
+
allow_bypass = False
|
|
350
354
|
print_mode = False
|
|
351
355
|
output_format = PRINT_OUTPUT_FORMAT_TEXT
|
|
352
356
|
output_format_explicit = False
|
|
@@ -380,6 +384,10 @@ def _parse_args(argv: list[str]) -> ParsedArgs:
|
|
|
380
384
|
agent_token_arg = value
|
|
381
385
|
index += 1
|
|
382
386
|
continue
|
|
387
|
+
if arg == "--allow-bypass":
|
|
388
|
+
allow_bypass = True
|
|
389
|
+
index += 1
|
|
390
|
+
continue
|
|
383
391
|
if arg == "--port" or arg.startswith("--port="):
|
|
384
392
|
if arg == "--port":
|
|
385
393
|
index += 1
|
|
@@ -439,12 +447,18 @@ def _parse_args(argv: list[str]) -> ParsedArgs:
|
|
|
439
447
|
|
|
440
448
|
raise _ArgumentError(i18n(message.rpc_mode_conflict))
|
|
441
449
|
if not rpc_relay_flag:
|
|
442
|
-
for option,
|
|
443
|
-
|
|
450
|
+
for option, given in (
|
|
451
|
+
("--relay-url", relay_url_arg is not None),
|
|
452
|
+
("--agent-token", agent_token_arg is not None),
|
|
453
|
+
("--allow-bypass", allow_bypass),
|
|
454
|
+
):
|
|
455
|
+
if given:
|
|
444
456
|
from comate_cli.terminal_agent.i18n import i18n, message
|
|
445
457
|
|
|
446
458
|
raise _ArgumentError(i18n(message.rpc_relay_option_without_rpc_relay, option=option))
|
|
447
|
-
rpc_relay =
|
|
459
|
+
rpc_relay = (
|
|
460
|
+
(*_parse_rpc_relay(relay_url_arg, agent_token_arg), allow_bypass) if rpc_relay_flag else None
|
|
461
|
+
)
|
|
448
462
|
if port_arg is not None and not rpc_ws:
|
|
449
463
|
from comate_cli.terminal_agent.i18n import i18n, message
|
|
450
464
|
|
|
@@ -1176,7 +1176,7 @@ async def run(
|
|
|
1176
1176
|
*,
|
|
1177
1177
|
rpc_stdio: bool = False,
|
|
1178
1178
|
rpc_ws_port: int | None = None,
|
|
1179
|
-
rpc_relay: tuple[str, str] | None = None,
|
|
1179
|
+
rpc_relay: tuple[str, str, bool] | None = None,
|
|
1180
1180
|
resume_session_id: str | None = None,
|
|
1181
1181
|
resume_select: bool = False,
|
|
1182
1182
|
print_message: str | None = None,
|
|
@@ -1367,13 +1367,14 @@ async def run(
|
|
|
1367
1367
|
from comate_cli.terminal_agent.backend.client import resolve_distribution_version
|
|
1368
1368
|
|
|
1369
1369
|
RpcRelayServer = _import_rpc_relay_server()
|
|
1370
|
-
relay_url, agent_token = rpc_relay
|
|
1370
|
+
relay_url, agent_token, allow_bypass = rpc_relay
|
|
1371
1371
|
await RpcRelayServer(
|
|
1372
1372
|
agent=agent,
|
|
1373
1373
|
default_cwd=project_root,
|
|
1374
1374
|
relay_url=relay_url,
|
|
1375
1375
|
token=agent_token,
|
|
1376
1376
|
version=resolve_distribution_version(profile.package_name),
|
|
1377
|
+
allow_bypass=allow_bypass,
|
|
1377
1378
|
).run()
|
|
1378
1379
|
return
|
|
1379
1380
|
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
- 令牌被拒(关闭码 1008,或握手阶段 HTTP 401 / 403):从没来过终端 = 不可能有会话,
|
|
10
10
|
往标准错误报一句、非零退出;来过终端 = 可能有会话在跑,打 ERROR、进程留着让它们跑完。
|
|
11
11
|
- 上线、掉线、重拨只进日志;不打就绪行(没有宿主程序读它)。
|
|
12
|
+
- 远程终端默认不能把会话切到 ``bypassPermissions``:主人启动时加 ``--allow-bypass`` 才放开。
|
|
12
13
|
|
|
13
14
|
websockets 客户端只出现在这个文件里;不走 ``--rpc-relay`` 时整个文件都不 import。
|
|
14
15
|
"""
|
|
@@ -92,9 +93,20 @@ class RpcRelayServer:
|
|
|
92
93
|
relay_url: str,
|
|
93
94
|
token: str,
|
|
94
95
|
version: str,
|
|
96
|
+
allow_bypass: bool = False,
|
|
95
97
|
reconnect_backoff: Sequence[float] = DEFAULT_RECONNECT_BACKOFF_S,
|
|
96
98
|
) -> None:
|
|
97
|
-
self._host = SessionHost(
|
|
99
|
+
self._host = SessionHost(
|
|
100
|
+
agent=agent,
|
|
101
|
+
default_cwd=default_cwd,
|
|
102
|
+
commands=CliCommandCatalog(),
|
|
103
|
+
allow_bypass=allow_bypass,
|
|
104
|
+
)
|
|
105
|
+
if allow_bypass:
|
|
106
|
+
logger.warning(
|
|
107
|
+
"rpc relay: --allow-bypass is set; remote terminals may switch sessions to "
|
|
108
|
+
"bypassPermissions (tools run without approval)"
|
|
109
|
+
)
|
|
98
110
|
self._url = relay_url
|
|
99
111
|
self._token = token
|
|
100
112
|
self._meta = HelloMeta(version=version, hostname=socket.gethostname(), cwd=str(default_cwd))
|
{comate_cli-0.12.4b2 → comate_cli-0.12.4b3}/comate_cli/terminal_agent/tui_parts/render_panels.py
RENAMED
|
@@ -1067,7 +1067,7 @@ class RenderPanelsMixin:
|
|
|
1067
1067
|
|
|
1068
1068
|
if self._renderer.is_auto_compacting() or self._is_compacting:
|
|
1069
1069
|
return self._append_loading_detail_fragment(
|
|
1070
|
-
self._animated_loading_fragments("Compacting context
|
|
1070
|
+
self._animated_loading_fragments("Compacting context…")
|
|
1071
1071
|
)
|
|
1072
1072
|
|
|
1073
1073
|
if self._animator.is_active:
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# Comate CLI RPC 接入指南(协议 v4)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
> 本文件与 comate-guide 的 `comate_agent_sdk/bundled_skills/comate-guide/references/rpc.md` 正文逐字相同(两份都是完整版,那份随安装包分发),改一份必须同步另一份。
|
|
4
|
+
> 协议实现在 `packages/comate_rpc`,术语见它的 `CONTEXT.md`;TS 客户端的生成类型、测试、demo 页面见 `packages/comate_rpc/ts/README.md`;中转服务的完整参数见 `packages/comate_relay/README.md`。
|
|
5
5
|
|
|
6
|
-
-
|
|
6
|
+
`comate --rpc-stdio`、`comate --rpc-ws`、`comate --rpc-relay` 把 comate 变成一个可以被别的程序驱动的服务:开会话、发消息、看流式输出、回答审批。
|
|
7
|
+
|
|
8
|
+
- 三种模式都说**协议 v4**(JSON-RPC 2.0)。v3 已删除,v3 客户端握手即被拒。
|
|
7
9
|
- 三种模式和终端 TUI 平级:共用同一套 settings / preflight / Agent 组装逻辑,工具集是 comate 全量。
|
|
8
|
-
-
|
|
9
|
-
- 字段的精确定义以生成的清单为准:`packages/comate_rpc/ts/src/generated/schema.json`(所有方法、事件、数据结构)。
|
|
10
|
+
- 字段的精确定义以仓库内生成的清单为准:`packages/comate_rpc/ts/src/generated/schema.json`。
|
|
10
11
|
|
|
11
12
|
## 启动
|
|
12
13
|
|
|
@@ -14,19 +15,18 @@ IDE 插件、Tauri 桌面壳、本机网页、经中转的远程网页都能开
|
|
|
14
15
|
| --- | --- | --- |
|
|
15
16
|
| `comate --rpc-stdio` | 标准输入输出 | 一行一条 JSON。只有一个客户端;连接断了进程就结束 |
|
|
16
17
|
| `comate --rpc-ws [--port N]` | 本机 WebSocket | 一个文本帧一条 JSON。可同时连多个客户端;`--port` 不填或填 0 = 系统挑空闲端口 |
|
|
17
|
-
| `comate --rpc-relay --relay-url URL` | 拨出到中转 | Agent
|
|
18
|
+
| `comate --rpc-relay --relay-url URL` | 拨出到中转 | Agent 主动连中转,不开任何端口;终端都连中转。见「经中转远程接入」 |
|
|
18
19
|
|
|
19
|
-
`--rpc-ws` 就绪后往标准输出打**唯一一行** JSON
|
|
20
|
+
`--rpc-ws` 就绪后往标准输出打**唯一一行** JSON,宿主程序读这一行拿连接方式:
|
|
20
21
|
|
|
21
22
|
```json
|
|
22
23
|
{"type": "ready", "url": "ws://127.0.0.1:<port>/", "token": "<令牌>"}
|
|
23
24
|
```
|
|
24
25
|
|
|
25
26
|
- 只绑定 `127.0.0.1`,没有 `--host`:Agent 永远不监听外网,远程要走中转。
|
|
26
|
-
-
|
|
27
|
-
`new WebSocket(url, ["comate-rpc", token])`。令牌不对,握手直接被拒(HTTP 403)。
|
|
27
|
+
- 令牌每次启动随机生成,放在 WebSocket **子协议**里:`new WebSocket(url, ["comate-rpc", token])`。令牌不对,握手被拒(HTTP 403)。
|
|
28
28
|
- 端口被占用:标准错误打一句说明,退出码非 0。
|
|
29
|
-
- 日志写 `~/.comate/logs/agent.log`(和 TUI 同一个文件,级别看 `COMATE_LOG_LEVEL
|
|
29
|
+
- 日志写 `~/.comate/logs/agent.log`(和 TUI 同一个文件,级别看 `COMATE_LOG_LEVEL`),不写标准输出和标准错误;标准错误只留给启动失败时那一句报错。三种模式都一样。
|
|
30
30
|
|
|
31
31
|
不支持的启动组合(参数解析阶段直接报错):
|
|
32
32
|
|
|
@@ -34,48 +34,74 @@ IDE 插件、Tauri 桌面壳、本机网页、经中转的远程网页都能开
|
|
|
34
34
|
| --- | --- |
|
|
35
35
|
| `--rpc-stdio`、`--rpc-ws`、`--rpc-relay` 给了不止一个 | 只能选一种通道 |
|
|
36
36
|
| `--port` 不配 `--rpc-ws` | 端口只对 WebSocket 有意义 |
|
|
37
|
-
| `--relay-url` / `--agent-token` 不配 `--rpc-relay` | 只对中转有意义 |
|
|
37
|
+
| `--relay-url` / `--agent-token` / `--allow-bypass` 不配 `--rpc-relay` | 只对中转有意义 |
|
|
38
38
|
| `--rpc-relay` 没给 `--relay-url`,或地址不是 `ws://` / `wss://` 开头 | 不知道往哪拨 |
|
|
39
39
|
| `--rpc-relay` 既没有 `COMATE_AGENT_TOKEN` 也没有 `--agent-token` | 没令牌拨出去也会被拒 |
|
|
40
40
|
| `comate resume ... --rpc-*` | 恢复会话走 `session.open` 的 `session_id` |
|
|
41
41
|
| `--rpc-* --yolo` | 权限模式由每个 `session.open` 的 `permission_mode` 决定 |
|
|
42
42
|
| `-p ... --rpc-*` | print 模式是另一条一次性输出路径 |
|
|
43
43
|
|
|
44
|
-
preflight
|
|
44
|
+
preflight 照常执行但不交互:宿主要提前配好 provider / settings,preflight 不通过时进程在进入 RPC 服务前退出。
|
|
45
45
|
|
|
46
46
|
## 经中转远程接入(`--rpc-relay`)
|
|
47
47
|
|
|
48
|
-
适用场景:Agent 跑在 sandbox
|
|
49
|
-
Agent 主动拨出到中转服务 `comate_relay`,终端也连中转,中转按「哪个 Agent、哪条连接」原样转发(ADR-0026)。
|
|
48
|
+
适用场景:Agent 跑在 sandbox(容器、远程机器)里,那里**只许出、不许进**;桌面和手机在别处。Agent 主动拨出到中转服务 `comate-relay`,终端也连中转,中转按「哪个 Agent、哪条连接」原样转发。
|
|
50
49
|
|
|
51
50
|
```bash
|
|
52
51
|
COMATE_AGENT_TOKEN=<Agent 令牌> comate --rpc-relay --relay-url wss://relay.example.com/ws/agent-link
|
|
53
52
|
```
|
|
54
53
|
|
|
55
|
-
-
|
|
54
|
+
- **令牌**:中转管理员用 `comate-relay agent add` 创建,只在创建时显示一次。
|
|
56
55
|
- 推荐用环境变量 `COMATE_AGENT_TOKEN` 传:不会出现在进程列表和 shell 历史里。
|
|
57
56
|
- 也可以用 `--agent-token <令牌>`。两者都给时**以环境变量为准**。
|
|
58
|
-
- 拨出时令牌放在子协议里(`["comate-rpc", 令牌]`),和本机 WebSocket 同一个办法。
|
|
59
57
|
- **上线**:连上后第一帧自报 `hello`(comate 版本、主机名、工作目录),只用于在中转上显示,不参与鉴权。
|
|
60
58
|
- **Agent 端不开端口、不碰证书**。`wss://` 的证书由中转那边负责。
|
|
61
|
-
-
|
|
62
|
-
-
|
|
59
|
+
- **不打就绪行**:标准输出什么都没有。上线、掉线、重连都只进日志。
|
|
60
|
+
- **终端看到的协议和本机完全一样**,唯一区别是下面的免审批限制。
|
|
61
|
+
|
|
62
|
+
**远程默认不能免审批**:`bypassPermissions`(工具不经审批直接执行)默认不许远程终端打开。
|
|
63
|
+
|
|
64
|
+
- 被拒的调用:`session.open` 带 `permission_mode: "bypassPermissions"`(开新会话或恢复旧会话),以及 `session.setPermissionMode` 切到 `bypassPermissions`。
|
|
65
|
+
- 被拒时回 -32602,`error.data.kind = "permission_mode_not_allowed"`,会话的权限模式不变。
|
|
66
|
+
- 用 `session_id` 接入已经活着的会话不检查:接入时 `permission_mode` 本来就不生效。
|
|
67
|
+
- Agent 主人启动时加 `--allow-bypass` 才放开,同时日志记一条 WARNING。这个开关**故意没有环境变量**,必须在启动命令里明着写。
|
|
68
|
+
- `--rpc-stdio` / `--rpc-ws` 只有本机能连,不受这条限制。
|
|
63
69
|
|
|
64
70
|
断线与重连:
|
|
65
71
|
|
|
66
72
|
| 情况 | Agent 怎么做 |
|
|
67
73
|
| --- | --- |
|
|
68
74
|
| 网络断了、中转重启、中转暂时连不上 | 等 1、2、5、10、30 秒依次重拨,之后每 30 秒一次。**重拨期间会话照跑**,终端重新接入后带(纪元号, 序号)续传 |
|
|
69
|
-
| 被同一令牌的新 Agent 顶替(关闭码 4009) |
|
|
70
|
-
| 令牌被拒(关闭码 1008
|
|
75
|
+
| 被同一令牌的新 Agent 顶替(关闭码 4009) | 不再重拨,只打日志。进程不退出、会话照跑,否则两个实例会互踢个没完 |
|
|
76
|
+
| 令牌被拒(关闭码 1008,或握手 HTTP 401 / 403),且**从没有终端连进来过** | 标准错误打一句说明,退出码 1 |
|
|
71
77
|
| 令牌被拒,但之前**有终端连进来过** | 不再重拨,打 ERROR 日志。进程不退出,让可能还在跑的会话跑完;Ctrl+C 结束 |
|
|
72
78
|
|
|
73
|
-
|
|
79
|
+
中转掉线期间空闲计时照常:没有终端连着、又不在跑回合的会话,30 分钟后照样关掉(历史在磁盘上,重开即可)。
|
|
80
|
+
|
|
81
|
+
### 部署中转服务 `comate-relay`
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
comate-relay user add alice # 建账号,交互式输两次密码;脚本里用 --password-stdin
|
|
85
|
+
comate-relay agent add --user alice --name box # 打印 agent_id 和 Agent 令牌,令牌只显示这一次
|
|
86
|
+
comate-relay serve # 默认只听 127.0.0.1:8765;浏览器打开就是 demo 页
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- 其他子命令:`user remove` / `user list` / `user revoke`(撤销该账号全部登录令牌)、`agent remove` / `agent list`(永不显示令牌)。
|
|
90
|
+
- 监听非本机地址必须给 `--certfile` / `--keyfile`(跑 HTTPS / WSS),或显式加 `--allow-insecure-http`(仅限可信局域网),否则拒绝启动。
|
|
91
|
+
- Agent 拨入地址是 `/ws/agent-link`;终端的控制连接 `/ws/control`、连某个 Agent 用 `/ws/agents/{agent_id}`;登录 `POST /api/auth/login`。令牌一律放子协议 `["comate-rpc", 令牌]`。
|
|
92
|
+
|
|
93
|
+
中转发给终端和 Agent 的关闭码:
|
|
94
|
+
|
|
95
|
+
| 关闭码 | 含义 | 该怎么做 |
|
|
96
|
+
| --- | --- | --- |
|
|
97
|
+
| 1008 | 令牌错误 / 过期 / 被撤销 | 终端回登录页;Agent 停止重拨 |
|
|
98
|
+
| 4003 | 这个 Agent 不属于你 | 终端不重连 |
|
|
99
|
+
| 4004 | Agent 离线 | 终端退避重连,Agent 回来后自动接上 |
|
|
100
|
+
| 4009 | 被同令牌的新连接顶替(发给旧 Agent) | Agent 停止重拨 |
|
|
74
101
|
|
|
75
102
|
## 协议骨架
|
|
76
103
|
|
|
77
|
-
**只有客户端发请求,服务端只发通知。**
|
|
78
|
-
审批和提问是会话状态,客户端用普通方法回答(见「审批和提问」)。
|
|
104
|
+
**只有客户端发请求,服务端只发通知。** 服务端不会反过来向客户端发请求;审批和提问是会话状态,客户端用普通方法回答。
|
|
79
105
|
|
|
80
106
|
| 方法 | 方向 | 作用 |
|
|
81
107
|
| --- | --- | --- |
|
|
@@ -87,8 +113,6 @@ COMATE_AGENT_TOKEN=<Agent 令牌> comate --rpc-relay --relay-url wss://relay.exa
|
|
|
87
113
|
| `$/event` | 服务端 → 客户端(通知) | `{"subscription", "epoch", "seq", "event"}`,`event.type` 区分事件种类 |
|
|
88
114
|
|
|
89
115
|
- 方法名是 `服务名.方法名`,参数和返回值字段都是 snake_case。
|
|
90
|
-
- 协议版本不是 4:握手失败,`error.data = {"kind": "unsupported_protocol_version", "supported": [4]}`。
|
|
91
|
-
- 握手前调别的方法:-32000,`data.kind = "not_initialized"`。
|
|
92
116
|
|
|
93
117
|
最小对话(stdio,每行一条):
|
|
94
118
|
|
|
@@ -114,7 +138,7 @@ COMATE_AGENT_TOKEN=<Agent 令牌> comate --rpc-relay --relay-url wss://relay.exa
|
|
|
114
138
|
| `session.open` | `cwd?`、`session_id?`、`permission_mode?`(默认 `default`)、`include_partial_messages?` | 开会话。`session_id` 指向进程里**已经活着**的会话时接入它,返回同一个句柄(`attached: true`),其余参数不生效;指向落盘的旧会话时恢复它 |
|
|
115
139
|
| `session.query` | `session_handle`、`prompt` | 发一条消息。自定义斜杠命令(`/名字 参数`)先展开再发;内置命令不能用文本发,要用对应的 `session.*` 方法 |
|
|
116
140
|
| `session.interrupt` | `session_handle` | 中断当前回合。`interrupted` 表示调用时是否真有回合在跑 |
|
|
117
|
-
| `session.setPermissionMode` | `session_handle`、`mode` | `default` / `acceptEdits` / `bypassPermissions` |
|
|
141
|
+
| `session.setPermissionMode` | `session_handle`、`mode` | `default` / `acceptEdits` / `bypassPermissions`。经中转时 `bypassPermissions` 默认被拒 |
|
|
118
142
|
| `session.setModelLevel` | `session_handle`、`level` | `LOW` / `MID` / `HIGH`,只换本会话,不写成用户默认值 |
|
|
119
143
|
| `session.status` | `session_handle` | 会话状态 + 回合状态 + 用量 + 上下文信息 |
|
|
120
144
|
| `session.compact` | `session_handle` | 手动压缩上下文 |
|
|
@@ -129,8 +153,7 @@ COMATE_AGENT_TOKEN=<Agent 令牌> comate --rpc-relay --relay-url wss://relay.exa
|
|
|
129
153
|
|
|
130
154
|
## 事件
|
|
131
155
|
|
|
132
|
-
订阅 `session.events` 后,每条 `$/event` 的 `event.type`
|
|
133
|
-
这些名字是协议的一部分,和 Python 类名无关。**不认识的 `type` 直接跳过**,以后会加新事件。
|
|
156
|
+
订阅 `session.events` 后,每条 `$/event` 的 `event.type` 是下面之一。这些名字是协议的一部分,和 Python 类名无关。**不认识的 `type` 直接跳过**,以后会加新事件。
|
|
134
157
|
|
|
135
158
|
| 类别 | `type` |
|
|
136
159
|
| --- | --- |
|
|
@@ -138,7 +161,8 @@ COMATE_AGENT_TOKEN=<Agent 令牌> comate --rpc-relay --relay-url wss://relay.exa
|
|
|
138
161
|
| 回合 | `turn.started`、`turn.stopped`(`reason`:`completed` / `max_iterations` / `waiting_for_input` / `interrupted`) |
|
|
139
162
|
| 输出 | `text`、`thinking`;开了 `include_partial_messages` 才有的增量:`text.delta`、`thinking.delta`、`stream.reset` |
|
|
140
163
|
| 工具 | `tool.call`、`tool.result`;开了 `include_partial_messages` 才有:`tool.started`(模型刚开始写工具调用) |
|
|
141
|
-
|
|
|
164
|
+
| 子 agent / 后台任务 | `subagent.started`、`subagent.progress`、`subagent.stopped`;`job.started`、`job.progress`、`job.completed` |
|
|
165
|
+
| 其他 | `llm.retry`、`usage.delta`、`tasks.updated`、`compaction.started`、`compaction.finished`、`queue.changed`、`permissionMode.changed`、`modelLevel.changed` |
|
|
142
166
|
| 待处理项 | `interaction.pending`、`interaction.resolved`、`interaction.cancelled` |
|
|
143
167
|
|
|
144
168
|
### 断线续传和快照
|
|
@@ -148,8 +172,7 @@ COMATE_AGENT_TOKEN=<Agent 令牌> comate --rpc-relay --relay-url wss://relay.exa
|
|
|
148
172
|
- 重新订阅时带上最后收到的 `epoch` 和 `seq`:
|
|
149
173
|
- 纪元号对得上、缺的事件还在缓冲里 → 从下一条开始补发,不重复不缺。
|
|
150
174
|
- 缺的事件已被挤出缓冲、或纪元号对不上(进程重启过)→ 先发一份 `snapshot`。
|
|
151
|
-
- `snapshot` 包含:会话状态、回合状态(`idle` / `running` / `waiting_for_input
|
|
152
|
-
重连后凭快照就能恢复界面,包括还没回答的审批。
|
|
175
|
+
- `snapshot` 包含:会话状态、回合状态(`idle` / `running` / `waiting_for_input`)、**还在等的待处理项**、队列、当前纪元号和序号。重连后凭快照就能恢复界面,包括还没回答的审批。
|
|
153
176
|
- 进程重启过的话,旧的 `session_handle` 已经失效:用 `session_id` 重新 `session.open`。
|
|
154
177
|
|
|
155
178
|
## 审批和提问
|
|
@@ -167,16 +190,12 @@ COMATE_AGENT_TOKEN=<Agent 令牌> comate --rpc-relay --relay-url wss://relay.exa
|
|
|
167
190
|
| `question` | `{"decision": "answer", "answers": [{"selected_options": [...], "custom_text"?: "..."}]}` 或 `{"decision": "reject"}` |
|
|
168
191
|
|
|
169
192
|
`deny` 带 `interrupt: true` = 拒绝并结束本回合;不带 = 只拒绝这一个工具。
|
|
170
|
-
3. **第一个有效回答生效**,广播 `interaction.resolved`(带 `resolved_by
|
|
171
|
-
|
|
172
|
-
4. 回答格式不对(包括拼错或多出字段)→「参数无效」,**不算回答**,这一项继续等。
|
|
173
|
-
提问的 `answers` 必须和 `content.questions` **一一对应、条数相同**,条数不对同样是「参数无效」
|
|
174
|
-
(`data.kind: "wrong_answer_count"`)。
|
|
193
|
+
3. **第一个有效回答生效**,广播 `interaction.resolved`(带 `resolved_by`:是哪个客户端答的)。之后再答同一项收到 -32002,客户端据此收起弹框。
|
|
194
|
+
4. 回答格式不对(包括拼错或多出字段)→「参数无效」,**不算回答**,这一项继续等。提问的 `answers` 必须和 `content.questions` **一一对应、条数相同**,否则同样是「参数无效」(`data.kind: "wrong_answer_count"`)。
|
|
175
195
|
|
|
176
196
|
- 不设超时:一直等到有人答、会话被中断、或会话关闭。
|
|
177
197
|
- 会话被中断:广播 `interaction.cancelled`(`reason: "interrupted"`)。
|
|
178
|
-
-
|
|
179
|
-
广播 `interaction.cancelled`(`reason: "session_closed"`)。权限永远不会默认放行。
|
|
198
|
+
- 会话关闭(含空闲关闭、进程退出):还在等的审批和提问一律**按拒绝处理**,广播 `interaction.cancelled`(`reason: "session_closed"`)。权限永远不会默认放行。
|
|
180
199
|
- 客户端不需要事先声明「能不能弹审批框」。答不了就不答,别的客户端也能答。
|
|
181
200
|
|
|
182
201
|
## 错误码
|
|
@@ -189,18 +208,32 @@ COMATE_AGENT_TOKEN=<Agent 令牌> comate --rpc-relay --relay-url wss://relay.exa
|
|
|
189
208
|
| -32002 | 待处理项不存在或已被别人回答 |
|
|
190
209
|
| -32800 | 请求已被 `$/cancelRequest` 取消 |
|
|
191
210
|
|
|
192
|
-
|
|
211
|
+
额外信息放在 `error.data`,用 `kind` 区分具体原因。客户端按 `kind` 分支,不要按 `message` 文本分支:
|
|
212
|
+
|
|
213
|
+
| `kind` | 错误码 | 什么时候出现 | `data` 里的其他字段 |
|
|
214
|
+
| --- | --- | --- | --- |
|
|
215
|
+
| `unsupported_protocol_version` | -32602 | 握手时协议版本不是 4 | `supported` |
|
|
216
|
+
| `not_initialized` | -32000 | 握手前调了别的方法 | — |
|
|
217
|
+
| `session_state` | -32000 | 会话当前状态不允许这个操作(例如已关闭、正在清空历史) | — |
|
|
218
|
+
| `session_not_found` | -32001 | `session_handle` 不存在(包括进程重启后的旧句柄) | — |
|
|
219
|
+
| `interaction_not_found` | -32002 | 待处理项不存在,或已被别人先答了 | `request_id` |
|
|
220
|
+
| `wrong_response_kind` | -32602 | 回答的种类和待处理项对不上(例如拿提问的回答去答审批) | `expected` |
|
|
221
|
+
| `wrong_answer_count` | -32602 | 提问的 `answers` 条数和 `questions` 不一样 | `expected`、`actual` |
|
|
222
|
+
| `command` | -32602 | `session.query` 里的斜杠命令展开失败 | — |
|
|
223
|
+
| `permission_mode_not_allowed` | -32602 | 经中转时要切到 `bypassPermissions`,但 Agent 没加 `--allow-bypass` | — |
|
|
224
|
+
| `unknown_subscription` | -32602 | `$/unsubscribe` 的订阅号不存在 | — |
|
|
225
|
+
|
|
226
|
+
参数格式本身不对(缺字段、类型错等)也是 -32602,这时 `data` 里没有 `kind`,只有 `errors`:逐条列出哪个字段、错在哪。
|
|
193
227
|
|
|
194
228
|
## 会话生命周期(`--rpc-ws` / `--rpc-relay`)
|
|
195
229
|
|
|
196
230
|
- 所有客户端都断开后,会话**继续跑**。
|
|
197
|
-
- 同时满足「没有客户端订阅着」和「不在跑回合」才开始计时,持续 30 分钟就关闭(`session.closed`,`reason: "idle"
|
|
198
|
-
等审批 / 等提问算「不在跑」。
|
|
231
|
+
- 同时满足「没有客户端订阅着」和「不在跑回合」才开始计时,持续 30 分钟就关闭(`session.closed`,`reason: "idle"`)。等审批 / 等提问算「不在跑」。
|
|
199
232
|
- 两个客户端可以同时看、同时操作同一个会话:一方用 `session_id` 调 `session.open` 接入即可。
|
|
200
233
|
- 一个客户端读得太慢(发送队列超过 500 条)会被断开,让它走续传;不影响会话和其他客户端。
|
|
201
234
|
- 进程退出(Ctrl+C):关掉全部会话,还在等的审批按拒绝处理,正在跑的工具随会话中断。
|
|
202
235
|
|
|
203
|
-
`--rpc-stdio`
|
|
236
|
+
`--rpc-stdio` 只有一个连接:标准输入读到头、或写标准输出超时(对方 10 秒不读),都等于连接断开 → 进程结束 → 全部会话关闭。
|
|
204
237
|
|
|
205
238
|
## 默认值
|
|
206
239
|
|
|
@@ -208,5 +241,48 @@ COMATE_AGENT_TOKEN=<Agent 令牌> comate --rpc-relay --relay-url wss://relay.exa
|
|
|
208
241
|
| --- | --- |
|
|
209
242
|
| 会话空闲时限 | 30 分钟 |
|
|
210
243
|
| 每会话事件缓冲 | 2000 条或 8 MiB,先到为准 |
|
|
211
|
-
| 每连接发送队列 | 500
|
|
244
|
+
| 每连接发送队列 | 500 条(中转那条物理连接上是 5000 条) |
|
|
212
245
|
| 审批 / 提问等待超时 | 无 |
|
|
246
|
+
|
|
247
|
+
## TS 客户端(`comate-rpc-client`)
|
|
248
|
+
|
|
249
|
+
仓库内 `packages/comate_rpc/ts/`,不发布 npm,前端用本地路径引用(`"comate-rpc-client": "file:../packages/comate_rpc/ts"`),直接导出 TS 源码,用 Vite 等打包器即可。
|
|
250
|
+
|
|
251
|
+
```ts
|
|
252
|
+
import { openSession, RpcClient } from "comate-rpc-client";
|
|
253
|
+
|
|
254
|
+
// url / token 来自 `comate --rpc-ws` 的就绪行。进程重启后令牌会变:传函数,每次(重新)连接时现取。
|
|
255
|
+
const client = await RpcClient.connect({ url, token: () => currentToken, clientInfo: { name: "my-app" } });
|
|
256
|
+
const session = await openSession(client, {
|
|
257
|
+
params: { include_partial_messages: true },
|
|
258
|
+
handlers: {
|
|
259
|
+
approval: async (interaction, { signal }) => ({ decision: "allow" }),
|
|
260
|
+
question: async (interaction, { signal }) => ({ decision: "answer", answers: [{ selected_options: ["Blue"] }] }),
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
await session.query("hello");
|
|
264
|
+
for await (const event of session.events) {
|
|
265
|
+
if (event.type === "text.delta") render(event.delta);
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
- **处理器**:别人先答了、或会话被中断时 `signal` 被中止,收起弹框即可。注册了处理器却漏了某一种时,那一种会打一次 `console.warn`(没人答,回合会卡住)。
|
|
270
|
+
- **取消**:每个方法都能带 `{ signal }`,中止后客户端发 `$/cancelRequest`。
|
|
271
|
+
- **错误**:服务端错误是 `RpcError`,带 `code` 和 `data`,按 `err.kind` 分支(取值见上面的表)。请求发出后连接断了是 `ConnectionLostError`(服务端可能执行了,也可能没有)。
|
|
272
|
+
- **重连**:断线自动重连(指数退避),订阅带(纪元号, 序号)续传,不会重复。进程重启过时,会话层用 `session_id` 重新打开会话、换上新句柄并收到快照,所以调方法时每次现读 `session.handle`。
|
|
273
|
+
|
|
274
|
+
经中转连远程 Agent,拿到的是同一个会话客户端:
|
|
275
|
+
|
|
276
|
+
```ts
|
|
277
|
+
import { loginToRelay, openSession, RelayClient } from "comate-rpc-client";
|
|
278
|
+
|
|
279
|
+
const login = await loginToRelay({ url: "http://127.0.0.1:8765/", account, password }); // { token, expires_at, device }
|
|
280
|
+
const relay = await RelayClient.connect({ url, token: login.token, clientInfo: { name: "my-app" } });
|
|
281
|
+
const changes = await relay.watchAgents(); // 上下线事件:先订阅、再列,中间的变化不会漏
|
|
282
|
+
const agents = await relay.agents.list(); // agent_id、名字、在线、最后上线时间、meta(版本、主机名、工作目录)
|
|
283
|
+
const client = await relay.connectAgent(agents[0].agent_id);
|
|
284
|
+
const session = await openSession(client, { handlers: { /* ... */ } });
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
- 关闭码 1008 → 抛 `ReloginRequiredError`,回登录;4003 → `AgentNotYoursError`;第一次连就遇到 4004 → `AgentOfflineError`,连上以后遇到 4004 则自动退避重连。
|
|
288
|
+
- 登出:`logoutFromRelay({ url, token })`。
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "comate-cli"
|
|
7
|
-
version = "0.12.
|
|
7
|
+
version = "0.12.4b3"
|
|
8
8
|
description = "Comate terminal CLI built on comate-agent-sdk"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11,<3.14"
|
|
@@ -33,7 +33,7 @@ dependencies = [
|
|
|
33
33
|
"concurrent-log-handler>=0.9.25",
|
|
34
34
|
"httpx>=0.28.1,<0.29.0",
|
|
35
35
|
"setproctitle>=1.3.7",
|
|
36
|
-
"comate-rpc>=0.1.
|
|
36
|
+
"comate-rpc>=0.1.3,<0.2",
|
|
37
37
|
]
|
|
38
38
|
|
|
39
39
|
[project.urls]
|
|
@@ -140,7 +140,7 @@ class TestMainArgs(unittest.TestCase):
|
|
|
140
140
|
["--rpc-relay", "--relay-url", "wss://relay.example/ws/agent-link", "--agent-token", "tok"]
|
|
141
141
|
)
|
|
142
142
|
self.assertEqual(
|
|
143
|
-
run.await_args.kwargs["rpc_relay"], ("wss://relay.example/ws/agent-link", "tok")
|
|
143
|
+
run.await_args.kwargs["rpc_relay"], ("wss://relay.example/ws/agent-link", "tok", False)
|
|
144
144
|
)
|
|
145
145
|
self.assertFalse(run.await_args.kwargs["rpc_stdio"])
|
|
146
146
|
self.assertIsNone(run.await_args.kwargs["rpc_ws_port"])
|
|
@@ -769,7 +769,7 @@ def test_bad_rpc_ws_arguments_are_rejected_in_the_ui_language(language, argv, ke
|
|
|
769
769
|
_RELAY_URL = "wss://relay.example/ws/agent-link"
|
|
770
770
|
|
|
771
771
|
|
|
772
|
-
def _relay_target(argv: list[str]) -> tuple[str, str] | None:
|
|
772
|
+
def _relay_target(argv: list[str]) -> tuple[str, str, bool] | None:
|
|
773
773
|
return main_module._parse_args(argv)[5]
|
|
774
774
|
|
|
775
775
|
|
|
@@ -778,10 +778,12 @@ def test_rpc_relay_takes_the_url_and_the_token_argument(monkeypatch) -> None:
|
|
|
778
778
|
assert _relay_target(["--rpc-relay", "--relay-url", _RELAY_URL, "--agent-token", "from-arg"]) == (
|
|
779
779
|
_RELAY_URL,
|
|
780
780
|
"from-arg",
|
|
781
|
+
False,
|
|
781
782
|
)
|
|
782
783
|
assert _relay_target(["--rpc-relay", f"--relay-url={_RELAY_URL}", "--agent-token=from-arg"]) == (
|
|
783
784
|
_RELAY_URL,
|
|
784
785
|
"from-arg",
|
|
786
|
+
False,
|
|
785
787
|
)
|
|
786
788
|
|
|
787
789
|
|
|
@@ -791,8 +793,9 @@ def test_rpc_relay_prefers_the_environment_token_over_the_argument(monkeypatch)
|
|
|
791
793
|
assert _relay_target(["--rpc-relay", "--relay-url", _RELAY_URL, "--agent-token", "from-arg"]) == (
|
|
792
794
|
_RELAY_URL,
|
|
793
795
|
"from-env",
|
|
796
|
+
False,
|
|
794
797
|
)
|
|
795
|
-
assert _relay_target(["--rpc-relay", "--relay-url", _RELAY_URL]) == (_RELAY_URL, "from-env")
|
|
798
|
+
assert _relay_target(["--rpc-relay", "--relay-url", _RELAY_URL]) == (_RELAY_URL, "from-env", False)
|
|
796
799
|
|
|
797
800
|
|
|
798
801
|
def test_an_empty_environment_token_counts_as_unset(monkeypatch) -> None:
|
|
@@ -800,6 +803,17 @@ def test_an_empty_environment_token_counts_as_unset(monkeypatch) -> None:
|
|
|
800
803
|
assert _relay_target(["--rpc-relay", "--relay-url", _RELAY_URL, "--agent-token", "from-arg"]) == (
|
|
801
804
|
_RELAY_URL,
|
|
802
805
|
"from-arg",
|
|
806
|
+
False,
|
|
807
|
+
)
|
|
808
|
+
|
|
809
|
+
|
|
810
|
+
# 远程切到「全部放行」要主人在启动命令里明着写;只有 --rpc-relay 是远程,别的模式用它是配错了。
|
|
811
|
+
def test_allow_bypass_is_off_unless_given_with_rpc_relay(monkeypatch) -> None:
|
|
812
|
+
monkeypatch.setenv("COMATE_AGENT_TOKEN", "from-env")
|
|
813
|
+
assert _relay_target(["--rpc-relay", "--relay-url", _RELAY_URL, "--allow-bypass"]) == (
|
|
814
|
+
_RELAY_URL,
|
|
815
|
+
"from-env",
|
|
816
|
+
True,
|
|
803
817
|
)
|
|
804
818
|
|
|
805
819
|
|
|
@@ -829,6 +843,8 @@ def test_without_rpc_relay_there_is_no_relay_target(monkeypatch) -> None:
|
|
|
829
843
|
),
|
|
830
844
|
(["--relay-url", _RELAY_URL], message.rpc_relay_option_without_rpc_relay, {"option": "--relay-url"}),
|
|
831
845
|
(["--agent-token", "t"], message.rpc_relay_option_without_rpc_relay, {"option": "--agent-token"}),
|
|
846
|
+
(["--allow-bypass"], message.rpc_relay_option_without_rpc_relay, {"option": "--allow-bypass"}),
|
|
847
|
+
(["--rpc-ws", "--allow-bypass"], message.rpc_relay_option_without_rpc_relay, {"option": "--allow-bypass"}),
|
|
832
848
|
(
|
|
833
849
|
["--rpc-relay", "--rpc-ws", "--relay-url", _RELAY_URL, "--agent-token", "t"],
|
|
834
850
|
message.rpc_mode_conflict,
|
|
@@ -61,7 +61,7 @@ asyncio.run(main())
|
|
|
61
61
|
[
|
|
62
62
|
{"rpc_stdio": True},
|
|
63
63
|
{"rpc_ws_port": 0},
|
|
64
|
-
{"rpc_relay": ("ws://127.0.0.1:1/ws/agent-link", "token")},
|
|
64
|
+
{"rpc_relay": ("ws://127.0.0.1:1/ws/agent-link", "token", False)},
|
|
65
65
|
],
|
|
66
66
|
ids=["rpc-stdio", "rpc-ws", "rpc-relay"],
|
|
67
67
|
)
|