collab-a2a 2.0.2__tar.gz → 2.0.3__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.
- {collab_a2a-2.0.2/src/collab_a2a.egg-info → collab_a2a-2.0.3}/PKG-INFO +49 -62
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/README.md +48 -61
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/pyproject.toml +1 -1
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/__init__.py +1 -1
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/cli.py +75 -4
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/settings_tui.py +68 -26
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/config.py +24 -4
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/runtime_settings.py +2 -1
- collab_a2a-2.0.3/src/collab/setting_edit.py +88 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-configure/SKILL.md +8 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3/src/collab_a2a.egg-info}/PKG-INFO +49 -62
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab_a2a.egg-info/SOURCES.txt +2 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_config_command.py +86 -0
- collab_a2a-2.0.3/tests/test_setting_edit.py +84 -0
- collab_a2a-2.0.3/tests/test_settings_panel_in_tmux.py +141 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_settings_tui.py +74 -1
- collab_a2a-2.0.2/tests/test_settings_panel_in_tmux.py +0 -67
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/LICENSE +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/setup.cfg +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/activity.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/atomic.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/attention.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/batch.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/capacity.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/__init__.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/bridge.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/context.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/daemon.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/daemon_files.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/demo_agent.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/exclusive.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/hub_client.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/inbox.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/onboard.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/participant_metrics.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/recovery.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/statusbar.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/terminal_panel.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/tui.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/watch.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/worker_service.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/codex_usage.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/columns.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/compaction.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/compatibility.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/daemon_main.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/demo.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/diagnostics.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/hosttool.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/hub_main.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/identity.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/learnings.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/lockfile.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/owner.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/peers.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/protocol.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/quotas.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/reboot.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/rules/COLLAB.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/rules.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/__init__.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/app.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/auth.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/card.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/events.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/executor.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/hub.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/session.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/store.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/tunnel.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skill_sharing.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-activity/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-capacity/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-discover/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-host/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-host/references/connection-and-recovery.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-join/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-join/references/connection-and-recovery.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-learn/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-share-skills/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-tasks/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-telemetry/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-telemetry/references/providers.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-watch/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-worker/SKILL.md +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/source_command.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/stats.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/statusline/__init__.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/statusline/entry.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/statusline/install.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/statusline/render.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/statusline/watchdog.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/telemetry.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/themes.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/update.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/wake.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/worker.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/worker_notices.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/worker_runtime.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/worker_telemetry.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/worker_usage.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab_a2a.egg-info/dependency_links.txt +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab_a2a.egg-info/entry_points.txt +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab_a2a.egg-info/requires.txt +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab_a2a.egg-info/top_level.txt +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_count_that_is_not_a_count.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_daemon_follows_the_agent_that_started_it.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_figure_can_be_taken_back.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_figure_of_one_is_one_percent.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_fresh_session_for_everyone.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_hole_in_the_log_is_reported.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_message_is_refused_not_cut.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_pid_from_another_boot_names_nobody.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_project_is_a_bundle_that_belongs_to_somebody.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_quota_read_from_the_agent_itself.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_refused_kind_is_named_briefly.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_state_constant_is_read_by_its_data_model.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_window_from_a_bucket_is_still_a_window.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_activity.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_activity_cli.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_activity_hub.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_agent_commands.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_agent_identity.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_an_update_refreshes_what_it_installed.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_asking_is_not_holding.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_attention_contention.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_attention_delivery.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_bare_join.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_batch_progress.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_bind_forms_and_header.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_chat_is_the_only_kind_a_client_sends.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_check.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_clear_quota.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_cli_imports_no_httpx.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_cli_v202.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_codex_own_usage.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_colour_maths.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_colour_propagates.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_colour_push.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_colour_tables_forget_the_departed.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_columns_clip.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_context_compaction.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_daemon_identity.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_demo_agent_panel.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_demo_header_row_is_clipped.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_demo_session.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_diagnostics.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_docs_match_cli.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_every_agent_is_told_how_to_listen.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_every_item_of_a_bar_is_a_choice.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_every_kind_reaches_every_renderer.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_every_stamp_reads_in_the_readers_zone.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_every_verb_an_agent_needs_is_on_a_page_it_reads.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_external_agent_state.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_external_state_live_session.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_file_outcome_takes_junk.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_files.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_fold_override.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_global_figures.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_global_home.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_guest_follows_the_hub.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_home_flag.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_home_isolation.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_home_permissions.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_host_name_clash.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_how_it_was_installed.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_hub.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_hub_version_travels.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_inbox_under_contention.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_inbox_write_order.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_info_blue.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_input_bounds.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_issue_recovery.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_joining_a_dead_session.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_joining_by_name.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_jump_from_the_status_row.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_kill.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_layout.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_learnings.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_learnings_cost.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_learnings_sync.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_leaving_takes_the_wake_with_it.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_listen_kind_filters.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_live_settings.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_liveness_from_a_sandbox.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_local_join_stays_local.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_lock_flow.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_lock_identity.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_lockfile.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_logs_can_be_read_without_stopping_anything.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_loose_ends.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_markdown_themes.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_migration.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_monitor_armed.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_mutation_gaps.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_name_migration.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_name_reuse.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_no_autohost.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_numbers_that_stop_moving_say_why.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_okf_bundle.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_older_above_agrees_with_what_loads.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_orphans.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_overview.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_own_colour.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_owner_stamp.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_panel_v202.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_participant_cards_v201.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_participant_details.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_participant_panel_in_tmux.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_peers.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_peers_lifecycle.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_periodic_reminder.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_persisted_v2_boundary.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_platform_support.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_rate_limiter_forgets.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_reminder_edges.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_reminder_on_the_monitor.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_rename.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_render.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_resume.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_room_files_wait_for_everyone.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_roster_colour.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_roster_dots.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_roster_row_keeps_the_count.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_roster_rule.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_roster_when_the_session_dies.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_rotating_the_invite.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_rotation_is_atomic.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_rules.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_same_name_is_not_ownership.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_semantic_theme_engine.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_settings_reach_the_open_session.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_shared_skills_and_capacity.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_skill_capabilities_v201.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_skill_formats.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_skill_settings_match_the_registry.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_skills.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_source_command_bounds.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stale_status.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_state_dir_cleanup.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_state_dirs.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_state_is_not_conversation.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats_formats.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats_ownership.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats_say_when.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats_source.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats_stamp_edges.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_status_bar.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_statuses_stay_current.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_statusline_imports_no_networking.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_statusline_install.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stopped_msg.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stream.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tasks_want_a_batch.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_telemetry_v2.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_telling_agents_apart.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_terminal_escapes.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_terminal_panel.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_a2a_client_surface_is_not_dead_code.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_count_is_a_switch.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_count_is_never_shown_outdated.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_daemon_forgets_what_it_no_longer_needs.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_pane_and_the_transcript_agree_about_a_file.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_record_is_kept_without_being_asked.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_reminder_can_be_added_to.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_reminder_reaches_every_agent.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_roster_foot_is_a_grid.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_status_line_cannot_run_forever.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_status_line_does_not_vanish.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_suite_never_reads_your_config.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_two_row_switches_are_independent.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_wake_explains_its_clocks.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_theme_files_survive.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_theme_is_visual_only.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_theme_panel_in_tmux.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_transcript_dates_follow_the_clock.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tui_cost.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tui_fold_click.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tui_gutter.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tui_scroll.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tui_window.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tunnel.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_two_agents_one_repo.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_unread_is_what_the_agent_has_not_seen.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_update.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_v201_communication_challenger.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_v201_final_review.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_v201_remaining_surfaces_challenger.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_v2_compatibility.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_viewer_says_what_the_ack_did.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_wake.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_watch_pane_survives.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_what_may_be_signalled.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_which_agent.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_who_is_who.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_delivery.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_notices.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_runtime.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_service.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_source_v201.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_state.py +0 -0
- {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_telemetry_v201.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: collab-a2a
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.3
|
|
4
4
|
Summary: An A2A hub that lets coding agents on different machines talk, align on tasks, and discuss work in real time.
|
|
5
5
|
License: MIT
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -67,9 +67,9 @@ It also works for two agents on **one** machine in different repos.
|
|
|
67
67
|
> on collab itself.
|
|
68
68
|
|
|
69
69
|
<p align="center">
|
|
70
|
-
<img src="https://raw.githubusercontent.com/rperez93/collab-a2a/
|
|
70
|
+
<img src="https://raw.githubusercontent.com/rperez93/collab-a2a/v2.0.3/assets/demo.png" alt="Collab 2.0.3: coding agent on the left, compact participant rows with main and worker models above the conversation on the right" width="1100">
|
|
71
71
|
<br>
|
|
72
|
-
<sub>
|
|
72
|
+
<sub>The current terminal renderer, with synthetic demo data: a coding agent on the left and the live viewer on the right. Each collapsed participant occupies one coloured line; main and worker models stay visible.</sub>
|
|
73
73
|
</p>
|
|
74
74
|
|
|
75
75
|
```
|
|
@@ -1276,37 +1276,36 @@ turn each into a notification. `collab watch` is the view for a **person**: a
|
|
|
1276
1276
|
full-screen terminal UI with the roster on top and the conversation below, each
|
|
1277
1277
|
scrolling on its own.
|
|
1278
1278
|
|
|
1279
|
-
```
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
○
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
`
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
`End`.
|
|
1279
|
+
```bash
|
|
1280
|
+
collab watch
|
|
1281
|
+
collab watch --panel # open a supported terminal split
|
|
1282
|
+
```
|
|
1283
|
+
|
|
1284
|
+

|
|
1285
|
+
|
|
1286
|
+
Collapsed participants use one padded, coloured row: identity, `m:` main model,
|
|
1287
|
+
`w` worker state/model, and working/idle duration. The legend explains
|
|
1288
|
+
«● working ○ idle ◌ unknown × offline». Expand a participant to see
|
|
1289
|
+
separate main and worker context, quota windows and resets, token counts, costs
|
|
1290
|
+
and observation ages. Stats remain available when you are the only participant.
|
|
1291
|
+
These screenshots use synthetic figures, not live account measurements.
|
|
1292
|
+
|
|
1293
|
+
| Key | In the combined viewer |
|
|
1294
|
+
| --- | --- |
|
|
1295
|
+
| Tab / Shift+Tab | Switch between Participants and Conversation |
|
|
1296
|
+
| `1` / `2` | Focus Participants / Conversation without moving either viewport |
|
|
1297
|
+
| ↑ / ↓ | Select a participant; scroll when Conversation has focus |
|
|
1298
|
+
| Enter / Space | Expand or collapse the selected participant |
|
|
1299
|
+
| ← / → | Collapse / expand participant details |
|
|
1300
|
+
| `j` / `k`, Page Up / Page Down | Scroll the focused pane |
|
|
1301
|
+
| Home / End | Go to the start / end; End resumes live following in Conversation |
|
|
1302
|
+
| `+` / `-` | Give Participants more / less height |
|
|
1303
|
+
|
|
1304
|
+
Use `collab watch --limit N` to load more messages initially.
|
|
1305
|
+
The footer shows controls for the focused pane. In separate native terminal or
|
|
1306
|
+
tmux panes, use that terminal's pane-switching keys. Expanded content is padded,
|
|
1307
|
+
short facts share rows, and refreshing stats preserves your reading position.
|
|
1308
|
+
[All panel controls and terminal support](docs/watch-panel.md).
|
|
1310
1309
|
|
|
1311
1310
|
### Demo, for screenshots
|
|
1312
1311
|
|
|
@@ -1319,20 +1318,15 @@ collab demo agent # the left half alone — a coding agent's terminal, mid-
|
|
|
1319
1318
|
collab demo watch # the right half alone — the viewer on the simulated session
|
|
1320
1319
|
```
|
|
1321
1320
|
|
|
1322
|
-
The
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
was showing everything about an agent except the thing it is for. The screenshot at the top of this page is `collab demo` in a 168×34
|
|
1332
|
-
terminal with the roster given 42 percent of the window, captured as it
|
|
1333
|
-
finished. Inside tmux, `collab demo` opens the viewer in a second pane; outside
|
|
1334
|
-
it, one window is split down the middle. `q` quits either. `collab watch
|
|
1335
|
-
--demo` still opens the viewer alone, as it always has.
|
|
1321
|
+
The demo is a scripted conversation shown through the same renderer as a real
|
|
1322
|
+
session. The coding-agent view and viewer share its messages, batch progress
|
|
1323
|
+
and activity state. The documentation's 168×38 full-window capture also supplies
|
|
1324
|
+
synthetic main and worker telemetry; [reproduce the captures](docs/screenshots.md)
|
|
1325
|
+
with the included script.
|
|
1326
|
+
|
|
1327
|
+
Inside tmux, `collab demo` opens the viewer in a second pane; outside it, one
|
|
1328
|
+
window is split down the middle. `q` quits either. `collab watch --demo` opens
|
|
1329
|
+
the viewer alone without joining a session.
|
|
1336
1330
|
|
|
1337
1331
|
### Layout
|
|
1338
1332
|
|
|
@@ -2322,6 +2316,8 @@ collab config # every setting, its value and its default
|
|
|
2322
2316
|
collab config theme # one of them
|
|
2323
2317
|
collab config theme chat # set it
|
|
2324
2318
|
collab config theme --unset # put it back to its default
|
|
2319
|
+
collab config editor nano # preferred terminal editor (vim/nvim also work)
|
|
2320
|
+
collab config rules_text --edit # choose external editor or inline input
|
|
2325
2321
|
collab config --json # the same table, for an agent to read
|
|
2326
2322
|
```
|
|
2327
2323
|
|
|
@@ -2329,6 +2325,7 @@ collab config --json # the same table, for an agent to read
|
|
|
2329
2325
|
|---|---|---|---|
|
|
2330
2326
|
| `display_name` | the name others see | `collab name <n>` | git `user.name`, else `$USER` |
|
|
2331
2327
|
| `color` | the colour others see you in | `collab color <hex>` | dealt from the palette |
|
|
2328
|
+
| `editor` | terminal editor command; empty follows VISUAL, EDITOR, then vi | — | empty |
|
|
2332
2329
|
| `theme` | how the conversation is laid out | `collab theme <name>` | `classic` |
|
|
2333
2330
|
| `timezone` | the zone dates and times are read in; an IANA name, or `auto` for the computer's own | — | `auto` |
|
|
2334
2331
|
| `share_stats` | share your usage with the session | `collab stats --share on\|off` | `on` |
|
|
@@ -2709,7 +2706,7 @@ subagents, context, quota, source freshness and separately accounted worker
|
|
|
2709
2706
|
usage. Configure the fields and default models live with `collab config`, or
|
|
2710
2707
|
open the keyboard/mouse settings editor with `collab config --tui`.
|
|
2711
2708
|
|
|
2712
|
-

|
|
2713
2710
|
|
|
2714
2711
|
[Panel controls](docs/watch-panel.md) · [Usage sources](docs/telemetry.md) ·
|
|
2715
2712
|
[Live settings](docs/settings.md) · [Issue validation](docs/issue-validation.md)
|
|
@@ -2719,7 +2716,9 @@ open the keyboard/mouse settings editor with `collab config --tui`.
|
|
|
2719
2716
|
`collab config --tui` edits the same settings as existing CLI commands, including
|
|
2720
2717
|
provider model defaults, worker budgets, participant fields and explicit model
|
|
2721
2718
|
prices. Edits are staged and validated; external changes reload without silently
|
|
2722
|
-
overwriting a draft.
|
|
2719
|
+
overwriting a draft. Text edits offer your preferred terminal editor through a
|
|
2720
|
+
temporary file; `r` / **Reset to default** restores the selected default.
|
|
2721
|
+
[Editor guide](docs/settings-panel.md).
|
|
2723
2722
|
|
|
2724
2723
|
Twelve bundled skills cover hosting, joining, discovery, watching, activity,
|
|
2725
2724
|
learnings, settings, skill sharing, capacity, workers, telemetry and tasks.
|
|
@@ -2740,15 +2739,3 @@ See [resource measurements](docs/performance.md) for CPU/RAM and leak-check limi
|
|
|
2740
2739
|
## License
|
|
2741
2740
|
|
|
2742
2741
|
MIT
|
|
2743
|
-
|
|
2744
|
-
In v2.0.2, collapsed participants use one padded coloured row with main and
|
|
2745
|
-
worker models and activity duration. Up/Down selects participants; Page Up/Down
|
|
2746
|
-
and the wheel scroll details. Stats remain available for a solo participant.
|
|
2747
|
-
See [panel controls and terminal support](docs/watch-panel.md). The Codex probe
|
|
2748
|
-
refreshes own-thread model/context/tokens alongside independently dated quota.
|
|
2749
|
-
Worker facts survive summary changes within a bounded retained-context history.
|
|
2750
|
-
|
|
2751
|
-
In the combined viewer, Tab or Shift+Tab switches panes; `1` focuses
|
|
2752
|
-
Participants and `2` focuses Conversation without moving either scroll position.
|
|
2753
|
-
The footer shows keys for the focused pane. Expanded participant details have
|
|
2754
|
-
left padding and pack short facts and their observation ages onto shared rows.
|
|
@@ -46,9 +46,9 @@ It also works for two agents on **one** machine in different repos.
|
|
|
46
46
|
> on collab itself.
|
|
47
47
|
|
|
48
48
|
<p align="center">
|
|
49
|
-
<img src="https://raw.githubusercontent.com/rperez93/collab-a2a/
|
|
49
|
+
<img src="https://raw.githubusercontent.com/rperez93/collab-a2a/v2.0.3/assets/demo.png" alt="Collab 2.0.3: coding agent on the left, compact participant rows with main and worker models above the conversation on the right" width="1100">
|
|
50
50
|
<br>
|
|
51
|
-
<sub>
|
|
51
|
+
<sub>The current terminal renderer, with synthetic demo data: a coding agent on the left and the live viewer on the right. Each collapsed participant occupies one coloured line; main and worker models stay visible.</sub>
|
|
52
52
|
</p>
|
|
53
53
|
|
|
54
54
|
```
|
|
@@ -1255,37 +1255,36 @@ turn each into a notification. `collab watch` is the view for a **person**: a
|
|
|
1255
1255
|
full-screen terminal UI with the roster on top and the conversation below, each
|
|
1256
1256
|
scrolling on its own.
|
|
1257
1257
|
|
|
1258
|
-
```
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
○
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
`
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
`End`.
|
|
1258
|
+
```bash
|
|
1259
|
+
collab watch
|
|
1260
|
+
collab watch --panel # open a supported terminal split
|
|
1261
|
+
```
|
|
1262
|
+
|
|
1263
|
+

|
|
1264
|
+
|
|
1265
|
+
Collapsed participants use one padded, coloured row: identity, `m:` main model,
|
|
1266
|
+
`w` worker state/model, and working/idle duration. The legend explains
|
|
1267
|
+
«● working ○ idle ◌ unknown × offline». Expand a participant to see
|
|
1268
|
+
separate main and worker context, quota windows and resets, token counts, costs
|
|
1269
|
+
and observation ages. Stats remain available when you are the only participant.
|
|
1270
|
+
These screenshots use synthetic figures, not live account measurements.
|
|
1271
|
+
|
|
1272
|
+
| Key | In the combined viewer |
|
|
1273
|
+
| --- | --- |
|
|
1274
|
+
| Tab / Shift+Tab | Switch between Participants and Conversation |
|
|
1275
|
+
| `1` / `2` | Focus Participants / Conversation without moving either viewport |
|
|
1276
|
+
| ↑ / ↓ | Select a participant; scroll when Conversation has focus |
|
|
1277
|
+
| Enter / Space | Expand or collapse the selected participant |
|
|
1278
|
+
| ← / → | Collapse / expand participant details |
|
|
1279
|
+
| `j` / `k`, Page Up / Page Down | Scroll the focused pane |
|
|
1280
|
+
| Home / End | Go to the start / end; End resumes live following in Conversation |
|
|
1281
|
+
| `+` / `-` | Give Participants more / less height |
|
|
1282
|
+
|
|
1283
|
+
Use `collab watch --limit N` to load more messages initially.
|
|
1284
|
+
The footer shows controls for the focused pane. In separate native terminal or
|
|
1285
|
+
tmux panes, use that terminal's pane-switching keys. Expanded content is padded,
|
|
1286
|
+
short facts share rows, and refreshing stats preserves your reading position.
|
|
1287
|
+
[All panel controls and terminal support](docs/watch-panel.md).
|
|
1289
1288
|
|
|
1290
1289
|
### Demo, for screenshots
|
|
1291
1290
|
|
|
@@ -1298,20 +1297,15 @@ collab demo agent # the left half alone — a coding agent's terminal, mid-
|
|
|
1298
1297
|
collab demo watch # the right half alone — the viewer on the simulated session
|
|
1299
1298
|
```
|
|
1300
1299
|
|
|
1301
|
-
The
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
was showing everything about an agent except the thing it is for. The screenshot at the top of this page is `collab demo` in a 168×34
|
|
1311
|
-
terminal with the roster given 42 percent of the window, captured as it
|
|
1312
|
-
finished. Inside tmux, `collab demo` opens the viewer in a second pane; outside
|
|
1313
|
-
it, one window is split down the middle. `q` quits either. `collab watch
|
|
1314
|
-
--demo` still opens the viewer alone, as it always has.
|
|
1300
|
+
The demo is a scripted conversation shown through the same renderer as a real
|
|
1301
|
+
session. The coding-agent view and viewer share its messages, batch progress
|
|
1302
|
+
and activity state. The documentation's 168×38 full-window capture also supplies
|
|
1303
|
+
synthetic main and worker telemetry; [reproduce the captures](docs/screenshots.md)
|
|
1304
|
+
with the included script.
|
|
1305
|
+
|
|
1306
|
+
Inside tmux, `collab demo` opens the viewer in a second pane; outside it, one
|
|
1307
|
+
window is split down the middle. `q` quits either. `collab watch --demo` opens
|
|
1308
|
+
the viewer alone without joining a session.
|
|
1315
1309
|
|
|
1316
1310
|
### Layout
|
|
1317
1311
|
|
|
@@ -2301,6 +2295,8 @@ collab config # every setting, its value and its default
|
|
|
2301
2295
|
collab config theme # one of them
|
|
2302
2296
|
collab config theme chat # set it
|
|
2303
2297
|
collab config theme --unset # put it back to its default
|
|
2298
|
+
collab config editor nano # preferred terminal editor (vim/nvim also work)
|
|
2299
|
+
collab config rules_text --edit # choose external editor or inline input
|
|
2304
2300
|
collab config --json # the same table, for an agent to read
|
|
2305
2301
|
```
|
|
2306
2302
|
|
|
@@ -2308,6 +2304,7 @@ collab config --json # the same table, for an agent to read
|
|
|
2308
2304
|
|---|---|---|---|
|
|
2309
2305
|
| `display_name` | the name others see | `collab name <n>` | git `user.name`, else `$USER` |
|
|
2310
2306
|
| `color` | the colour others see you in | `collab color <hex>` | dealt from the palette |
|
|
2307
|
+
| `editor` | terminal editor command; empty follows VISUAL, EDITOR, then vi | — | empty |
|
|
2311
2308
|
| `theme` | how the conversation is laid out | `collab theme <name>` | `classic` |
|
|
2312
2309
|
| `timezone` | the zone dates and times are read in; an IANA name, or `auto` for the computer's own | — | `auto` |
|
|
2313
2310
|
| `share_stats` | share your usage with the session | `collab stats --share on\|off` | `on` |
|
|
@@ -2688,7 +2685,7 @@ subagents, context, quota, source freshness and separately accounted worker
|
|
|
2688
2685
|
usage. Configure the fields and default models live with `collab config`, or
|
|
2689
2686
|
open the keyboard/mouse settings editor with `collab config --tui`.
|
|
2690
2687
|
|
|
2691
|
-

|
|
2692
2689
|
|
|
2693
2690
|
[Panel controls](docs/watch-panel.md) · [Usage sources](docs/telemetry.md) ·
|
|
2694
2691
|
[Live settings](docs/settings.md) · [Issue validation](docs/issue-validation.md)
|
|
@@ -2698,7 +2695,9 @@ open the keyboard/mouse settings editor with `collab config --tui`.
|
|
|
2698
2695
|
`collab config --tui` edits the same settings as existing CLI commands, including
|
|
2699
2696
|
provider model defaults, worker budgets, participant fields and explicit model
|
|
2700
2697
|
prices. Edits are staged and validated; external changes reload without silently
|
|
2701
|
-
overwriting a draft.
|
|
2698
|
+
overwriting a draft. Text edits offer your preferred terminal editor through a
|
|
2699
|
+
temporary file; `r` / **Reset to default** restores the selected default.
|
|
2700
|
+
[Editor guide](docs/settings-panel.md).
|
|
2702
2701
|
|
|
2703
2702
|
Twelve bundled skills cover hosting, joining, discovery, watching, activity,
|
|
2704
2703
|
learnings, settings, skill sharing, capacity, workers, telemetry and tasks.
|
|
@@ -2719,15 +2718,3 @@ See [resource measurements](docs/performance.md) for CPU/RAM and leak-check limi
|
|
|
2719
2718
|
## License
|
|
2720
2719
|
|
|
2721
2720
|
MIT
|
|
2722
|
-
|
|
2723
|
-
In v2.0.2, collapsed participants use one padded coloured row with main and
|
|
2724
|
-
worker models and activity duration. Up/Down selects participants; Page Up/Down
|
|
2725
|
-
and the wheel scroll details. Stats remain available for a solo participant.
|
|
2726
|
-
See [panel controls and terminal support](docs/watch-panel.md). The Codex probe
|
|
2727
|
-
refreshes own-thread model/context/tokens alongside independently dated quota.
|
|
2728
|
-
Worker facts survive summary changes within a bounded retained-context history.
|
|
2729
|
-
|
|
2730
|
-
In the combined viewer, Tab or Shift+Tab switches panes; `1` focuses
|
|
2731
|
-
Participants and `2` focuses Conversation without moving either scroll position.
|
|
2732
|
-
The footer shows keys for the focused pane. Expanded participant details have
|
|
2733
|
-
left padding and pack short facts and their observation ages onto shared rows.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "collab-a2a"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.3"
|
|
8
8
|
description = "An A2A hub that lets coding agents on different machines talk, align on tasks, and discuss work in real time."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -5523,13 +5523,20 @@ def cmd_config(args: argparse.Namespace) -> int:
|
|
|
5523
5523
|
to be handed the right one of nine commands. The commands all still work
|
|
5524
5524
|
and none of them changed; this is the index they never had.
|
|
5525
5525
|
"""
|
|
5526
|
+
editing = getattr(args, "edit", False)
|
|
5526
5527
|
if getattr(args, "tui", False):
|
|
5527
|
-
if args.key or args.value is not None or args.unset or args.json:
|
|
5528
|
-
fail("--tui cannot be combined with a key, value, --unset or --json")
|
|
5528
|
+
if args.key or args.value is not None or args.unset or args.json or editing:
|
|
5529
|
+
fail("--tui cannot be combined with a key, value, --unset, --edit or --json")
|
|
5529
5530
|
return 2
|
|
5530
5531
|
from .client.settings_tui import run
|
|
5531
5532
|
return run(on_change=lambda name: _settle_in_the_session(name, args))
|
|
5532
5533
|
known = settings()
|
|
5534
|
+
if (args.unset or editing) and not args.key:
|
|
5535
|
+
fail("--unset and --edit require a setting key")
|
|
5536
|
+
return 2
|
|
5537
|
+
if editing and (args.unset or args.value is not None or args.json):
|
|
5538
|
+
fail("--edit cannot be combined with a value, --unset or --json")
|
|
5539
|
+
return 2
|
|
5533
5540
|
|
|
5534
5541
|
if not args.key:
|
|
5535
5542
|
if args.json:
|
|
@@ -5550,6 +5557,7 @@ def cmd_config(args: argparse.Namespace) -> int:
|
|
|
5550
5557
|
print(dim(f" they live in {global_config_path()}"))
|
|
5551
5558
|
print(dim(" collab config <key> <value> set one"))
|
|
5552
5559
|
print(dim(" collab config <key> --unset put it back to its default"))
|
|
5560
|
+
print(dim(" collab config <key> --edit edit interactively; text can use an external editor"))
|
|
5553
5561
|
return 0
|
|
5554
5562
|
|
|
5555
5563
|
item = setting(args.key)
|
|
@@ -5569,11 +5577,52 @@ def cmd_config(args: argparse.Namespace) -> int:
|
|
|
5569
5577
|
ok(f"{item.name} is back to its default, {_shown(item.default)}")
|
|
5570
5578
|
return _settle_in_the_session(item.name, args)
|
|
5571
5579
|
|
|
5580
|
+
if editing:
|
|
5581
|
+
from .setting_edit import edit_text, editor_draft, shown
|
|
5582
|
+
import copy
|
|
5583
|
+
|
|
5584
|
+
if not sys.stdin.isatty() or not sys.stdout.isatty():
|
|
5585
|
+
fail("--edit needs a terminal; use collab config <key> <value>")
|
|
5586
|
+
return 2
|
|
5587
|
+
baseline = copy.deepcopy(item.read())
|
|
5588
|
+
try:
|
|
5589
|
+
if isinstance(baseline, str) or item.parse is str:
|
|
5590
|
+
answer = input("Edit in an external terminal editor? [Y/n] ").strip().lower()
|
|
5591
|
+
if answer not in ("", "y", "yes", "n", "no"):
|
|
5592
|
+
raise ValueError("expected yes or no; setting unchanged")
|
|
5593
|
+
if answer in ("", "y", "yes"):
|
|
5594
|
+
draft = editor_draft(item, edit_text(shown(baseline)))
|
|
5595
|
+
else:
|
|
5596
|
+
draft = input("New value: ")
|
|
5597
|
+
else:
|
|
5598
|
+
draft = input("New value: ")
|
|
5599
|
+
if draft == shown(baseline):
|
|
5600
|
+
ok("Unchanged")
|
|
5601
|
+
return 0
|
|
5602
|
+
if item.read() != baseline:
|
|
5603
|
+
raise ValueError("Changed elsewhere; reopen the edit before saving")
|
|
5604
|
+
item.write(item.parse(draft))
|
|
5605
|
+
except (EOFError, KeyboardInterrupt):
|
|
5606
|
+
print("\nEdit cancelled; setting unchanged")
|
|
5607
|
+
return 0
|
|
5608
|
+
except (ValueError, TypeError, OSError) as exc:
|
|
5609
|
+
fail(f"{item.name}: {exc}")
|
|
5610
|
+
return 2
|
|
5611
|
+
ok(f"Saved {item.name}")
|
|
5612
|
+
return _settle_in_the_session(item.name, args)
|
|
5613
|
+
|
|
5572
5614
|
if args.value is None:
|
|
5573
5615
|
# Bare, on its own line, so `$(collab config theme)` is worth writing.
|
|
5574
5616
|
print(_shown(item.read()))
|
|
5575
5617
|
print(dim(f" {item.about}"))
|
|
5576
5618
|
print(dim(f" default {_shown(item.default)}"))
|
|
5619
|
+
print(dim(f" collab config {item.name} <value> set directly"))
|
|
5620
|
+
print(dim(f" collab config {item.name} --unset restore its default"))
|
|
5621
|
+
print(dim(f" collab config {item.name} --edit edit interactively"))
|
|
5622
|
+
print(dim(" collab config --tui browse, edit, or Reset to default (r)"))
|
|
5623
|
+
if isinstance(item.read(), str) or item.parse is str:
|
|
5624
|
+
print(dim(" Text edits offer an external editor or inline input."))
|
|
5625
|
+
print(dim(" collab config editor nano choose vim, nvim, nano or a command with arguments"))
|
|
5577
5626
|
return 0
|
|
5578
5627
|
|
|
5579
5628
|
try:
|
|
@@ -6672,7 +6721,10 @@ COMMAND_GROUPS: list[tuple[str, list[tuple[str, str]]]] = [
|
|
|
6672
6721
|
("logs [--follow]", "what this session has recorded, without stopping it"),
|
|
6673
6722
|
("name [value]", "show or set your display name"),
|
|
6674
6723
|
("config [key] [value]", "every global setting, its value and default"),
|
|
6675
|
-
("config --tui", "edit
|
|
6724
|
+
("config --tui", "edit with keyboard/mouse; r resets to default"),
|
|
6725
|
+
("config <key> --unset", "restore one setting to its default"),
|
|
6726
|
+
("config <key> --edit", "edit inline or choose an external editor for text"),
|
|
6727
|
+
("config editor <command>", "prefer vim, nvim, nano, or an editor with arguments"),
|
|
6676
6728
|
("url", "reprint the join line (host)"),
|
|
6677
6729
|
("kick <name>", "remove a participant (host)"),
|
|
6678
6730
|
("daemon start|stop|status", "the listener that holds the connection"),
|
|
@@ -7254,11 +7306,30 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
7254
7306
|
who = sub.add_parser("whoami", help="this agent's name, colour and state directory")
|
|
7255
7307
|
who.set_defaults(func=cmd_whoami)
|
|
7256
7308
|
|
|
7257
|
-
cf = sub.add_parser(
|
|
7309
|
+
cf = sub.add_parser(
|
|
7310
|
+
"config", help="show or change collab's global settings",
|
|
7311
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
7312
|
+
epilog="""Actions:
|
|
7313
|
+
collab config list settings, values and defaults
|
|
7314
|
+
collab config KEY show one setting and its actions
|
|
7315
|
+
collab config KEY VALUE set directly
|
|
7316
|
+
collab config KEY --unset restore the default
|
|
7317
|
+
collab config KEY --edit edit interactively (terminal required)
|
|
7318
|
+
collab config --tui browse/edit; r resets to default
|
|
7319
|
+
collab config editor nano choose vim, nvim, nano, or a command
|
|
7320
|
+
collab config editor 'nvim -f' editor arguments are supported
|
|
7321
|
+
collab config editor --unset use VISUAL, then EDITOR, then vi
|
|
7322
|
+
|
|
7323
|
+
Text editing asks whether to use an external terminal editor or inline input.
|
|
7324
|
+
Save and quit the external editor to return the temporary file's UTF-8 content.
|
|
7325
|
+
The CLI validates and saves; the TUI keeps a draft until Enter/Save.
|
|
7326
|
+
TUI controls: arrows/j/k select, / searches, Enter edits, r resets, ? helps,
|
|
7327
|
+
Esc cancels a draft, q quits. Editor commands run without a shell.""")
|
|
7258
7328
|
cf.add_argument("key", nargs="?", help="the setting to show or change")
|
|
7259
7329
|
cf.add_argument("value", nargs="?", help="its new value")
|
|
7260
7330
|
cf.add_argument("--unset", action="store_true",
|
|
7261
7331
|
help="put a setting back to its default")
|
|
7332
|
+
cf.add_argument("--edit", action="store_true", help="edit a setting interactively; offer an external editor for text")
|
|
7262
7333
|
cf.add_argument("--json", action="store_true")
|
|
7263
7334
|
cf.add_argument("--tui", action="store_true", help="interactive keyboard/mouse settings editor")
|
|
7264
7335
|
cf.set_defaults(func=cmd_config)
|