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.
Files changed (304) hide show
  1. {collab_a2a-2.0.2/src/collab_a2a.egg-info → collab_a2a-2.0.3}/PKG-INFO +49 -62
  2. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/README.md +48 -61
  3. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/pyproject.toml +1 -1
  4. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/__init__.py +1 -1
  5. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/cli.py +75 -4
  6. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/settings_tui.py +68 -26
  7. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/config.py +24 -4
  8. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/runtime_settings.py +2 -1
  9. collab_a2a-2.0.3/src/collab/setting_edit.py +88 -0
  10. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-configure/SKILL.md +8 -0
  11. {collab_a2a-2.0.2 → collab_a2a-2.0.3/src/collab_a2a.egg-info}/PKG-INFO +49 -62
  12. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab_a2a.egg-info/SOURCES.txt +2 -0
  13. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_config_command.py +86 -0
  14. collab_a2a-2.0.3/tests/test_setting_edit.py +84 -0
  15. collab_a2a-2.0.3/tests/test_settings_panel_in_tmux.py +141 -0
  16. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_settings_tui.py +74 -1
  17. collab_a2a-2.0.2/tests/test_settings_panel_in_tmux.py +0 -67
  18. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/LICENSE +0 -0
  19. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/setup.cfg +0 -0
  20. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/activity.py +0 -0
  21. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/atomic.py +0 -0
  22. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/attention.py +0 -0
  23. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/batch.py +0 -0
  24. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/capacity.py +0 -0
  25. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/__init__.py +0 -0
  26. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/bridge.py +0 -0
  27. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/context.py +0 -0
  28. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/daemon.py +0 -0
  29. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/daemon_files.py +0 -0
  30. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/demo_agent.py +0 -0
  31. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/exclusive.py +0 -0
  32. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/hub_client.py +0 -0
  33. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/inbox.py +0 -0
  34. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/onboard.py +0 -0
  35. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/participant_metrics.py +0 -0
  36. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/recovery.py +0 -0
  37. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/statusbar.py +0 -0
  38. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/terminal_panel.py +0 -0
  39. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/tui.py +0 -0
  40. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/watch.py +0 -0
  41. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/client/worker_service.py +0 -0
  42. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/codex_usage.py +0 -0
  43. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/columns.py +0 -0
  44. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/compaction.py +0 -0
  45. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/compatibility.py +0 -0
  46. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/daemon_main.py +0 -0
  47. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/demo.py +0 -0
  48. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/diagnostics.py +0 -0
  49. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/hosttool.py +0 -0
  50. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/hub_main.py +0 -0
  51. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/identity.py +0 -0
  52. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/learnings.py +0 -0
  53. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/lockfile.py +0 -0
  54. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/owner.py +0 -0
  55. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/peers.py +0 -0
  56. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/protocol.py +0 -0
  57. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/quotas.py +0 -0
  58. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/reboot.py +0 -0
  59. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/rules/COLLAB.md +0 -0
  60. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/rules.py +0 -0
  61. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/__init__.py +0 -0
  62. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/app.py +0 -0
  63. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/auth.py +0 -0
  64. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/card.py +0 -0
  65. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/events.py +0 -0
  66. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/executor.py +0 -0
  67. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/hub.py +0 -0
  68. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/session.py +0 -0
  69. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/store.py +0 -0
  70. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/server/tunnel.py +0 -0
  71. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skill_sharing.py +0 -0
  72. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-activity/SKILL.md +0 -0
  73. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-capacity/SKILL.md +0 -0
  74. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-discover/SKILL.md +0 -0
  75. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-host/SKILL.md +0 -0
  76. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-host/references/connection-and-recovery.md +0 -0
  77. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-join/SKILL.md +0 -0
  78. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-join/references/connection-and-recovery.md +0 -0
  79. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-learn/SKILL.md +0 -0
  80. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-share-skills/SKILL.md +0 -0
  81. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-tasks/SKILL.md +0 -0
  82. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-telemetry/SKILL.md +0 -0
  83. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-telemetry/references/providers.md +0 -0
  84. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-watch/SKILL.md +0 -0
  85. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills/collab-worker/SKILL.md +0 -0
  86. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/skills.py +0 -0
  87. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/source_command.py +0 -0
  88. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/stats.py +0 -0
  89. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/statusline/__init__.py +0 -0
  90. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/statusline/entry.py +0 -0
  91. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/statusline/install.py +0 -0
  92. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/statusline/render.py +0 -0
  93. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/statusline/watchdog.py +0 -0
  94. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/telemetry.py +0 -0
  95. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/themes.py +0 -0
  96. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/update.py +0 -0
  97. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/wake.py +0 -0
  98. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/worker.py +0 -0
  99. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/worker_notices.py +0 -0
  100. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/worker_runtime.py +0 -0
  101. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/worker_telemetry.py +0 -0
  102. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab/worker_usage.py +0 -0
  103. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab_a2a.egg-info/dependency_links.txt +0 -0
  104. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab_a2a.egg-info/entry_points.txt +0 -0
  105. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab_a2a.egg-info/requires.txt +0 -0
  106. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/src/collab_a2a.egg-info/top_level.txt +0 -0
  107. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_count_that_is_not_a_count.py +0 -0
  108. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_daemon_follows_the_agent_that_started_it.py +0 -0
  109. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_figure_can_be_taken_back.py +0 -0
  110. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_figure_of_one_is_one_percent.py +0 -0
  111. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_fresh_session_for_everyone.py +0 -0
  112. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_hole_in_the_log_is_reported.py +0 -0
  113. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_message_is_refused_not_cut.py +0 -0
  114. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_pid_from_another_boot_names_nobody.py +0 -0
  115. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_project_is_a_bundle_that_belongs_to_somebody.py +0 -0
  116. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_quota_read_from_the_agent_itself.py +0 -0
  117. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_refused_kind_is_named_briefly.py +0 -0
  118. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_state_constant_is_read_by_its_data_model.py +0 -0
  119. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_a_window_from_a_bucket_is_still_a_window.py +0 -0
  120. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_activity.py +0 -0
  121. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_activity_cli.py +0 -0
  122. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_activity_hub.py +0 -0
  123. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_agent_commands.py +0 -0
  124. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_agent_identity.py +0 -0
  125. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_an_update_refreshes_what_it_installed.py +0 -0
  126. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_asking_is_not_holding.py +0 -0
  127. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_attention_contention.py +0 -0
  128. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_attention_delivery.py +0 -0
  129. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_bare_join.py +0 -0
  130. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_batch_progress.py +0 -0
  131. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_bind_forms_and_header.py +0 -0
  132. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_chat_is_the_only_kind_a_client_sends.py +0 -0
  133. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_check.py +0 -0
  134. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_clear_quota.py +0 -0
  135. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_cli_imports_no_httpx.py +0 -0
  136. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_cli_v202.py +0 -0
  137. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_codex_own_usage.py +0 -0
  138. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_colour_maths.py +0 -0
  139. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_colour_propagates.py +0 -0
  140. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_colour_push.py +0 -0
  141. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_colour_tables_forget_the_departed.py +0 -0
  142. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_columns_clip.py +0 -0
  143. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_context_compaction.py +0 -0
  144. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_daemon_identity.py +0 -0
  145. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_demo_agent_panel.py +0 -0
  146. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_demo_header_row_is_clipped.py +0 -0
  147. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_demo_session.py +0 -0
  148. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_diagnostics.py +0 -0
  149. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_docs_match_cli.py +0 -0
  150. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_every_agent_is_told_how_to_listen.py +0 -0
  151. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_every_item_of_a_bar_is_a_choice.py +0 -0
  152. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_every_kind_reaches_every_renderer.py +0 -0
  153. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_every_stamp_reads_in_the_readers_zone.py +0 -0
  154. {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
  155. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_external_agent_state.py +0 -0
  156. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_external_state_live_session.py +0 -0
  157. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_file_outcome_takes_junk.py +0 -0
  158. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_files.py +0 -0
  159. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_fold_override.py +0 -0
  160. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_global_figures.py +0 -0
  161. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_global_home.py +0 -0
  162. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_guest_follows_the_hub.py +0 -0
  163. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_home_flag.py +0 -0
  164. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_home_isolation.py +0 -0
  165. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_home_permissions.py +0 -0
  166. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_host_name_clash.py +0 -0
  167. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_how_it_was_installed.py +0 -0
  168. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_hub.py +0 -0
  169. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_hub_version_travels.py +0 -0
  170. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_inbox_under_contention.py +0 -0
  171. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_inbox_write_order.py +0 -0
  172. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_info_blue.py +0 -0
  173. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_input_bounds.py +0 -0
  174. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_issue_recovery.py +0 -0
  175. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_joining_a_dead_session.py +0 -0
  176. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_joining_by_name.py +0 -0
  177. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_jump_from_the_status_row.py +0 -0
  178. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_kill.py +0 -0
  179. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_layout.py +0 -0
  180. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_learnings.py +0 -0
  181. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_learnings_cost.py +0 -0
  182. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_learnings_sync.py +0 -0
  183. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_leaving_takes_the_wake_with_it.py +0 -0
  184. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_listen_kind_filters.py +0 -0
  185. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_live_settings.py +0 -0
  186. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_liveness_from_a_sandbox.py +0 -0
  187. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_local_join_stays_local.py +0 -0
  188. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_lock_flow.py +0 -0
  189. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_lock_identity.py +0 -0
  190. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_lockfile.py +0 -0
  191. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_logs_can_be_read_without_stopping_anything.py +0 -0
  192. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_loose_ends.py +0 -0
  193. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_markdown_themes.py +0 -0
  194. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_migration.py +0 -0
  195. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_monitor_armed.py +0 -0
  196. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_mutation_gaps.py +0 -0
  197. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_name_migration.py +0 -0
  198. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_name_reuse.py +0 -0
  199. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_no_autohost.py +0 -0
  200. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_numbers_that_stop_moving_say_why.py +0 -0
  201. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_okf_bundle.py +0 -0
  202. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_older_above_agrees_with_what_loads.py +0 -0
  203. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_orphans.py +0 -0
  204. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_overview.py +0 -0
  205. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_own_colour.py +0 -0
  206. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_owner_stamp.py +0 -0
  207. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_panel_v202.py +0 -0
  208. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_participant_cards_v201.py +0 -0
  209. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_participant_details.py +0 -0
  210. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_participant_panel_in_tmux.py +0 -0
  211. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_peers.py +0 -0
  212. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_peers_lifecycle.py +0 -0
  213. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_periodic_reminder.py +0 -0
  214. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_persisted_v2_boundary.py +0 -0
  215. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_platform_support.py +0 -0
  216. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_rate_limiter_forgets.py +0 -0
  217. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_reminder_edges.py +0 -0
  218. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_reminder_on_the_monitor.py +0 -0
  219. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_rename.py +0 -0
  220. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_render.py +0 -0
  221. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_resume.py +0 -0
  222. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_room_files_wait_for_everyone.py +0 -0
  223. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_roster_colour.py +0 -0
  224. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_roster_dots.py +0 -0
  225. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_roster_row_keeps_the_count.py +0 -0
  226. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_roster_rule.py +0 -0
  227. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_roster_when_the_session_dies.py +0 -0
  228. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_rotating_the_invite.py +0 -0
  229. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_rotation_is_atomic.py +0 -0
  230. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_rules.py +0 -0
  231. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_same_name_is_not_ownership.py +0 -0
  232. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_semantic_theme_engine.py +0 -0
  233. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_settings_reach_the_open_session.py +0 -0
  234. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_shared_skills_and_capacity.py +0 -0
  235. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_skill_capabilities_v201.py +0 -0
  236. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_skill_formats.py +0 -0
  237. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_skill_settings_match_the_registry.py +0 -0
  238. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_skills.py +0 -0
  239. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_source_command_bounds.py +0 -0
  240. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stale_status.py +0 -0
  241. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_state_dir_cleanup.py +0 -0
  242. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_state_dirs.py +0 -0
  243. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_state_is_not_conversation.py +0 -0
  244. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats.py +0 -0
  245. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats_formats.py +0 -0
  246. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats_ownership.py +0 -0
  247. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats_say_when.py +0 -0
  248. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats_source.py +0 -0
  249. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stats_stamp_edges.py +0 -0
  250. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_status_bar.py +0 -0
  251. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_statuses_stay_current.py +0 -0
  252. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_statusline_imports_no_networking.py +0 -0
  253. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_statusline_install.py +0 -0
  254. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stopped_msg.py +0 -0
  255. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_stream.py +0 -0
  256. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tasks_want_a_batch.py +0 -0
  257. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_telemetry_v2.py +0 -0
  258. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_telling_agents_apart.py +0 -0
  259. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_terminal_escapes.py +0 -0
  260. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_terminal_panel.py +0 -0
  261. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_a2a_client_surface_is_not_dead_code.py +0 -0
  262. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_count_is_a_switch.py +0 -0
  263. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_count_is_never_shown_outdated.py +0 -0
  264. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_daemon_forgets_what_it_no_longer_needs.py +0 -0
  265. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_pane_and_the_transcript_agree_about_a_file.py +0 -0
  266. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_record_is_kept_without_being_asked.py +0 -0
  267. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_reminder_can_be_added_to.py +0 -0
  268. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_reminder_reaches_every_agent.py +0 -0
  269. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_roster_foot_is_a_grid.py +0 -0
  270. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_status_line_cannot_run_forever.py +0 -0
  271. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_status_line_does_not_vanish.py +0 -0
  272. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_suite_never_reads_your_config.py +0 -0
  273. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_two_row_switches_are_independent.py +0 -0
  274. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_the_wake_explains_its_clocks.py +0 -0
  275. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_theme_files_survive.py +0 -0
  276. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_theme_is_visual_only.py +0 -0
  277. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_theme_panel_in_tmux.py +0 -0
  278. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_transcript_dates_follow_the_clock.py +0 -0
  279. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tui_cost.py +0 -0
  280. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tui_fold_click.py +0 -0
  281. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tui_gutter.py +0 -0
  282. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tui_scroll.py +0 -0
  283. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tui_window.py +0 -0
  284. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_tunnel.py +0 -0
  285. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_two_agents_one_repo.py +0 -0
  286. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_unread_is_what_the_agent_has_not_seen.py +0 -0
  287. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_update.py +0 -0
  288. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_v201_communication_challenger.py +0 -0
  289. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_v201_final_review.py +0 -0
  290. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_v201_remaining_surfaces_challenger.py +0 -0
  291. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_v2_compatibility.py +0 -0
  292. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_viewer_says_what_the_ack_did.py +0 -0
  293. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_wake.py +0 -0
  294. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_watch_pane_survives.py +0 -0
  295. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_what_may_be_signalled.py +0 -0
  296. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_which_agent.py +0 -0
  297. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_who_is_who.py +0 -0
  298. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_delivery.py +0 -0
  299. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_notices.py +0 -0
  300. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_runtime.py +0 -0
  301. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_service.py +0 -0
  302. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_source_v201.py +0 -0
  303. {collab_a2a-2.0.2 → collab_a2a-2.0.3}/tests/test_worker_state.py +0 -0
  304. {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.2
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/main/assets/demo.png" alt="collab demo: a coding agent's terminal on the left, mid-task, with a message from the session arriving, the reply going back out through collab send, and collab's status line at the foot; the collab watch viewer on the right showing the roster with each participant's model and context, the roster's foot with the batch bar, the message count and the reader's own activity, and the conversation" width="900">
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>A coding agent mid-task on the left, the <code>collab watch</code> viewer on the right — <code>collab demo</code>, nobody on the other end. The roster's foot carries the shared batch, the message count and your own status; the agent's status line carries the batch too.</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
- $ collab watch
1281
- auth refactor alice (host) v1.2.0
1282
- live 3/3 online
1283
- ── PARTICIPANTS (3) ─────────────────────────────────────────────────────
1284
- ● alice (host, you) online the server side
1285
- api/main · RPEREZ · Opus 5 · quota spend 88% (→30d) · 5h 42% (→1h) · $1.24
1286
- ● bob (same machine) online the client side
1287
- webapp/main · RPEREZ · Opus 5 · quota 5h 88% (→40m) · $3.10
1288
- ○ carol offline · last seen 5m ago reviewing the PR
1289
- ops/main · dev-box · Opus 5 · quota 5h 12% · $0.42
1290
- ── CONVERSATION ─────────────────────────────────────────────────────────
1291
- 14:41 bob → joined from webapp, main — the client side
1292
- 14:41 alice (you) #general can you take the client side?
1293
- 14:42 bob #general on it, starting now
1294
- 14:42 bob ◆ claim T_9d63 "migrate sessions" [working] · bob
1295
- 14:44 alice (you) ▣ shared build.tar.gz (293 KB) · collab file get f_71d1
1296
- ```
1297
-
1298
- Each participant shows their state — `online`, or `offline · last seen 5m ago`,
1299
- because someone who left a minute ago and someone who left yesterday are
1300
- different situations — then a line of whatever they share: repo and branch,
1301
- machine, model, every quota window, spend and context.
1302
-
1303
- `tab` switches pane; `↑↓` selects participants in the roster and scrolls chat.
1304
- `j`/`k` and `pgup`/`pgdn` scroll details. `End` (or `G`)
1305
- jumps back to the live end and `Home` (or `g`) to the start, `q` quits. The pane
1306
- opens on the last few messages and slides its window as you scroll past either
1307
- edge — `--limit N` opens on more. The conversation follows new messages until
1308
- you scroll back, then holds still, counting what is waiting, until you press
1309
- `End`.
1279
+ ```bash
1280
+ collab watch
1281
+ collab watch --panel # open a supported terminal split
1282
+ ```
1283
+
1284
+ ![Compact participants, state legend and conversation in Collab 2.0.3](assets/participant-panel.png)
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 agent is a picture: a scripted transcript, a message from the session
1323
- arriving in it, the reply going back out through `collab send`, and collab's
1324
- own status line at the foot. The messages it quotes are the same lines the
1325
- viewer shows beside it, and the figures are shared too: the viewer's roster
1326
- foot carries a batch part way through, a count of what has been said and the
1327
- reader's own activity, and the agent's status line carries the same batch, all
1328
- stamped fresh on every frame so nothing in the picture ages into a stale
1329
- marker. The roster rows carry allowance windows too — the figure you read
1330
- before handing somebody more work — because a picture of the roster without one
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
- ![Participant details in the real tmux viewer](assets/participant-panel.png)
2709
+ ![Padded expanded participant details with main and worker measurements](assets/participant-details.png)
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. [Editor guide](docs/settings-panel.md).
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/main/assets/demo.png" alt="collab demo: a coding agent's terminal on the left, mid-task, with a message from the session arriving, the reply going back out through collab send, and collab's status line at the foot; the collab watch viewer on the right showing the roster with each participant's model and context, the roster's foot with the batch bar, the message count and the reader's own activity, and the conversation" width="900">
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>A coding agent mid-task on the left, the <code>collab watch</code> viewer on the right — <code>collab demo</code>, nobody on the other end. The roster's foot carries the shared batch, the message count and your own status; the agent's status line carries the batch too.</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
- $ collab watch
1260
- auth refactor alice (host) v1.2.0
1261
- live 3/3 online
1262
- ── PARTICIPANTS (3) ─────────────────────────────────────────────────────
1263
- ● alice (host, you) online the server side
1264
- api/main · RPEREZ · Opus 5 · quota spend 88% (→30d) · 5h 42% (→1h) · $1.24
1265
- ● bob (same machine) online the client side
1266
- webapp/main · RPEREZ · Opus 5 · quota 5h 88% (→40m) · $3.10
1267
- ○ carol offline · last seen 5m ago reviewing the PR
1268
- ops/main · dev-box · Opus 5 · quota 5h 12% · $0.42
1269
- ── CONVERSATION ─────────────────────────────────────────────────────────
1270
- 14:41 bob → joined from webapp, main — the client side
1271
- 14:41 alice (you) #general can you take the client side?
1272
- 14:42 bob #general on it, starting now
1273
- 14:42 bob ◆ claim T_9d63 "migrate sessions" [working] · bob
1274
- 14:44 alice (you) ▣ shared build.tar.gz (293 KB) · collab file get f_71d1
1275
- ```
1276
-
1277
- Each participant shows their state — `online`, or `offline · last seen 5m ago`,
1278
- because someone who left a minute ago and someone who left yesterday are
1279
- different situations — then a line of whatever they share: repo and branch,
1280
- machine, model, every quota window, spend and context.
1281
-
1282
- `tab` switches pane; `↑↓` selects participants in the roster and scrolls chat.
1283
- `j`/`k` and `pgup`/`pgdn` scroll details. `End` (or `G`)
1284
- jumps back to the live end and `Home` (or `g`) to the start, `q` quits. The pane
1285
- opens on the last few messages and slides its window as you scroll past either
1286
- edge — `--limit N` opens on more. The conversation follows new messages until
1287
- you scroll back, then holds still, counting what is waiting, until you press
1288
- `End`.
1258
+ ```bash
1259
+ collab watch
1260
+ collab watch --panel # open a supported terminal split
1261
+ ```
1262
+
1263
+ ![Compact participants, state legend and conversation in Collab 2.0.3](assets/participant-panel.png)
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 agent is a picture: a scripted transcript, a message from the session
1302
- arriving in it, the reply going back out through `collab send`, and collab's
1303
- own status line at the foot. The messages it quotes are the same lines the
1304
- viewer shows beside it, and the figures are shared too: the viewer's roster
1305
- foot carries a batch part way through, a count of what has been said and the
1306
- reader's own activity, and the agent's status line carries the same batch, all
1307
- stamped fresh on every frame so nothing in the picture ages into a stale
1308
- marker. The roster rows carry allowance windows too — the figure you read
1309
- before handing somebody more work — because a picture of the roster without one
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
- ![Participant details in the real tmux viewer](assets/participant-panel.png)
2688
+ ![Padded expanded participant details with main and worker measurements](assets/participant-details.png)
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. [Editor guide](docs/settings-panel.md).
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.2"
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"
@@ -1,3 +1,3 @@
1
1
  """collab — an A2A hub for coding agents."""
2
2
 
3
- __version__ = "2.0.2"
3
+ __version__ = "2.0.3"
@@ -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 the same settings using keyboard or mouse"),
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("config", help="show or change collab's global settings")
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)