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.
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/workflows/pytest.yml +13 -4
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/PKG-INFO +2 -2
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/__init__.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/__main__.py +2 -1
- agentwire_dev-1.71.0/agentwire/activity_cli.py +86 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/beta.py +13 -2
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/buddy_cli.py +91 -5
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels_cli.py +36 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/cohort.py +36 -8
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/config.py +5 -2
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/core.py +160 -19
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/doctor_cli.py +44 -4
- agentwire_dev-1.71.0/agentwire/fleet_activity.py +563 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/fleet_alerts.py +54 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/audit_logger.py +114 -3
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +1844 -105
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +1829 -107
- agentwire_dev-1.71.0/agentwire/hooks/damage-control/mcp-tool-damage-control.py +4890 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/read-tool-damage-control.py +1821 -102
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +12 -7
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/git.yaml +9 -0
- agentwire_dev-1.71.0/agentwire/hooks/damage-control/rules/mcp-tools.yaml +84 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/payloads.yaml +16 -0
- agentwire_dev-1.71.0/agentwire/hooks/damage-control/rules/remote.yaml +49 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +1821 -102
- agentwire_dev-1.71.0/agentwire/hooks/outcome_logger.py +89 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks_cli.py +55 -17
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/inbox.py +121 -37
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/limits_cli.py +19 -5
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_channels.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_chrome.py +2 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_core.py +66 -78
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_council.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_handoff.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_history.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_listen.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_lock.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_machine.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_msg.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_notify.py +16 -8
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_pane.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_projects.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_scheduler.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_scratchpad.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_server.py +2 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_services.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_session.py +6 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_status.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_task.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_tunnels.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_voice.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_worktree.py +1 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/msg_cli.py +31 -6
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/notify_cli.py +68 -5
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/pane_cli.py +26 -3
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/prompt_router.py +9 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/agentwire.md +2 -2
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/desktop.py +5 -0
- 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
- agentwire_dev-1.71.0/agentwire/safety/audit.py +157 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety/lint.py +8 -2
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety/rule_baselines.json +10 -2
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety_cli.py +18 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety_commands.py +164 -30
- agentwire_dev-1.71.0/agentwire/safety_notify.py +389 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/report.py +27 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/server.py +16 -8
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/services.py +68 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/session_cli.py +89 -6
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/css/desktop.css +14 -0
- agentwire_dev-1.71.0/agentwire/static/js/dead-key-residue.js +63 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/desktop.js +12 -19
- agentwire_dev-1.71.0/agentwire/static/js/hotkeys.js +38 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/scratchpad.js +4 -14
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/service-classification.js +1 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-hud-controller.js +6 -4
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-hud.js +4 -14
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar.js +4 -15
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/terminal-pane.js +14 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/topology-render.js +24 -2
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/git.yaml +14 -2
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/client.py +372 -48
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/confirm.py +427 -48
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/identity.py +104 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/instructions.py +22 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/realtime.py +115 -4
- agentwire_dev-1.71.0/agentwire/voice_layer/relay.py +192 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/server.py +78 -7
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/surface.py +15 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/tools.py +234 -3
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/write_tools.py +25 -7
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/wait_cli.py +12 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/damage-control.md +110 -28
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/fan-out-cohorts.md +10 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/messaging.md +56 -3
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/worktree-sessions.md +10 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/voice-layer.md +342 -2
- agentwire_dev-1.71.0/scratch-remove-docker-daemons.sh +12 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/conftest.py +42 -0
- agentwire_dev-1.71.0/tests/fixtures/hotkeys_harness.mjs +123 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_send_verified_tmux.py +4 -3
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_tmux_name_rewrite.py +18 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_worktree_cmd.py +3 -0
- agentwire_dev-1.71.0/tests/unit/test_audit_attribution.py +266 -0
- agentwire_dev-1.71.0/tests/unit/test_audit_outcomes.py +152 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_beta_flag.py +48 -159
- agentwire_dev-1.71.0/tests/unit/test_brace_expansion_zero_access.py +62 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_cli_smoke.py +15 -12
- agentwire_dev-1.71.0/tests/unit/test_cli_stderr_clean.py +232 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_cohort.py +72 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_damage_control_bypass.py +5 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_damage_control_hooks.py +89 -65
- agentwire_dev-1.71.0/tests/unit/test_damage_control_inert_view.py +150 -0
- agentwire_dev-1.71.0/tests/unit/test_damage_control_operation_pinning.py +297 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_damage_control_payload_anchoring.py +261 -183
- agentwire_dev-1.71.0/tests/unit/test_fleet_activity.py +750 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_hooks_install.py +53 -0
- agentwire_dev-1.71.0/tests/unit/test_hotkeys_js.py +37 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_inbox.py +91 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_limits_tick_isolation.py +24 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_mcp_server.py +63 -13
- agentwire_dev-1.71.0/tests/unit/test_mcp_tool_policy.py +230 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_mcp_tools_args.py +26 -9
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_msg_cli.py +58 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_notify_cli.py +36 -0
- agentwire_dev-1.71.0/tests/unit/test_payload_position.py +55 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_pip_audit_report.py +0 -23
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_portal_api.py +24 -5
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_prompt_router.py +0 -21
- agentwire_dev-1.71.0/tests/unit/test_prose_operands.py +69 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_restart_cli.py +0 -5
- agentwire_dev-1.71.0/tests/unit/test_rm_recoverable.py +262 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_commands.py +23 -3
- agentwire_dev-1.71.0/tests/unit/test_safety_coverage_wave.py +466 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_deployment.py +6 -3
- agentwire_dev-1.71.0/tests/unit/test_safety_engine_is_standalone.py +32 -0
- agentwire_dev-1.71.0/tests/unit/test_safety_notify.py +459 -0
- agentwire_dev-1.71.0/tests/unit/test_sed_script_is_data.py +62 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_services.py +59 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_session_metadata_ssot.py +5 -0
- agentwire_dev-1.71.0/tests/unit/test_tmux_template.py +26 -0
- agentwire_dev-1.71.0/tests/unit/test_unattended_allow.py +388 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_unattended_scoped_allow.py +181 -2
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_announcer.py +207 -669
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_body_delivery.py +0 -27
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_confirm.py +295 -162
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_epoch.py +1 -37
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_fleet_alerts.py +5 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_kind.py +0 -121
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_layer.py +140 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_persona.py +30 -0
- agentwire_dev-1.71.0/tests/unit/test_voice_picker.py +553 -0
- agentwire_dev-1.71.0/tests/unit/test_voice_relay_full_text.py +472 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_surface.py +0 -23
- agentwire_dev-1.71.0/tests/unit/test_voice_ux_1048.py +561 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_window_cycling_binding.py +4 -1
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree_dot_project.py +14 -14
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree_git_truth.py +147 -0
- agentwire_dev-1.71.0/tests/unit/test_zero_access_member_access.py +59 -0
- agentwire_dev-1.71.0/tools/nonce_stt_probe.py +125 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tools/voice_heal_probe.py +47 -11
- agentwire_dev-1.69.0/agentwire/hooks/damage-control/rules/remote.yaml +0 -81
- agentwire_dev-1.69.0/agentwire/safety/_core.py +0 -2821
- agentwire_dev-1.69.0/agentwire/static/js/dead-key-suppressor.js +0 -53
- agentwire_dev-1.69.0/tests/fixtures/main_mcp_tools.json +0 -110
- agentwire_dev-1.69.0/tests/fixtures/main_roles/agentwire.md +0 -83
- agentwire_dev-1.69.0/tests/fixtures/main_roles/orchestrator.md +0 -93
- agentwire_dev-1.69.0/tests/fixtures/main_roles/worker-worktree.md +0 -39
- agentwire_dev-1.69.0/tests/fixtures/main_roles/worker.md +0 -39
- agentwire_dev-1.69.0/tests/unit/test_tmux_template.py +0 -73
- agentwire_dev-1.69.0/tests/unit/test_voice_wiki_accuracy.py +0 -818
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.agentwire.yml.example +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.claude/commands/handoff.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.claude/skills/wiki/SKILL.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/FUNDING.yml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/workflows/ruff.yml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/workflows/security.yml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.github/workflows/tts-smoke.yml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/.gitignore +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/AGENTS.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/CODE_OF_CONDUCT.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/CONTRIBUTING.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/Dockerfile.local +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/LICENSE +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/README.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/RELEASING.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/SECURITY.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/SPONSORS.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/agents/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/agents/base.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/agents/tmux.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/alerts_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/auth_expired.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/cached_status.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels/base.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels/email.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels/push.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/channels/quo.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/chrome_tabs.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/completion.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/config_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/inbox.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/minutes.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/state.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/council/view.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/devices.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/diff_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/doctor_voice.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/ensure_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/fetch.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/git_state.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/instructions.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/parser.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/renderer.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff/schema.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/handoff_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/history.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/history_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/history_migrate.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/agentwire-permission.sh +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/control-plane.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/outbound.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/damage-control/rules/publish.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/idle-handler.sh +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/hooks/queue-processor.sh +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/listen.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/locking.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/machine_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_desktop.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/mcp_wiki.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/network.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/onboarding.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/palette_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/pane_manager.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/portal_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/project_config.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/projects.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/prompts_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/push_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/push_store.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/repo_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/research.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/restart_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/role_prompts.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/anchor.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/chatbot.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/contributor.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/correspondent.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-brain.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-conscience.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-critic.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-devils-advocate.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-gut.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-historian.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-member.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/council-orchestrator.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/init.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/notifications.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/orchestrator.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/reviewer-worktree.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/reviewer.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/shared-checkout.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/soul.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/task-runner.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/voice.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/worker-worktree.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles/worker.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/roles_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/artifacts.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/config.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/council.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/history.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/machines.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/notify.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/palette.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/permission.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/projects.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/push.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/safety.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/scheduler.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/scratchpad.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/sessions.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/sessions_admin.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/routes/voice.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/safety/provenance.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/dispatch.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/gates.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/loop.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/models.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/schedule.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/state.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler/zombie.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scheduler_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/scratchpad.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/security.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/send_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/session_context.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/session_ready.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/ssh.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/announcements.json +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/apple-touch-icon.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/css/mobile.css +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/favicon-32.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/favicon-64.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/bear.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/cat.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/crown.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/custom/agentwire-portal.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/custom/agentwire-tts.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/custom/agentwire.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/deer.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/drone.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/eagle.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/fox.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/hawk.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/horse.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/lion.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/rabbit.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/robot.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/tiger.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/icons/sessions/wolf.webp +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/img/icon-192.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/img/icon-512.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/.gitkeep +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/announcement-modal.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/api.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/artifact-window.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/card-terminal.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/collage.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/command-palette.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/council-window.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/desktop-manager.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/help-modal.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/icon-manager.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/lineage.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/mobile.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/notification-prefs.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/notifications-panel.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/ptt.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/push-client.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/review-window.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/safety-shared.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/safety-window.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-hud-notices.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-hud-spawn.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-id.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/session-window.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/shortcuts.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/config-section.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/council-section.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/services-section.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/sidebar/sessions-section.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/spawn-ghost.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/tile-manager.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/toast.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/token-modal.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/utils/ansi.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/utils/rich-text.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/utils/swipe.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/voice/autosend-prefs.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/voice/browser-stt.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/voice/browser-tts.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/voice/jargon.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/voice/prompt.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/js/workspace-window.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/manifest.webmanifest +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/service-worker.js +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/static/topology-harness.html +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/base.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/cloud.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/engine.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/local.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/server_backend.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/stt/stt_server.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/system_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tabs_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tasks.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tasks_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/base.html +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/council/minutes.html.j2 +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/desktop.html +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/email_notification.html +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/mobile.html +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/pair.html +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/statusline.sh +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templates/tmux.conf +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/templating.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/aws.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/docker.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/gcp.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/gh.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/gws.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/kubectl.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/npm.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/terraform.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tooldefs/uv.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/audio.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/base.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/engines/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/engines/chatterbox.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/engines/kokoro.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/engines/zonos.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/kokoro_server.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/local.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts/registry.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tts_server.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tunnels.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/tunnels_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/usage_limit.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/chunker.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/event_log.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/file_io.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/paths.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/speech.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/utils/subprocess.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/validation.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/__init__.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/delivery.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/outbox.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_layer/transcript.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/voice_status.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/wiki.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/wiki_audit.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/wiki_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/worktree.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/worktree_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/agentwire/worktree_registry.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/decisions/obsidian-second-brain.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/design/session-card-fields.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/design/session-card-recommendation.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/logo.png +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/INDEX.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/architecture.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/auth-expired.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/briefing-mode.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/communication/channels.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/communication/hammerspoon.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/communication/handoff.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/concepts.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/council.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/deployment/remote-access.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/deployment/remote-machines.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/glossary.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/parallel-refactor.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/portal.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/session-topology.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/shell-escaping.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/troubleshooting.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/internals/window-collage.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/quickstart.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/research/briefing-mode-feasibility.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/research/orchestration-transport-alternatives.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/security/damage-control-hardening.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/security/pip-audit.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/security/remote-access-hardening.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/security/secrets.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/services.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/conversation-identity.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/heal-line-count-cliff.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/helper-sessions.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/prompt-routing.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/sessions/window-sizing.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/usage-limit-recovery.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/voice/shim-contract.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/voice/stt-cloud.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/voice/stt-self-hosted.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/docs/wiki/voice/tts-self-hosted.md +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/pyproject.toml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/e2e/test_portal_ui.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/fixtures/sample_agentwire.yml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/fixtures/sample_config.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/fixtures/sample_scheduler.yaml +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/home_guard.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_council_portal.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_scheduler_board.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/integration/test_server_websockets.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/page_slice.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_announcements.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_auth_expired.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_auth_expired_dispatch.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_buddy_restart.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_build_agent_command.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_channels.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_chrome_tabs.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_cli_commands.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_cli_output.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_client_wires.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_config.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_config_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_control_plane_protection.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_core_created_by_rooting.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_council_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_council_inbox.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_council_minutes.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_council_state.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_council_view.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_damage_control_sync.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_dangling_worktrees.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_devices.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_diff_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_doctor_orphaned_history.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_doctor_scheduler_staleness.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_doctor_secrets_perms.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_doctor_task_migration.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_doctor_voice.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_ensure_shared_dir.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_ensure_verified_prompt.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_event_log.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_file_io.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_fleet_alerts.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_guarded_launch_command.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_handoff_git_state.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_handoff_instructions.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_handoff_parser.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_handoff_renderer.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_helper_session.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_history.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_history_migrate.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_history_migrate_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_history_resume_name.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_home_isolation.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_idle_handler.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_idle_nag.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_init_command.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_install_parity.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_launch_line_reentry.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_launch_via_env.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_locking.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_onboarding_reinit.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_owner_only_writes.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_palette_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_pending_message_visibility.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_pip_environment.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_posture_default.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_project_config.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_projects_registry.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_prompt_router_resume.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_push.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_rebuild_guard.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_remote_session_record.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_repo_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_rich_text_js.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_role_prompt_retention.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_role_prompt_sweep_wiring.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_roles.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_routes_snapshot.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_disabled_rules.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_escape_hatch.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_heal.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_safety_kill_switch.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_scheduler.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_scheduler_liveness.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_scheduler_parsing.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_scheduler_zombie.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_scratchpad.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_security.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_server_async.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_server_pure.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_services_command.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_session_context.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_session_created_by_env.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_session_metadata_write.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_session_ready.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_shared_dir_guard.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_shim_selfheal.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_skill_install.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_speech_tags.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_ssh.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_stt_backend.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_stt_cloud.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_stt_engine.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_task_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_task_max_duration.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tasks.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tasks_cli.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_templating.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_terminal_resize.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tmux_session_cwd.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tts_engine_resolution.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tts_local.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_tunnels_probe.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_unattended_env_isolation.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_usage_limit.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_validation.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_bridge_host.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_outbox.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_voice_status.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_wiki.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_wiki_audit.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree_branch_cleanup.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree_layout.py +0 -0
- {agentwire_dev-1.69.0 → agentwire_dev-1.71.0}/tests/unit/test_worktree_registry.py +0 -0
- {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
|
-
#
|
|
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
|
-
|
|
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.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: agentwire-dev
|
|
3
|
-
Version: 1.
|
|
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
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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="",
|
|
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
|
-
|
|
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": [], "
|
|
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"]),
|
|
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.
|
|
1020
|
+
logger.debug(f"STT config after env overrides: {data['stt']}")
|
|
1018
1021
|
|
|
1019
1022
|
return _dict_to_config(data)
|
|
1020
1023
|
|