agentwire-dev 1.69.0__tar.gz → 1.71.0__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 (640) hide show
  1. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/workflows/pytest.yml +13 -4
  2. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/PKG-INFO +2 -2
  3. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/__init__.py +1 -1
  4. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/__main__.py +2 -1
  5. agentwire_dev-1.71.0/agentwire/activity_cli.py +86 -0
  6. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/beta.py +13 -2
  7. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/buddy_cli.py +91 -5
  8. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels_cli.py +36 -1
  9. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/cohort.py +36 -8
  10. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/config.py +5 -2
  11. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/core.py +160 -19
  12. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/doctor_cli.py +44 -4
  13. agentwire_dev-1.71.0/agentwire/fleet_activity.py +563 -0
  14. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/fleet_alerts.py +54 -1
  15. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/audit_logger.py +114 -3
  16. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +1844 -105
  17. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +1829 -107
  18. agentwire_dev-1.71.0/agentwire/hooks/damage-control/mcp-tool-damage-control.py +4890 -0
  19. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/read-tool-damage-control.py +1821 -102
  20. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +12 -7
  21. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/git.yaml +9 -0
  22. agentwire_dev-1.71.0/agentwire/hooks/damage-control/rules/mcp-tools.yaml +84 -0
  23. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/payloads.yaml +16 -0
  24. agentwire_dev-1.71.0/agentwire/hooks/damage-control/rules/remote.yaml +49 -0
  25. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +1821 -102
  26. agentwire_dev-1.71.0/agentwire/hooks/outcome_logger.py +89 -0
  27. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks_cli.py +55 -17
  28. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/inbox.py +121 -37
  29. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/limits_cli.py +19 -5
  30. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_channels.py +1 -1
  31. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_chrome.py +2 -1
  32. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_core.py +66 -78
  33. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_council.py +1 -1
  34. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_handoff.py +1 -1
  35. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_history.py +1 -1
  36. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_listen.py +1 -1
  37. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_lock.py +1 -1
  38. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_machine.py +1 -1
  39. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_msg.py +1 -1
  40. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_notify.py +16 -8
  41. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_pane.py +1 -1
  42. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_projects.py +1 -1
  43. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_scheduler.py +1 -1
  44. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_scratchpad.py +1 -1
  45. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_server.py +2 -1
  46. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_services.py +1 -1
  47. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_session.py +6 -1
  48. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_status.py +1 -1
  49. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_task.py +1 -1
  50. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_tunnels.py +1 -1
  51. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_voice.py +1 -1
  52. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_worktree.py +1 -1
  53. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/msg_cli.py +31 -6
  54. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/notify_cli.py +68 -5
  55. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/pane_cli.py +26 -3
  56. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/prompt_router.py +9 -1
  57. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/agentwire.md +2 -2
  58. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/desktop.py +5 -0
  59. agentwire_dev-1.69.0/agentwire/hooks/damage-control/mcp-tool-damage-control.py → agentwire_dev-1.71.0/agentwire/safety/_core.py +1802 -315
  60. agentwire_dev-1.71.0/agentwire/safety/audit.py +157 -0
  61. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety/lint.py +8 -2
  62. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety/rule_baselines.json +10 -2
  63. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety_cli.py +18 -0
  64. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety_commands.py +164 -30
  65. agentwire_dev-1.71.0/agentwire/safety_notify.py +389 -0
  66. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/report.py +27 -1
  67. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/server.py +16 -8
  68. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/services.py +68 -0
  69. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/session_cli.py +89 -6
  70. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/css/desktop.css +14 -0
  71. agentwire_dev-1.71.0/agentwire/static/js/dead-key-residue.js +63 -0
  72. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/desktop.js +12 -19
  73. agentwire_dev-1.71.0/agentwire/static/js/hotkeys.js +38 -0
  74. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/scratchpad.js +4 -14
  75. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/service-classification.js +1 -0
  76. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-hud-controller.js +6 -4
  77. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-hud.js +4 -14
  78. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar.js +4 -15
  79. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/terminal-pane.js +14 -0
  80. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/topology-render.js +24 -2
  81. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/git.yaml +14 -2
  82. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/client.py +372 -48
  83. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/confirm.py +427 -48
  84. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/identity.py +104 -1
  85. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/instructions.py +22 -0
  86. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/realtime.py +115 -4
  87. agentwire_dev-1.71.0/agentwire/voice_layer/relay.py +192 -0
  88. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/server.py +78 -7
  89. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/surface.py +15 -0
  90. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/tools.py +234 -3
  91. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/write_tools.py +25 -7
  92. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/wait_cli.py +12 -1
  93. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/damage-control.md +110 -28
  94. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/fan-out-cohorts.md +10 -1
  95. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/messaging.md +56 -3
  96. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/worktree-sessions.md +10 -1
  97. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/voice-layer.md +342 -2
  98. agentwire_dev-1.71.0/scratch-remove-docker-daemons.sh +12 -0
  99. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/conftest.py +42 -0
  100. agentwire_dev-1.71.0/tests/fixtures/hotkeys_harness.mjs +123 -0
  101. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_send_verified_tmux.py +4 -3
  102. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_tmux_name_rewrite.py +18 -0
  103. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_worktree_cmd.py +3 -0
  104. agentwire_dev-1.71.0/tests/unit/test_audit_attribution.py +266 -0
  105. agentwire_dev-1.71.0/tests/unit/test_audit_outcomes.py +152 -0
  106. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_beta_flag.py +48 -159
  107. agentwire_dev-1.71.0/tests/unit/test_brace_expansion_zero_access.py +62 -0
  108. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_cli_smoke.py +15 -12
  109. agentwire_dev-1.71.0/tests/unit/test_cli_stderr_clean.py +232 -0
  110. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_cohort.py +72 -1
  111. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_damage_control_bypass.py +5 -0
  112. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_damage_control_hooks.py +89 -65
  113. agentwire_dev-1.71.0/tests/unit/test_damage_control_inert_view.py +150 -0
  114. agentwire_dev-1.71.0/tests/unit/test_damage_control_operation_pinning.py +297 -0
  115. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_damage_control_payload_anchoring.py +261 -183
  116. agentwire_dev-1.71.0/tests/unit/test_fleet_activity.py +750 -0
  117. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_hooks_install.py +53 -0
  118. agentwire_dev-1.71.0/tests/unit/test_hotkeys_js.py +37 -0
  119. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_inbox.py +91 -0
  120. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_limits_tick_isolation.py +24 -0
  121. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_mcp_server.py +63 -13
  122. agentwire_dev-1.71.0/tests/unit/test_mcp_tool_policy.py +230 -0
  123. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_mcp_tools_args.py +26 -9
  124. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_msg_cli.py +58 -0
  125. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_notify_cli.py +36 -0
  126. agentwire_dev-1.71.0/tests/unit/test_payload_position.py +55 -0
  127. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_pip_audit_report.py +0 -23
  128. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_portal_api.py +24 -5
  129. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_prompt_router.py +0 -21
  130. agentwire_dev-1.71.0/tests/unit/test_prose_operands.py +69 -0
  131. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_restart_cli.py +0 -5
  132. agentwire_dev-1.71.0/tests/unit/test_rm_recoverable.py +262 -0
  133. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_commands.py +23 -3
  134. agentwire_dev-1.71.0/tests/unit/test_safety_coverage_wave.py +466 -0
  135. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_deployment.py +6 -3
  136. agentwire_dev-1.71.0/tests/unit/test_safety_engine_is_standalone.py +32 -0
  137. agentwire_dev-1.71.0/tests/unit/test_safety_notify.py +459 -0
  138. agentwire_dev-1.71.0/tests/unit/test_sed_script_is_data.py +62 -0
  139. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_services.py +59 -0
  140. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_session_metadata_ssot.py +5 -0
  141. agentwire_dev-1.71.0/tests/unit/test_tmux_template.py +26 -0
  142. agentwire_dev-1.71.0/tests/unit/test_unattended_allow.py +388 -0
  143. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_unattended_scoped_allow.py +181 -2
  144. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_announcer.py +207 -669
  145. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_body_delivery.py +0 -27
  146. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_confirm.py +295 -162
  147. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_epoch.py +1 -37
  148. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_fleet_alerts.py +5 -1
  149. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_kind.py +0 -121
  150. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_layer.py +140 -0
  151. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_persona.py +30 -0
  152. agentwire_dev-1.71.0/tests/unit/test_voice_picker.py +553 -0
  153. agentwire_dev-1.71.0/tests/unit/test_voice_relay_full_text.py +472 -0
  154. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_surface.py +0 -23
  155. agentwire_dev-1.71.0/tests/unit/test_voice_ux_1048.py +561 -0
  156. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_window_cycling_binding.py +4 -1
  157. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree_dot_project.py +14 -14
  158. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree_git_truth.py +147 -0
  159. agentwire_dev-1.71.0/tests/unit/test_zero_access_member_access.py +59 -0
  160. agentwire_dev-1.71.0/tools/nonce_stt_probe.py +125 -0
  161. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tools/voice_heal_probe.py +47 -11
  162. agentwire_dev-1.69.0/agentwire/hooks/damage-control/rules/remote.yaml +0 -81
  163. agentwire_dev-1.69.0/agentwire/safety/_core.py +0 -2821
  164. agentwire_dev-1.69.0/agentwire/static/js/dead-key-suppressor.js +0 -53
  165. agentwire_dev-1.69.0/tests/fixtures/main_mcp_tools.json +0 -110
  166. agentwire_dev-1.69.0/tests/fixtures/main_roles/agentwire.md +0 -83
  167. agentwire_dev-1.69.0/tests/fixtures/main_roles/orchestrator.md +0 -93
  168. agentwire_dev-1.69.0/tests/fixtures/main_roles/worker-worktree.md +0 -39
  169. agentwire_dev-1.69.0/tests/fixtures/main_roles/worker.md +0 -39
  170. agentwire_dev-1.69.0/tests/unit/test_tmux_template.py +0 -73
  171. agentwire_dev-1.69.0/tests/unit/test_voice_wiki_accuracy.py +0 -818
  172. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.agentwire.yml.example +0 -0
  173. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.claude/commands/handoff.md +0 -0
  174. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.claude/skills/wiki/SKILL.md +0 -0
  175. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/FUNDING.yml +0 -0
  176. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  177. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  178. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  179. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  180. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/workflows/ruff.yml +0 -0
  181. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/workflows/security.yml +0 -0
  182. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/workflows/tts-smoke.yml +0 -0
  183. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.gitignore +0 -0
  184. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/AGENTS.md +0 -0
  185. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/CODE_OF_CONDUCT.md +0 -0
  186. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/CONTRIBUTING.md +0 -0
  187. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/Dockerfile.local +0 -0
  188. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/LICENSE +0 -0
  189. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/README.md +0 -0
  190. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/RELEASING.md +0 -0
  191. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/SECURITY.md +0 -0
  192. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/SPONSORS.md +0 -0
  193. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/agents/__init__.py +0 -0
  194. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/agents/base.py +0 -0
  195. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/agents/tmux.py +0 -0
  196. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/alerts_cli.py +0 -0
  197. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/auth_expired.py +0 -0
  198. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/cached_status.py +0 -0
  199. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels/__init__.py +0 -0
  200. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels/base.py +0 -0
  201. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels/email.py +0 -0
  202. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels/push.py +0 -0
  203. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels/quo.py +0 -0
  204. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/chrome_tabs.py +0 -0
  205. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/completion.py +0 -0
  206. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/config_cli.py +0 -0
  207. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/__init__.py +0 -0
  208. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/cli.py +0 -0
  209. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/inbox.py +0 -0
  210. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/minutes.py +0 -0
  211. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/state.py +0 -0
  212. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/view.py +0 -0
  213. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/devices.py +0 -0
  214. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/diff_cli.py +0 -0
  215. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/doctor_voice.py +0 -0
  216. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/ensure_cli.py +0 -0
  217. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/fetch.py +0 -0
  218. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/__init__.py +0 -0
  219. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/git_state.py +0 -0
  220. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/instructions.py +0 -0
  221. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/parser.py +0 -0
  222. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/renderer.py +0 -0
  223. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/schema.py +0 -0
  224. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff_cli.py +0 -0
  225. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/history.py +0 -0
  226. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/history_cli.py +0 -0
  227. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/history_migrate.py +0 -0
  228. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/__init__.py +0 -0
  229. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/agentwire-permission.sh +0 -0
  230. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/__init__.py +0 -0
  231. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
  232. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
  233. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
  234. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/control-plane.yaml +0 -0
  235. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
  236. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
  237. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
  238. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
  239. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
  240. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
  241. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/outbound.yaml +0 -0
  242. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/publish.yaml +0 -0
  243. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/idle-handler.sh +0 -0
  244. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/queue-processor.sh +0 -0
  245. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/listen.py +0 -0
  246. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/locking.py +0 -0
  247. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/machine_cli.py +0 -0
  248. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_cli.py +0 -0
  249. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_desktop.py +0 -0
  250. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_wiki.py +0 -0
  251. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/network.py +0 -0
  252. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/onboarding.py +0 -0
  253. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/palette_cli.py +0 -0
  254. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/pane_manager.py +0 -0
  255. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/portal_cli.py +0 -0
  256. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/project_config.py +0 -0
  257. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/projects.py +0 -0
  258. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/prompts_cli.py +0 -0
  259. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/push_cli.py +0 -0
  260. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/push_store.py +0 -0
  261. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/repo_cli.py +0 -0
  262. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/research.py +0 -0
  263. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/restart_cli.py +0 -0
  264. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/role_prompts.py +0 -0
  265. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/__init__.py +0 -0
  266. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/anchor.md +0 -0
  267. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/chatbot.md +0 -0
  268. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/contributor.md +0 -0
  269. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/correspondent.md +0 -0
  270. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-brain.md +0 -0
  271. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-conscience.md +0 -0
  272. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-critic.md +0 -0
  273. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-devils-advocate.md +0 -0
  274. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-gut.md +0 -0
  275. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-historian.md +0 -0
  276. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-member.md +0 -0
  277. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-orchestrator.md +0 -0
  278. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/init.md +0 -0
  279. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/notifications.md +0 -0
  280. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/orchestrator.md +0 -0
  281. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/reviewer-worktree.md +0 -0
  282. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/reviewer.md +0 -0
  283. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/shared-checkout.md +0 -0
  284. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/soul.md +0 -0
  285. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/task-runner.md +0 -0
  286. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/voice.md +0 -0
  287. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/worker-worktree.md +0 -0
  288. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/worker.md +0 -0
  289. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles_cli.py +0 -0
  290. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/__init__.py +0 -0
  291. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/artifacts.py +0 -0
  292. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/config.py +0 -0
  293. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/council.py +0 -0
  294. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/history.py +0 -0
  295. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/machines.py +0 -0
  296. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/notify.py +0 -0
  297. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/palette.py +0 -0
  298. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/permission.py +0 -0
  299. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/projects.py +0 -0
  300. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/push.py +0 -0
  301. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/safety.py +0 -0
  302. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/scheduler.py +0 -0
  303. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/scratchpad.py +0 -0
  304. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/sessions.py +0 -0
  305. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/sessions_admin.py +0 -0
  306. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/voice.py +0 -0
  307. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety/__init__.py +0 -0
  308. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety/provenance.py +0 -0
  309. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/__init__.py +0 -0
  310. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/dispatch.py +0 -0
  311. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/gates.py +0 -0
  312. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/loop.py +0 -0
  313. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/models.py +0 -0
  314. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/schedule.py +0 -0
  315. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/state.py +0 -0
  316. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/zombie.py +0 -0
  317. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler_cli.py +0 -0
  318. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scratchpad.py +0 -0
  319. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/security.py +0 -0
  320. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/send_cli.py +0 -0
  321. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/session_context.py +0 -0
  322. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/session_ready.py +0 -0
  323. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/ssh.py +0 -0
  324. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
  325. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
  326. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
  327. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
  328. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
  329. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/announcements.json +0 -0
  330. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/apple-touch-icon.png +0 -0
  331. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/css/mobile.css +0 -0
  332. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/favicon-32.png +0 -0
  333. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/favicon-64.png +0 -0
  334. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/bear.webp +0 -0
  335. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/cat.webp +0 -0
  336. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/crown.webp +0 -0
  337. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/custom/agentwire-portal.webp +0 -0
  338. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/custom/agentwire-tts.webp +0 -0
  339. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/custom/agentwire.webp +0 -0
  340. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/deer.webp +0 -0
  341. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/drone.webp +0 -0
  342. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/eagle.webp +0 -0
  343. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/fox.webp +0 -0
  344. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/hawk.webp +0 -0
  345. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/horse.webp +0 -0
  346. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/lion.webp +0 -0
  347. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/rabbit.webp +0 -0
  348. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/robot.webp +0 -0
  349. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/tiger.webp +0 -0
  350. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/wolf.webp +0 -0
  351. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/img/icon-192.png +0 -0
  352. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/img/icon-512.png +0 -0
  353. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/.gitkeep +0 -0
  354. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/announcement-modal.js +0 -0
  355. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/api.js +0 -0
  356. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/artifact-window.js +0 -0
  357. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/card-terminal.js +0 -0
  358. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/collage.js +0 -0
  359. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/command-palette.js +0 -0
  360. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/council-window.js +0 -0
  361. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/desktop-manager.js +0 -0
  362. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/help-modal.js +0 -0
  363. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/icon-manager.js +0 -0
  364. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/lineage.js +0 -0
  365. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/mobile.js +0 -0
  366. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/notification-prefs.js +0 -0
  367. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/notifications-panel.js +0 -0
  368. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/ptt.js +0 -0
  369. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/push-client.js +0 -0
  370. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/review-window.js +0 -0
  371. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/safety-shared.js +0 -0
  372. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/safety-window.js +0 -0
  373. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-hud-notices.js +0 -0
  374. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-hud-spawn.js +0 -0
  375. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-id.js +0 -0
  376. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-window.js +0 -0
  377. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/shortcuts.js +0 -0
  378. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
  379. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/config-section.js +0 -0
  380. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/council-section.js +0 -0
  381. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
  382. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
  383. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
  384. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
  385. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/services-section.js +0 -0
  386. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/sessions-section.js +0 -0
  387. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/spawn-ghost.js +0 -0
  388. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
  389. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/tile-manager.js +0 -0
  390. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/toast.js +0 -0
  391. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/token-modal.js +0 -0
  392. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/utils/ansi.js +0 -0
  393. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/utils/rich-text.js +0 -0
  394. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/utils/swipe.js +0 -0
  395. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/voice/autosend-prefs.js +0 -0
  396. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/voice/browser-stt.js +0 -0
  397. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/voice/browser-tts.js +0 -0
  398. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/voice/jargon.js +0 -0
  399. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/voice/prompt.js +0 -0
  400. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
  401. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/workspace-window.js +0 -0
  402. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/manifest.webmanifest +0 -0
  403. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/service-worker.js +0 -0
  404. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/topology-harness.html +0 -0
  405. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/__init__.py +0 -0
  406. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/base.py +0 -0
  407. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/cloud.py +0 -0
  408. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/engine.py +0 -0
  409. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/local.py +0 -0
  410. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/server_backend.py +0 -0
  411. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/stt_server.py +0 -0
  412. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/system_cli.py +0 -0
  413. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tabs_cli.py +0 -0
  414. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tasks.py +0 -0
  415. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tasks_cli.py +0 -0
  416. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/__init__.py +0 -0
  417. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/base.html +0 -0
  418. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/council/minutes.html.j2 +0 -0
  419. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/desktop.html +0 -0
  420. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/email_notification.html +0 -0
  421. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
  422. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
  423. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/mobile.html +0 -0
  424. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/pair.html +0 -0
  425. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/statusline.sh +0 -0
  426. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/tmux.conf +0 -0
  427. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templating.py +0 -0
  428. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/aws.yaml +0 -0
  429. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/docker.yaml +0 -0
  430. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/gcp.yaml +0 -0
  431. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/gh.yaml +0 -0
  432. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/gws.yaml +0 -0
  433. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/kubectl.yaml +0 -0
  434. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/npm.yaml +0 -0
  435. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/terraform.yaml +0 -0
  436. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/uv.yaml +0 -0
  437. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/__init__.py +0 -0
  438. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/audio.py +0 -0
  439. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/base.py +0 -0
  440. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/engines/__init__.py +0 -0
  441. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/engines/chatterbox.py +0 -0
  442. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/engines/kokoro.py +0 -0
  443. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/engines/zonos.py +0 -0
  444. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/kokoro_server.py +0 -0
  445. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/local.py +0 -0
  446. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/registry.py +0 -0
  447. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts_cli.py +0 -0
  448. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts_server.py +0 -0
  449. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tunnels.py +0 -0
  450. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tunnels_cli.py +0 -0
  451. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/usage_limit.py +0 -0
  452. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/__init__.py +0 -0
  453. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/chunker.py +0 -0
  454. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/event_log.py +0 -0
  455. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/file_io.py +0 -0
  456. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/paths.py +0 -0
  457. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/speech.py +0 -0
  458. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/subprocess.py +0 -0
  459. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/validation.py +0 -0
  460. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/__init__.py +0 -0
  461. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/delivery.py +0 -0
  462. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/outbox.py +0 -0
  463. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/transcript.py +0 -0
  464. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_status.py +0 -0
  465. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/wiki.py +0 -0
  466. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/wiki_audit.py +0 -0
  467. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/wiki_cli.py +0 -0
  468. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/worktree.py +0 -0
  469. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/worktree_cli.py +0 -0
  470. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/worktree_registry.py +0 -0
  471. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/decisions/obsidian-second-brain.md +0 -0
  472. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/design/session-card-fields.md +0 -0
  473. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/design/session-card-recommendation.md +0 -0
  474. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/logo.png +0 -0
  475. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/INDEX.md +0 -0
  476. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/architecture.md +0 -0
  477. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/auth-expired.md +0 -0
  478. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/briefing-mode.md +0 -0
  479. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/communication/channels.md +0 -0
  480. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/communication/hammerspoon.md +0 -0
  481. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/communication/handoff.md +0 -0
  482. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/concepts.md +0 -0
  483. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/council.md +0 -0
  484. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/deployment/remote-access.md +0 -0
  485. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/deployment/remote-machines.md +0 -0
  486. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/glossary.md +0 -0
  487. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
  488. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/parallel-refactor.md +0 -0
  489. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/portal.md +0 -0
  490. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/session-topology.md +0 -0
  491. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/shell-escaping.md +0 -0
  492. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/troubleshooting.md +0 -0
  493. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/window-collage.md +0 -0
  494. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/quickstart.md +0 -0
  495. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/research/briefing-mode-feasibility.md +0 -0
  496. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/research/orchestration-transport-alternatives.md +0 -0
  497. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
  498. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/security/damage-control-hardening.md +0 -0
  499. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/security/pip-audit.md +0 -0
  500. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/security/remote-access-hardening.md +0 -0
  501. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/security/secrets.md +0 -0
  502. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/services.md +0 -0
  503. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
  504. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/conversation-identity.md +0 -0
  505. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/heal-line-count-cliff.md +0 -0
  506. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/helper-sessions.md +0 -0
  507. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/prompt-routing.md +0 -0
  508. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/window-sizing.md +0 -0
  509. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/usage-limit-recovery.md +0 -0
  510. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/voice/shim-contract.md +0 -0
  511. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/voice/stt-cloud.md +0 -0
  512. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/voice/stt-self-hosted.md +0 -0
  513. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/voice/tts-self-hosted.md +0 -0
  514. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/pyproject.toml +0 -0
  515. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/e2e/test_portal_ui.py +0 -0
  516. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/fixtures/sample_agentwire.yml +0 -0
  517. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/fixtures/sample_config.yaml +0 -0
  518. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/fixtures/sample_scheduler.yaml +0 -0
  519. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/home_guard.py +0 -0
  520. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_council_portal.py +0 -0
  521. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_scheduler_board.py +0 -0
  522. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_server_websockets.py +0 -0
  523. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/page_slice.py +0 -0
  524. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_announcements.py +0 -0
  525. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_auth_expired.py +0 -0
  526. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_auth_expired_dispatch.py +0 -0
  527. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_buddy_restart.py +0 -0
  528. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_build_agent_command.py +0 -0
  529. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_channels.py +0 -0
  530. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_chrome_tabs.py +0 -0
  531. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_cli_commands.py +0 -0
  532. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_cli_output.py +0 -0
  533. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_client_wires.py +0 -0
  534. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_config.py +0 -0
  535. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_config_cli.py +0 -0
  536. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_control_plane_protection.py +0 -0
  537. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_core_created_by_rooting.py +0 -0
  538. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_council_cli.py +0 -0
  539. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_council_inbox.py +0 -0
  540. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_council_minutes.py +0 -0
  541. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_council_state.py +0 -0
  542. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_council_view.py +0 -0
  543. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_damage_control_sync.py +0 -0
  544. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_dangling_worktrees.py +0 -0
  545. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_devices.py +0 -0
  546. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_diff_cli.py +0 -0
  547. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_doctor_orphaned_history.py +0 -0
  548. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_doctor_scheduler_staleness.py +0 -0
  549. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_doctor_secrets_perms.py +0 -0
  550. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_doctor_task_migration.py +0 -0
  551. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_doctor_voice.py +0 -0
  552. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_ensure_shared_dir.py +0 -0
  553. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_ensure_verified_prompt.py +0 -0
  554. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_event_log.py +0 -0
  555. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_file_io.py +0 -0
  556. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_fleet_alerts.py +0 -0
  557. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_guarded_launch_command.py +0 -0
  558. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_handoff_git_state.py +0 -0
  559. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_handoff_instructions.py +0 -0
  560. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_handoff_parser.py +0 -0
  561. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_handoff_renderer.py +0 -0
  562. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_helper_session.py +0 -0
  563. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_history.py +0 -0
  564. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_history_migrate.py +0 -0
  565. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_history_migrate_cli.py +0 -0
  566. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_history_resume_name.py +0 -0
  567. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_home_isolation.py +0 -0
  568. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_idle_handler.py +0 -0
  569. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_idle_nag.py +0 -0
  570. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_init_command.py +0 -0
  571. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_install_parity.py +0 -0
  572. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_launch_line_reentry.py +0 -0
  573. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_launch_via_env.py +0 -0
  574. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_locking.py +0 -0
  575. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_onboarding_reinit.py +0 -0
  576. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_owner_only_writes.py +0 -0
  577. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_palette_cli.py +0 -0
  578. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_pending_message_visibility.py +0 -0
  579. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_pip_environment.py +0 -0
  580. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_posture_default.py +0 -0
  581. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_project_config.py +0 -0
  582. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_projects_registry.py +0 -0
  583. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_prompt_router_resume.py +0 -0
  584. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_push.py +0 -0
  585. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_rebuild_guard.py +0 -0
  586. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_remote_session_record.py +0 -0
  587. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_repo_cli.py +0 -0
  588. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_rich_text_js.py +0 -0
  589. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_role_prompt_retention.py +0 -0
  590. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_role_prompt_sweep_wiring.py +0 -0
  591. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_roles.py +0 -0
  592. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_routes_snapshot.py +0 -0
  593. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_disabled_rules.py +0 -0
  594. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_escape_hatch.py +0 -0
  595. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_heal.py +0 -0
  596. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_kill_switch.py +0 -0
  597. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_scheduler.py +0 -0
  598. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_scheduler_liveness.py +0 -0
  599. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_scheduler_parsing.py +0 -0
  600. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_scheduler_zombie.py +0 -0
  601. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_scratchpad.py +0 -0
  602. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_security.py +0 -0
  603. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_server_async.py +0 -0
  604. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_server_pure.py +0 -0
  605. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_services_command.py +0 -0
  606. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_session_context.py +0 -0
  607. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_session_created_by_env.py +0 -0
  608. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_session_metadata_write.py +0 -0
  609. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_session_ready.py +0 -0
  610. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_shared_dir_guard.py +0 -0
  611. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_shim_selfheal.py +0 -0
  612. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_skill_install.py +0 -0
  613. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_speech_tags.py +0 -0
  614. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_ssh.py +0 -0
  615. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_stt_backend.py +0 -0
  616. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_stt_cloud.py +0 -0
  617. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_stt_engine.py +0 -0
  618. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_task_cli.py +0 -0
  619. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_task_max_duration.py +0 -0
  620. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tasks.py +0 -0
  621. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tasks_cli.py +0 -0
  622. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_templating.py +0 -0
  623. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_terminal_resize.py +0 -0
  624. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tmux_session_cwd.py +0 -0
  625. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tts_engine_resolution.py +0 -0
  626. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tts_local.py +0 -0
  627. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tunnels_probe.py +0 -0
  628. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_unattended_env_isolation.py +0 -0
  629. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_usage_limit.py +0 -0
  630. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_validation.py +0 -0
  631. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_bridge_host.py +0 -0
  632. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_outbox.py +0 -0
  633. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_status.py +0 -0
  634. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_wiki.py +0 -0
  635. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_wiki_audit.py +0 -0
  636. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree.py +0 -0
  637. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree_branch_cleanup.py +0 -0
  638. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree_layout.py +0 -0
  639. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree_registry.py +0 -0
  640. {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tools/voice_dc_probe.py +0 -0
@@ -10,7 +10,7 @@
10
10
  # is on PATH. Per the council guardrail we do NOT chase coverage % or block PRs
11
11
  # on flaky/tmux-dependent tests.
12
12
  #
13
- # Coverage is measured and surfaced (term-missing in the log + a table in the
13
+ # On pushes to main, coverage is measured and surfaced (term-missing in the log + a table in the
14
14
  # run's job summary + an uploaded coverage.xml artifact) but is REPORT-ONLY:
15
15
  # there is deliberately no --cov-fail-under, so a low percentage never reds the
16
16
  # build. The point is visibility — letting the maintainer spot untested
@@ -37,13 +37,22 @@ jobs:
37
37
  - name: Sync dependencies
38
38
  run: uv sync --extra dev
39
39
 
40
- - name: Run test suite (tmux-dependent tests deselected) + coverage
40
+ # Pull requests run the FAST set: no coverage tracing (it multiplies
41
+ # runtime on a hosted runner) and no `slow` tests (real git/tmux
42
+ # processes per test). A PR gate that takes 45 minutes gets bypassed.
43
+ - name: Run test suite (fast set)
44
+ if: github.event_name == 'pull_request'
45
+ run: uv run --no-sync pytest -q -m "not requires_tmux and not slow"
46
+
47
+ # Pushes to main run everything hermetic, with the report-only coverage.
48
+ - name: Run test suite (full) + coverage
49
+ if: github.event_name != 'pull_request'
41
50
  run: >
42
51
  uv run --no-sync pytest -q -m "not requires_tmux"
43
52
  --cov=agentwire --cov-report=term-missing --cov-report=xml
44
53
 
45
54
  - name: Publish coverage summary (report-only)
46
- if: always()
55
+ if: github.event_name != 'pull_request' && always()
47
56
  run: |
48
57
  {
49
58
  echo '## Coverage (report-only — no threshold gate)'
@@ -54,7 +63,7 @@ jobs:
54
63
  } >> "$GITHUB_STEP_SUMMARY"
55
64
 
56
65
  - name: Upload coverage.xml artifact
57
- if: always()
66
+ if: github.event_name != 'pull_request' && always()
58
67
  uses: actions/upload-artifact@v4
59
68
  with:
60
69
  name: coverage-xml
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: agentwire-dev
3
- Version: 1.69.0
3
+ Version: 1.71.0
4
4
  Summary: Multi-session voice web interface for AI coding agents
5
5
  Project-URL: Homepage, https://agentwire.dev
6
6
  Project-URL: Repository, https://github.com/dotdevdotdev/agentwire-dev
@@ -1,3 +1,3 @@
1
1
  """AgentWire - Multi-session voice web interface for AI coding agents."""
2
2
 
3
- __version__ = "1.69.0"
3
+ __version__ = "1.71.0"
@@ -183,7 +183,7 @@ Command Categories:
183
183
  # - diff: structured git diff for the mobile Review window
184
184
  # - prompts: prompt routing (rides the limits watchdog)
185
185
  # - msg: polite agent-to-agent inbox (rides the watchdog)
186
- from . import alerts_cli, diff_cli, limits_cli, msg_cli, pane_cli, prompts_cli, send_cli # noqa: I001 # session_cli kept on its own line below to minimize Phase 1 #495 merge conflicts
186
+ from . import activity_cli, alerts_cli, diff_cli, limits_cli, msg_cli, pane_cli, prompts_cli, send_cli # noqa: I001 # session_cli kept on its own line below to minimize Phase 1 #495 merge conflicts
187
187
  from . import session_cli
188
188
  from . import channels_cli, config_cli, portal_cli, tts_cli
189
189
  from . import scheduler_cli, ensure_cli, tasks_cli
@@ -199,6 +199,7 @@ Command Categories:
199
199
  prompts_cli.register_prompts_parser,
200
200
  msg_cli.register_msg_parser,
201
201
  alerts_cli.register_alerts_parser,
202
+ activity_cli.register_activity_parser,
202
203
  limits_cli.register_limits_parser,
203
204
  pane_cli.register_pane_parser,
204
205
  send_cli.register_send_parser,
@@ -0,0 +1,86 @@
1
+ """``agentwire activity`` — what the fleet has been doing (#1016).
2
+
3
+ The read side of :mod:`~agentwire.fleet_activity`. It exists as a CLI verb for
4
+ two reasons, and the second is the load-bearing one:
5
+
6
+ 1. "CLI is the single source of truth" — a store readable only from inside the
7
+ process tree that writes it is exactly the shape that rule exists to prevent.
8
+ 2. The voice layer dispatches **only** through the CLI (see
9
+ ``voice_layer/tools.py``), so without this verb the buddy could not read the
10
+ ledger that was built for it.
11
+
12
+ Read-only, by construction: nothing here writes. Producers record from inside
13
+ the surfaces that generate the events (idle, say, toast, scheduled run), never
14
+ from a verb an agent could be talked into calling.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import json
20
+ from datetime import timedelta
21
+
22
+ from . import fleet_activity
23
+
24
+ #: Widest window the verb will look back over. The ledger is capped at
25
+ #: ``MAX_ENTRIES`` anyway, so this bounds the ANSWER rather than the read: a
26
+ #: request for a week of awareness is a request for history, and
27
+ #: ``agentwire scheduler history`` / the event logs are where history lives.
28
+ MAX_HOURS = 72
29
+
30
+
31
+ def cmd_activity_list(args) -> int:
32
+ json_mode = getattr(args, "json", False)
33
+ hours = max(1, min(MAX_HOURS, int(getattr(args, "hours", 12) or 12)))
34
+ entries = fleet_activity.recent(
35
+ limit=max(1, int(getattr(args, "limit", 50) or 50)),
36
+ event=getattr(args, "event", "") or "",
37
+ session=getattr(args, "session", "") or "",
38
+ window=timedelta(hours=hours),
39
+ )
40
+ if json_mode:
41
+ print(json.dumps({
42
+ "success": True,
43
+ "count": len(entries),
44
+ "window_hours": hours,
45
+ "ledger": str(fleet_activity.ledger_path()),
46
+ "activity": entries,
47
+ }, indent=2))
48
+ return 0
49
+ if not entries:
50
+ print(f"No fleet activity recorded in the last {hours}h.")
51
+ return 0
52
+ for entry in entries:
53
+ # The announced flag is shown, not hidden: "recorded" and "said out
54
+ # loud" are different facts, and an operator debugging a chatty or a
55
+ # silent buddy needs to see which one an entry was.
56
+ mark = "*" if entry.get("announced") else " "
57
+ print(f"{mark} {entry.get('ts', '')} {entry.get('event', ''):<16} "
58
+ f"{entry.get('text', '')}")
59
+ print()
60
+ print("* = also queued to fleet-alert subscribers (spoken by the voice buddy at a gap)")
61
+ return 0
62
+
63
+
64
+ def register_activity_parser(subparsers) -> None:
65
+ parser = subparsers.add_parser(
66
+ "activity",
67
+ help="What the fleet has been doing (idle, tasks, toasts, speech)",
68
+ description=(
69
+ "The fleet's activity ledger: sessions going idle, scheduled tasks "
70
+ "finishing, toasts shown to the owner, and everything spoken aloud "
71
+ "through fleet TTS. This is AWARENESS — a record something can read "
72
+ "when asked. Only a short, ruled subset is also queued to "
73
+ "fleet-alert subscribers (see `agentwire alerts`); the rest waits "
74
+ "here to be looked up."
75
+ ),
76
+ )
77
+ sub = parser.add_subparsers(dest="activity_command", required=True)
78
+
79
+ p = sub.add_parser("list", help="Recent activity, newest first")
80
+ p.add_argument("--limit", type=int, default=50, help="Max entries (default: 50)")
81
+ p.add_argument("--hours", type=int, default=12,
82
+ help=f"How far back to look (1-{MAX_HOURS}, default: 12)")
83
+ p.add_argument("--event", choices=fleet_activity.EVENTS, help="Only this event type")
84
+ p.add_argument("-s", "--session", help="Only this session (exact name)")
85
+ p.add_argument("--json", action="store_true", help="Output JSON")
86
+ p.set_defaults(func=cmd_activity_list)
@@ -176,7 +176,18 @@ def gated_doc(fn):
176
176
  wrong, so the property is pinned over the WHOLE registry —
177
177
  ``test_no_published_description_carries_a_marker`` fails on any published
178
178
  description containing a marker, whatever put it there.
179
+
180
+ The resolution happens ONCE, at import, against whatever flag state the
181
+ process started with — so any later reader that wants to verify the
182
+ resolved text needs to know which flags it was resolved WITH, not which
183
+ flags are on now. ``__beta_enabled__`` records exactly that (and
184
+ ``__beta_raw_doc__`` the pre-resolution text), which is what lets the
185
+ byte-identity tests hold on a machine with a beta flag enabled instead of
186
+ silently asserting the developer's personal config (#1023).
179
187
  """
180
- if fn.__doc__:
181
- fn.__doc__ = render(fn.__doc__)
188
+ if fn.__doc__ and "beta:" in fn.__doc__:
189
+ enabled = enabled_flags()
190
+ fn.__beta_raw_doc__ = fn.__doc__
191
+ fn.__beta_enabled__ = frozenset(enabled)
192
+ fn.__doc__ = render(fn.__doc__, enabled=enabled)
182
193
  return fn
@@ -29,6 +29,26 @@ from .voice_layer import delivery, identity, realtime, tools
29
29
  #: project keeps closing, and here the owner is often not even at a screen.
30
30
  BETA_KEY = "beta.voice_layer"
31
31
 
32
+ #: The one ``--voice`` help string, shared by register/mint/serve (#1017).
33
+ #:
34
+ #: Enumerated here rather than declared as argparse ``choices=``, deliberately.
35
+ #: ``choices`` does print the set and does reject early — but its rejection is
36
+ #: argparse's own ("invalid choice"), which cannot say what the default is, is
37
+ #: case-SENSITIVE (so a spoken-then-typed "Cedar" would be refused for no
38
+ #: reason), and exits before any handler runs, which means the ``--json``
39
+ #: caller gets a parser usage dump on stderr instead of a JSON error object.
40
+ #: :func:`_check_voice` does all three properly, and this string is what makes
41
+ #: the list discoverable without reaching the error at all.
42
+ #:
43
+ #: No percent signs anywhere in it: argparse runs help through printf-style
44
+ #: interpolation, and a lone one raises at parse time.
45
+ _VOICE_HELP = (
46
+ "Realtime voice, one of: " + realtime.voice_list()
47
+ + f" (default: {realtime.DEFAULT_VOICE}; cedar and marin are the newer, "
48
+ "more natural pair). Fixed for a session — switch it live from the picker "
49
+ "on the buddy page."
50
+ )
51
+
32
52
 
33
53
  def _refuse_beta(json_mode: bool) -> int:
34
54
  """Refuse a buddy command because the beta flag is off.
@@ -127,20 +147,75 @@ def _fail(message: str, json_mode: bool) -> int:
127
147
  return 1
128
148
 
129
149
 
150
+ def _check_voice(args) -> "int | None":
151
+ """Refuse an unknown ``--voice`` before anything is written or spent.
152
+
153
+ Early, and in every verb that takes one: the alternative is a bridge that
154
+ starts, connects, and then produces no audio at all — which in a screenless
155
+ channel is indistinguishable from a mic problem, an API outage, or the
156
+ buddy simply having nothing to say. The refusal carries the whole list,
157
+ because ten closed values are short enough to print and guessing is what
158
+ put the typo there.
159
+
160
+ Returns an exit code to propagate, or ``None`` when the voice is fine.
161
+ """
162
+ voice = getattr(args, "voice", "")
163
+ if not voice:
164
+ return None
165
+ try:
166
+ args.voice = realtime.validate_voice(voice)
167
+ except realtime.RealtimeError as exc:
168
+ return _fail(str(exc), getattr(args, "json", False))
169
+ return None
170
+
171
+
130
172
  def cmd_buddy_register(args) -> int:
131
173
  json_mode = getattr(args, "json", False)
174
+ refused = _check_voice(args)
175
+ if refused is not None:
176
+ return refused
177
+ # Read BEFORE the write: what changed is only knowable against the record
178
+ # that was there. Re-announcing a full registration over a one-word voice
179
+ # change reads like a second identity was created (#1017).
132
180
  try:
181
+ delta = identity.registration_delta(
182
+ args.name, model=args.model, voice=args.voice
183
+ )
133
184
  metadata = identity.register(args.name, model=args.model, voice=args.voice)
134
185
  except identity.BuddyError as exc:
135
186
  return _fail(str(exc), json_mode)
136
187
  status = identity.status(args.name)
188
+ changes = delta["changes"]
189
+ payload = {
190
+ "success": True,
191
+ "created": not delta["registered"],
192
+ "changes": changes,
193
+ "buddy": status,
194
+ "metadata": metadata,
195
+ }
196
+ if delta["registered"]:
197
+ lines = [
198
+ f"{field} → {change['to']}"
199
+ + (f" (was {change['from']})" if change["from"] else "")
200
+ for field, change in sorted(changes.items())
201
+ ]
202
+ return _emit(
203
+ payload,
204
+ json_mode,
205
+ [f"Voice buddy '{args.name}' is already registered."]
206
+ + [f" updated {line}" for line in lines]
207
+ + ([] if lines else [" nothing to change."]),
208
+ )
137
209
  return _emit(
138
- {"success": True, "buddy": status, "metadata": metadata},
210
+ payload,
139
211
  json_mode,
140
212
  [
141
213
  f"Registered voice buddy '{args.name}'.",
142
214
  f" inbox: {status['inbox_dir']}",
143
215
  f" spool: {status['spool_path']}",
216
+ f" voice: {status['realtime_voice'] or realtime.DEFAULT_VOICE} (default)"
217
+ if not status["realtime_voice"]
218
+ else f" voice: {status['realtime_voice']}",
144
219
  "",
145
220
  f"Other sessions can now reach it: agentwire msg send --to {args.name} ...",
146
221
  "It has no tmux session — its mail is spooled, not pasted.",
@@ -164,6 +239,8 @@ def cmd_buddy_status(args) -> int:
164
239
  f" role: {status['role']} (not in the fleet topology)",
165
240
  f" delivery: {status['delivery']} (spooled, no tmux pane)",
166
241
  f" registered: {status['registered_at']}",
242
+ f" voice: {status['realtime_voice'] or realtime.DEFAULT_VOICE}"
243
+ + ("" if status["realtime_voice"] else " (default)"),
167
244
  f" pending: {status['pending']} message(s) awaiting the next drain",
168
245
  f" unread: {status['unread']} spooled message(s)",
169
246
  ],
@@ -253,6 +330,9 @@ def cmd_buddy_mint(args) -> int:
253
330
  json_mode = getattr(args, "json", False)
254
331
  from .voice_layer import instructions as buddy_instructions
255
332
 
333
+ refused = _check_voice(args)
334
+ if refused is not None:
335
+ return refused
256
336
  if not identity.is_registered(args.name):
257
337
  return _fail(_no_buddy(args.name), json_mode)
258
338
  try:
@@ -260,7 +340,8 @@ def cmd_buddy_mint(args) -> int:
260
340
  instructions=buddy_instructions.build_instructions(),
261
341
  tools=tools.realtime_tool_defs(),
262
342
  model=args.model or realtime.DEFAULT_MODEL,
263
- voice=args.voice or realtime.DEFAULT_VOICE,
343
+ # Explicit flag → the buddy's recorded voice → the default.
344
+ voice=identity.resolve_voice(args.name, args.voice),
264
345
  )
265
346
  except realtime.RealtimeError as exc:
266
347
  return _fail(str(exc), json_mode)
@@ -280,6 +361,9 @@ def cmd_buddy_serve(args) -> int:
280
361
  """Serve the browser client on localhost until interrupted."""
281
362
  from .voice_layer import server
282
363
 
364
+ refused = _check_voice(args)
365
+ if refused is not None:
366
+ return refused
283
367
  if not identity.is_registered(args.name):
284
368
  return _fail(_no_buddy(args.name), getattr(args, "json", False))
285
369
  # Renew the fleet-alert lease (#982) — a buddy being started is a buddy that
@@ -294,6 +378,8 @@ def cmd_buddy_serve(args) -> int:
294
378
  args.name, port=args.port, model=args.model, voice=args.voice
295
379
  )
296
380
  print(f"buddy '{args.name}' listening on {url}")
381
+ print(f"voice: {identity.resolve_voice(args.name, args.voice)} "
382
+ f"(switch it on the page — no restart needed)")
297
383
  print("Open that URL in a browser and click Start talking. Ctrl-C to stop.")
298
384
  try:
299
385
  while True:
@@ -327,7 +413,7 @@ def register_buddy_parser(subparsers) -> None:
327
413
 
328
414
  reg = _common(sub.add_parser("register", help="Create the buddy's session identity"))
329
415
  reg.add_argument("--model", default="", help=f"Realtime model (default: {realtime.DEFAULT_MODEL})")
330
- reg.add_argument("--voice", default="", help=f"Realtime voice (default: {realtime.DEFAULT_VOICE})")
416
+ reg.add_argument("--voice", default="", metavar="VOICE", help=_VOICE_HELP)
331
417
  reg.set_defaults(func=beta_gated(cmd_buddy_register))
332
418
 
333
419
  _common(sub.add_parser("status", help="Show the buddy's identity and mail counts")).set_defaults(
@@ -359,12 +445,12 @@ def register_buddy_parser(subparsers) -> None:
359
445
 
360
446
  mint = _common(sub.add_parser("mint", help="Mint an ephemeral Realtime session"))
361
447
  mint.add_argument("--model", default="")
362
- mint.add_argument("--voice", default="")
448
+ mint.add_argument("--voice", default="", metavar="VOICE", help=_VOICE_HELP)
363
449
  mint.set_defaults(func=beta_gated(cmd_buddy_mint))
364
450
 
365
451
  srv = _common(sub.add_parser("serve", help="Serve the browser client on localhost"))
366
452
  srv.add_argument("--port", type=int, default=8788,
367
453
  help="Port on 127.0.0.1 (default: 8788 — never a portal port)")
368
454
  srv.add_argument("--model", default="")
369
- srv.add_argument("--voice", default="")
455
+ srv.add_argument("--voice", default="", metavar="VOICE", help=_VOICE_HELP)
370
456
  srv.set_defaults(func=beta_gated(cmd_buddy_serve))
@@ -304,10 +304,37 @@ def cmd_say(args) -> int:
304
304
  toast_ok = _post_desktop_notification(display, session=session, priority="normal",
305
305
  timeout=30) if display else None
306
306
 
307
+ def _record_spoken(heard: str, sink: str) -> None:
308
+ """Record what the owner ACTUALLY heard, for the voice layer (#1016).
309
+
310
+ Takes the heard text rather than reading `text` from the enclosing
311
+ scope, because on the local path those differ: `say` chunks, and a
312
+ failure on chunk 3 of 4 still played chunks 1 and 2 out loud. Recording
313
+ the whole string would claim the owner heard a sentence that never
314
+ played; recording nothing would let the buddy later offer, as news,
315
+ something they already heard. Both are the same defect — a record that
316
+ does not match the room.
317
+
318
+ This entry is NEVER announced to the buddy, whatever it said. The owner
319
+ already heard it; a voice channel that reads the audio back is the
320
+ two-surfaces problem made worse. What the record buys is the opposite —
321
+ the buddy can see what the fleet has already said and decline to offer
322
+ it as news.
323
+ """
324
+ if not heard.strip():
325
+ return
326
+ from agentwire import fleet_activity
327
+
328
+ try:
329
+ fleet_activity.note_spoke(heard, session=session or "", sink=sink)
330
+ except Exception: # noqa: BLE001 # speaking is the job; the record is not
331
+ pass
332
+
307
333
  def _say_result(rc: int, sink: str, clients: int = 0) -> int:
308
334
  """Report which sink actually received the audio (#444): browser
309
335
  (played by N connected clients), local speakers / OS voice, or a
310
- failed dispatch — instead of a blind "queued"."""
336
+ failed dispatch — instead of a blind "queued".
337
+ """
311
338
  if json_mode:
312
339
  _output_json({"success": rc == 0, "sink": sink if rc == 0 else None,
313
340
  "clients": clients, "session": session, "toast": toast_ok,
@@ -322,6 +349,9 @@ def cmd_say(args) -> int:
322
349
 
323
350
  if has_connections:
324
351
  rc = _remote_say(text, actual_session, portal_url)
352
+ # One dispatch, one outcome: the browser path is not chunked here.
353
+ if rc == 0:
354
+ _record_spoken(text, "browser")
325
355
  return _say_result(rc, "browser", clients)
326
356
 
327
357
  # No portal connections — chunk locally for better TTS quality
@@ -329,14 +359,19 @@ def cmd_say(args) -> int:
329
359
  chunks = chunk_text(text)
330
360
 
331
361
  last_sink = "os-voice"
362
+ spoken: list[str] = []
332
363
  for chunk in chunks:
333
364
  result, last_sink = _local_say_dispatch(
334
365
  chunk, voice, exaggeration, cfg_weight, tts_config,
335
366
  backend=backend, instructions=instructions, language=language, stream=stream
336
367
  )
337
368
  if result != 0:
369
+ # Partial: the chunks before this one PLAYED. Record exactly those.
370
+ _record_spoken(" ".join(spoken), last_sink)
338
371
  return _say_result(result, last_sink)
372
+ spoken.append(chunk)
339
373
 
374
+ _record_spoken(" ".join(spoken), last_sink)
340
375
  return _say_result(0, last_sink)
341
376
 
342
377
 
@@ -70,10 +70,12 @@ STALE_GRACE = 3600
70
70
  # silently disarms the guard.
71
71
  PENDING = "pending"
72
72
  REPORTED = "reported" # report collected, child killed
73
+ IDLE = "resolved_idle" # child went idle WITHOUT reporting (#952) — the idle
74
+ # handler's synthetic placeholder arrived, no report did
73
75
  TIMEOUT = "timeout" # deadline hit with no report; child killed anyway
74
76
  GONE = "gone" # child's session vanished before it reported
75
77
 
76
- RESOLVED_STATES = (REPORTED, TIMEOUT, GONE)
78
+ RESOLVED_STATES = (REPORTED, IDLE, TIMEOUT, GONE)
77
79
 
78
80
  # Topologies, which decide whether resolving a child also tears its session
79
81
  # down. A `main`-topology child (`agentwire new`) is the leak this issue is
@@ -100,6 +102,14 @@ WORKTREE = "worktree"
100
102
  # tests/unit/test_voice_kind.py::TestCohortInteraction.
101
103
  REPORT_KINDS = ("done", "request", "escalation", "note")
102
104
 
105
+ # The idle handler's synthetic placeholder kind (#952). Harvested so the child
106
+ # still RESOLVES promptly, but never counted as a report: a placeholder means
107
+ # "the child went idle without reporting", and `wait` says exactly that
108
+ # (state IDLE) instead of flattening it into `reported`. The discriminator is
109
+ # the KIND, deliberately not the message text — a sentinel string is defeated
110
+ # by any child that happens to write the same words as its genuine report.
111
+ IDLE_KIND = "idle"
112
+
103
113
  _POLL_INTERVAL = 2.0
104
114
 
105
115
 
@@ -314,7 +324,7 @@ def _harvest(parent: str) -> dict[str, list]:
314
324
 
315
325
  out: dict[str, list] = {}
316
326
  for msg in inbox.list_messages(parent):
317
- if msg.kind in REPORT_KINDS:
327
+ if msg.kind in REPORT_KINDS or msg.kind == IDLE_KIND:
318
328
  out.setdefault(msg.sender, []).append(msg)
319
329
  return out
320
330
  except Exception:
@@ -361,9 +371,21 @@ def collect(parent: str) -> dict | None:
361
371
  for child in outstanding:
362
372
  msgs = reports.get(child)
363
373
  if msgs:
364
- _mark(data, child, REPORTED, _consume(msgs))
374
+ # A slot holding ONLY the idle handler's synthetic placeholder is
375
+ # not a report (#952): the child went idle without saying anything.
376
+ # Any genuine report kind alongside it wins — the child both
377
+ # reported and idled, which is the normal happy path.
378
+ real = [m for m in msgs if m.kind in REPORT_KINDS]
379
+ placeholders = [m for m in msgs if m.kind == IDLE_KIND]
380
+ if real:
381
+ text = _consume(real)
382
+ _consume(placeholders) # clear the files, drop the synthetic text
383
+ _mark(data, child, REPORTED, text)
384
+ log_event("collected", parent=parent, child=child)
385
+ else:
386
+ _mark(data, child, IDLE, _consume(placeholders))
387
+ log_event("child_idle_no_report", parent=parent, child=child)
365
388
  _teardown(data, child)
366
- log_event("collected", parent=parent, child=child)
367
389
  elif not session_exists(child):
368
390
  _mark(data, child, GONE)
369
391
  log_event("child_gone", parent=parent, child=child)
@@ -405,12 +427,17 @@ def summarize(data: dict) -> dict:
405
427
  "pending": [c["session"] for c in children if c.get("state") == PENDING],
406
428
  "reports": [{"session": c["session"], "report": c.get("report")}
407
429
  for c in children if c.get("state") == REPORTED],
430
+ # Resolved without a report (#952) — the child idled and the only
431
+ # thing in its slot was the idle handler's placeholder. Silence is a
432
+ # legitimate outcome; being counted as a report is not.
433
+ "idle": [{"session": c["session"], "report": c.get("report")}
434
+ for c in children if c.get("state") == IDLE],
408
435
  "failed": [{"session": c["session"], "state": c.get("state")}
409
436
  for c in children if c.get("state") in (TIMEOUT, GONE)],
410
437
  # Resolved but deliberately still running: worktree children, whose
411
438
  # branch/PR teardown follows merge verification (#756).
412
439
  "left_alive": [c["session"] for c in children
413
- if c.get("state") in (REPORTED, TIMEOUT)
440
+ if c.get("state") in (REPORTED, IDLE, TIMEOUT)
414
441
  and c.get("torn_down") is False],
415
442
  "children": children,
416
443
  }
@@ -432,8 +459,8 @@ def wait(parent: str, timeout: float = 600.0,
432
459
  data = load(parent)
433
460
  if not data:
434
461
  return {"parent": parent, "cohort": False, "resolved": True,
435
- "pending": [], "reports": [], "failed": [], "left_alive": [],
436
- "children": []}
462
+ "pending": [], "reports": [], "idle": [], "failed": [],
463
+ "left_alive": [], "children": []}
437
464
 
438
465
  deadline = time.time() + max(timeout, 0)
439
466
  while True:
@@ -442,7 +469,8 @@ def wait(parent: str, timeout: float = 600.0,
442
469
  if not result["pending"]:
443
470
  discard(parent)
444
471
  log_event("resolved", parent=parent,
445
- reported=len(result["reports"]), failed=len(result["failed"]))
472
+ reported=len(result["reports"]), idle=len(result["idle"]),
473
+ failed=len(result["failed"]))
446
474
  return {**result, "cohort": True, "resolved": True}
447
475
  if time.time() >= deadline:
448
476
  return {**result, "cohort": True, "resolved": False}
@@ -1010,11 +1010,14 @@ def load_config(config_path: Optional[Path] = None) -> Config:
1010
1010
  # Apply environment variable overrides
1011
1011
  data = _apply_env_overrides(data)
1012
1012
 
1013
- # Debug logging for STT config
1013
+ # Debug logging for STT config. DEBUG, not INFO (#1018): config loading is
1014
+ # not an event anyone asked to be told about, and at INFO it printed on
1015
+ # ordinary CLI commands the moment anything in the process configured the
1016
+ # root logger.
1014
1017
  import logging
1015
1018
  logger = logging.getLogger(__name__)
1016
1019
  if 'stt' in data:
1017
- logger.info(f"STT config after env overrides: {data['stt']}")
1020
+ logger.debug(f"STT config after env overrides: {data['stt']}")
1018
1021
 
1019
1022
  return _dict_to_config(data)
1020
1023