agentwire-dev 1.51.0__tar.gz → 1.53.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.51.0 → agentwire_dev-1.53.0}/.github/workflows/security.yml +3 -3
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.gitignore +3 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/CONTRIBUTING.md +10 -20
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/Dockerfile.local +2 -2
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/PKG-INFO +21 -12
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/README.md +16 -11
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/__init__.py +1 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/__main__.py +3 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/agents/tmux.py +3 -3
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/channels_cli.py +4 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/completion.py +0 -232
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/config.py +7 -0
- agentwire_dev-1.53.0/agentwire/config_cli.py +318 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/core.py +184 -15
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/doctor_cli.py +13 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/history.py +0 -30
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/idle-handler.sh +9 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/inbox.py +89 -13
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/limits_cli.py +131 -24
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/listen.py +67 -26
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/locking.py +0 -24
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_desktop.py +4 -11
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_voice.py +2 -9
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/notify_cli.py +38 -6
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/onboarding.py +72 -11
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/pane_cli.py +97 -81
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/pane_manager.py +0 -70
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/portal_cli.py +0 -43
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/prompt_router.py +81 -11
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/config.py +2 -2
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/desktop.py +13 -26
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/notify.py +4 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/permission.py +26 -34
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/sessions.py +11 -16
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/sessions_admin.py +22 -33
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/voice.py +17 -9
- agentwire_dev-1.53.0/agentwire/scheduler/__init__.py +111 -0
- agentwire_dev-1.53.0/agentwire/scheduler/dispatch.py +773 -0
- agentwire_dev-1.53.0/agentwire/scheduler/gates.py +146 -0
- agentwire_dev-1.53.0/agentwire/scheduler/loop.py +209 -0
- agentwire_dev-1.53.0/agentwire/scheduler/models.py +179 -0
- agentwire_dev-1.53.0/agentwire/scheduler/report.py +259 -0
- agentwire_dev-1.53.0/agentwire/scheduler/schedule.py +362 -0
- agentwire_dev-1.53.0/agentwire/scheduler/state.py +233 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/security.py +165 -4
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/send_cli.py +3 -3
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/server.py +347 -146
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/session_cli.py +35 -146
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/session_context.py +0 -23
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/session_ready.py +46 -20
- agentwire_dev-1.53.0/agentwire/static/apple-touch-icon.png +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/css/desktop.css +31 -0
- agentwire_dev-1.53.0/agentwire/static/favicon-32.png +0 -0
- agentwire_dev-1.53.0/agentwire/static/favicon-64.png +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/artifact-window.js +21 -24
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/desktop.js +46 -89
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/mobile.js +30 -93
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/notifications-panel.js +62 -2
- agentwire_dev-1.53.0/agentwire/static/js/ptt.js +148 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/session-window.js +75 -132
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/stt/__init__.py +19 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/system_cli.py +63 -39
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/templates/base.html +3 -2
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/templates/mobile.html +1 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/templates/pair.html +1 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts/engines/kokoro.py +29 -6
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts_cli.py +48 -19
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/usage_limit.py +8 -2
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/utils/paths.py +0 -11
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/validation.py +1 -117
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/voiceclone.py +64 -49
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/worktree.py +0 -50
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/communication/hammerspoon.md +1 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/quickstart.md +15 -8
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/sessions/messaging.md +11 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/sessions/prompt-routing.md +14 -3
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/usage-limit-recovery.md +15 -8
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/pyproject.toml +10 -6
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_cli_commands.py +4 -2
- agentwire_dev-1.53.0/tests/unit/test_config_cli.py +181 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_inbox.py +246 -28
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_init_command.py +3 -2
- agentwire_dev-1.53.0/tests/unit/test_install_parity.py +161 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_mcp_server.py +24 -21
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_msg_cli.py +8 -2
- agentwire_dev-1.53.0/tests/unit/test_notify_cli.py +95 -0
- agentwire_dev-1.53.0/tests/unit/test_onboarding_reinit.py +91 -0
- agentwire_dev-1.53.0/tests/unit/test_pip_environment.py +58 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_portal_api.py +271 -34
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_rebuild_guard.py +103 -3
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_scheduler.py +1 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_security.py +107 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_server_async.py +4 -4
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_session_ready.py +145 -12
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_stt_backend.py +21 -1
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_tts_local.py +30 -8
- agentwire_dev-1.51.0/agentwire/scheduler.py +0 -2090
- agentwire_dev-1.51.0/agentwire/static/favicon.png +0 -0
- agentwire_dev-1.51.0/agentwire/voices/darren.wav +0 -0
- agentwire_dev-1.51.0/agentwire/voices/default.wav +0 -0
- agentwire_dev-1.51.0/agentwire/voices/jessica.wav +0 -0
- agentwire_dev-1.51.0/agentwire/voices/lisa.wav +0 -0
- agentwire_dev-1.51.0/agentwire/voices/may.wav +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.agentwire.yml.example +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.claude/commands/handoff.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.claude/skills/wiki/SKILL.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.github/FUNDING.yml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.github/workflows/pytest.yml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.github/workflows/ruff.yml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/.github/workflows/tts-smoke.yml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/AGENTS.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/CODE_OF_CONDUCT.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/LICENSE +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/RELEASING.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/SECURITY.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/SPONSORS.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/agents/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/agents/base.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/cached_status.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/channels/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/channels/base.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/channels/email.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/channels/push.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/channels/quo.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/council/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/council/cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/council/inbox.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/council/state.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/council/view.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/devices.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/diff_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/doctor_voice.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/ensure_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/fetch.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/handoff/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/handoff/git_state.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/handoff/instructions.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/handoff/parser.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/handoff/renderer.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/handoff/schema.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/handoff_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/history_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/agentwire-permission.sh +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/audit_logger.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/mcp-tool-damage-control.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/read-tool-damage-control.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/control-plane.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/outbound.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/publish.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks/queue-processor.sh +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/hooks_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/machine_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_channels.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_core.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_council.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_handoff.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_history.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_listen.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_lock.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_machine.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_msg.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_notify.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_pane.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_projects.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_scheduler.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_scratchpad.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_server.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_services.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_session.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_status.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_task.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_tunnels.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_voiceclone.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_wiki.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/mcp_worktree.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/msg_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/network.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/project_config.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/projects.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/prompts_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/push_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/push_store.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/repo_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/research.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/agentwire.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/anchor.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/chatbot.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/contributor.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/correspondent.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/council-brain.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/council-conscience.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/council-critic.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/council-devils-advocate.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/council-gut.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/council-historian.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/council-member.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/council-orchestrator.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/init.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/notifications.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/orchestrator.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/soul.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/task-runner.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/voice.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/worker.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles/worktree-session.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/roles_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/artifacts.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/council.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/history.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/machines.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/projects.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/push.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/safety.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/scheduler.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/routes/scratchpad.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/safety/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/safety/_core.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/safety_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/safety_commands.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/scheduler_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/scratchpad.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/services.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/ssh.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/announcements.json +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/css/mobile.css +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/bear.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/cat.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/crown.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/custom/agentwire-portal.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/custom/agentwire-tts.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/custom/agentwire.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/deer.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/drone.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/eagle.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/fox.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/hawk.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/horse.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/lion.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/rabbit.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/robot.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/tiger.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/icons/sessions/wolf.webp +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/img/icon-192.png +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/img/icon-512.png +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/.gitkeep +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/announcement-modal.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/api.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/collage.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/command-palette.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/council-window.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/dead-key-suppressor.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/desktop-manager.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/help-modal.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/icon-manager.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/notification-prefs.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/push-client.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/review-window.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/safety-shared.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/safety-window.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/scratchpad.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/service-classification.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/session-id.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/shortcuts.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/sidebar/config-section.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/sidebar/council-section.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/sidebar/services-section.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/sidebar/sessions-section.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/sidebar.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/tile-manager.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/toast.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/token-modal.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/utils/ansi.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/utils/swipe.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/voice/autosend-prefs.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/voice/browser-stt.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/voice/browser-tts.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/voice/jargon.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/voice/prompt.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/manifest.webmanifest +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/static/service-worker.js +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/stt/base.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/stt/cloud.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/stt/engine.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/stt/local.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/stt/server_backend.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/stt/stt_server.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tasks.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/templates/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/templates/desktop.html +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/templates/email_notification.html +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/templates/tmux.conf +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/templating.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tooldefs/aws.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tooldefs/docker.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tooldefs/gcp.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tooldefs/gh.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tooldefs/git.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tooldefs/gws.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tooldefs/kubectl.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tooldefs/npm.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tooldefs/terraform.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tooldefs/uv.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts/audio.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts/base.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts/engines/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts/engines/chatterbox.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts/engines/zonos.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts/kokoro_server.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts/local.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts/registry.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tts_server.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tunnels.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/tunnels_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/utils/__init__.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/utils/chunker.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/utils/event_log.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/utils/file_io.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/utils/speech.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/utils/subprocess.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/voice_status.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/wiki.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/wiki_audit.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/wiki_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/agentwire/worktree_registry.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/decisions/obsidian-second-brain.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/logo.png +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/INDEX.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/architecture.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/briefing-mode.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/communication/channels.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/communication/handoff.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/concepts.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/council.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/deployment/remote-access.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/deployment/remote-machines.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/glossary.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/internals/damage-control.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/internals/parallel-refactor.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/internals/portal.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/internals/shell-escaping.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/internals/troubleshooting.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/internals/window-collage.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/research/briefing-mode-feasibility.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/research/orchestration-transport-alternatives.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/security/damage-control-hardening.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/security/pip-audit.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/security/remote-access-hardening.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/security/secrets.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/services.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/sessions/pi.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/sessions/window-sizing.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/sessions/worktree-sessions.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/voice/shim-contract.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/voice/stt-cloud.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/voice/stt-self-hosted.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/docs/wiki/voice/tts-self-hosted.md +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/conftest.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/e2e/test_portal_ui.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/fixtures/sample_agentwire.yml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/fixtures/sample_config.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/fixtures/sample_scheduler.yaml +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/integration/test_council_portal.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/integration/test_scheduler_board.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/integration/test_send_verified_tmux.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/integration/test_server_websockets.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/integration/test_worktree_cmd.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_announcements.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_build_agent_command.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_channels.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_cli_output.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_cli_smoke.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_config.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_control_plane_protection.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_council_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_council_inbox.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_council_state.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_council_view.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_damage_control_bypass.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_damage_control_hooks.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_damage_control_sync.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_devices.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_diff_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_doctor_voice.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_event_log.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_file_io.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_handoff_git_state.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_handoff_instructions.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_handoff_parser.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_handoff_renderer.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_history.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_hooks_install.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_idle_handler.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_idle_nag.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_limits_tick_isolation.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_locking.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_mcp_tools_args.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_project_config.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_prompt_router.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_push.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_repo_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_roles.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_routes_snapshot.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_safety_commands.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_safety_disabled_rules.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_safety_escape_hatch.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_safety_heal.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_safety_kill_switch.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_scheduler_parsing.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_scratchpad.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_server_pure.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_services.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_session_context.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_shared_dir_guard.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_skill_install.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_speech_tags.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_ssh.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_stt_cloud.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_stt_engine.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_task_cli.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_tasks.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_templating.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_terminal_resize.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_tmux_template.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_tts_engine_resolution.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_tunnels_probe.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_usage_limit.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_validation.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_voice_status.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_wiki.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_wiki_audit.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_worktree.py +0 -0
- {agentwire_dev-1.51.0 → agentwire_dev-1.53.0}/tests/unit/test_worktree_registry.py +0 -0
|
@@ -55,7 +55,7 @@ jobs:
|
|
|
55
55
|
# asserts), and we fail only on high-severity high-confidence findings.
|
|
56
56
|
# Green on the clean tree today; red only on NEW genuinely-dangerous code.
|
|
57
57
|
- name: Run bandit
|
|
58
|
-
run: uvx bandit -c pyproject.toml -r agentwire --severity-level high --confidence-level high
|
|
58
|
+
run: uvx bandit==1.9.4 -c pyproject.toml -r agentwire --severity-level high --confidence-level high
|
|
59
59
|
|
|
60
60
|
pip-audit:
|
|
61
61
|
name: pip-audit (advisory)
|
|
@@ -87,7 +87,7 @@ jobs:
|
|
|
87
87
|
# chatterbox-tts relax the ceiling. See docs/wiki/security/pip-audit.md.
|
|
88
88
|
- name: Audit runtime dependencies
|
|
89
89
|
run: >
|
|
90
|
-
uvx pip-audit -r requirements.txt
|
|
90
|
+
uvx pip-audit==2.10.1 -r requirements.txt
|
|
91
91
|
--ignore-vuln PYSEC-2026-161
|
|
92
92
|
--ignore-vuln CVE-2026-48818
|
|
93
93
|
--ignore-vuln CVE-2026-48817
|
|
@@ -101,4 +101,4 @@ jobs:
|
|
|
101
101
|
run: uv export --no-emit-project --all-extras --format requirements-txt -o requirements-all.txt
|
|
102
102
|
- name: Full audit (weekly cron, optional extras)
|
|
103
103
|
if: github.event_name == 'schedule'
|
|
104
|
-
run: uvx pip-audit -r requirements-all.txt
|
|
104
|
+
run: uvx pip-audit==2.10.1 -r requirements-all.txt
|
|
@@ -25,16 +25,21 @@ Add it automatically with `git commit -s` (use your real name and an email that
|
|
|
25
25
|
git clone https://github.com/dotdevdotdev/agentwire-dev.git
|
|
26
26
|
cd agentwire-dev
|
|
27
27
|
|
|
28
|
-
# Install
|
|
29
|
-
uv
|
|
28
|
+
# Install dependencies into a project venv (creates .venv automatically)
|
|
29
|
+
uv sync --extra dev
|
|
30
|
+
|
|
31
|
+
# Run the test suite
|
|
32
|
+
uv run pytest
|
|
30
33
|
|
|
31
34
|
# Run in development mode (picks up code changes instantly)
|
|
32
|
-
agentwire portal start --dev
|
|
35
|
+
uv run agentwire portal start --dev
|
|
33
36
|
|
|
34
|
-
# After
|
|
35
|
-
|
|
37
|
+
# After changing pyproject.toml or adding files, re-sync
|
|
38
|
+
uv sync --extra dev
|
|
36
39
|
```
|
|
37
40
|
|
|
41
|
+
If you also have agentwire installed as a tool (`uv tool install agentwire-dev`) and want that install to pick up your source changes, run `agentwire rebuild` (reinstalls from your checkout).
|
|
42
|
+
|
|
38
43
|
### Development Workflow
|
|
39
44
|
|
|
40
45
|
```bash
|
|
@@ -108,20 +113,6 @@ from agentwire.utils import agentwire_dir, config_path, logs_dir
|
|
|
108
113
|
base = agentwire_dir() # ~/.agentwire/
|
|
109
114
|
```
|
|
110
115
|
|
|
111
|
-
### Error Handling
|
|
112
|
-
|
|
113
|
-
Use the structured error classes in `agentwire/errors.py`:
|
|
114
|
-
|
|
115
|
-
```python
|
|
116
|
-
from agentwire.errors import AgentWireError
|
|
117
|
-
|
|
118
|
-
raise AgentWireError(
|
|
119
|
-
what="Session not found",
|
|
120
|
-
why="No tmux session exists with that name",
|
|
121
|
-
how="Create a new session with 'agentwire new -s name'"
|
|
122
|
-
)
|
|
123
|
-
```
|
|
124
|
-
|
|
125
116
|
### Configuration
|
|
126
117
|
|
|
127
118
|
Use dataclasses for configuration (see `agentwire/config.py`):
|
|
@@ -164,7 +155,6 @@ agentwire/
|
|
|
164
155
|
├── *_cli.py # Per-domain command groups, each with a register_<domain>_parser()
|
|
165
156
|
├── server.py # WebSocket server
|
|
166
157
|
├── config.py # Configuration dataclasses
|
|
167
|
-
├── errors.py # Structured error classes
|
|
168
158
|
├── validation.py # Config validation
|
|
169
159
|
├── utils/ # Shared utilities
|
|
170
160
|
│ ├── subprocess.py # Command execution
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentwire-dev
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.53.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
|
|
@@ -227,18 +227,22 @@ Requires-Python: >=3.10
|
|
|
227
227
|
Requires-Dist: aiohttp-jinja2>=1.6
|
|
228
228
|
Requires-Dist: aiohttp>=3.13.4
|
|
229
229
|
Requires-Dist: av>=12.0.0
|
|
230
|
+
Requires-Dist: fastapi>=0.104.0
|
|
230
231
|
Requires-Dist: jinja2>=3.1.0
|
|
231
232
|
Requires-Dist: kokoro-onnx>=0.4.9; python_version < '3.14'
|
|
232
233
|
Requires-Dist: markdown>=3.5
|
|
233
234
|
Requires-Dist: mcp>=1.2.0
|
|
234
235
|
Requires-Dist: pydantic>=2.0.0
|
|
235
236
|
Requires-Dist: python-dotenv>=1.2.2
|
|
237
|
+
Requires-Dist: python-multipart>=0.0.6
|
|
236
238
|
Requires-Dist: pywebpush>=1.14.0
|
|
237
239
|
Requires-Dist: pyyaml>=6.0
|
|
238
240
|
Requires-Dist: qrcode>=7.4
|
|
239
241
|
Requires-Dist: requests>=2.33.0
|
|
240
242
|
Requires-Dist: resend>=2.0.0
|
|
243
|
+
Requires-Dist: soundfile>=0.12.0; python_version < '3.14'
|
|
241
244
|
Requires-Dist: useful-moonshine-onnx>=20250101; python_version < '3.14'
|
|
245
|
+
Requires-Dist: uvicorn>=0.24.0
|
|
242
246
|
Provides-Extra: dev
|
|
243
247
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
244
248
|
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
|
|
@@ -336,8 +340,8 @@ session to commanding many.
|
|
|
336
340
|
## Quick Start
|
|
337
341
|
|
|
338
342
|
```bash
|
|
339
|
-
# Install
|
|
340
|
-
|
|
343
|
+
# Install (isolated tool env — works on any Python, including Homebrew/Debian PEP 668 setups)
|
|
344
|
+
uv tool install agentwire-dev
|
|
341
345
|
|
|
342
346
|
# Setup (interactive)
|
|
343
347
|
agentwire init
|
|
@@ -346,12 +350,13 @@ agentwire init
|
|
|
346
350
|
agentwire portal start
|
|
347
351
|
# Open http://127.0.0.1:8765 in Chrome — your cockpit is live (voice works immediately too)
|
|
348
352
|
|
|
349
|
-
#
|
|
350
|
-
|
|
351
|
-
agentwire dev
|
|
353
|
+
# Start your first agent session
|
|
354
|
+
agentwire new -s hello -p ~/projects/hello
|
|
352
355
|
```
|
|
353
356
|
|
|
354
|
-
**
|
|
357
|
+
> **Optional:** clone this repo (`git clone https://github.com/dotdevdotdev/agentwire-dev ~/projects/agentwire-dev`) and `agentwire dev` opens a guided helper session inside it — setup walkthrough, project wiring, issue filing, forking. It requires the source checkout; everything above works without one.
|
|
358
|
+
|
|
359
|
+
**Requirements:** Python 3.10+, tmux, Claude Code. Optional: ffmpeg (only for host-mic push-to-talk capture and voice cloning — browser voice input works without it).
|
|
355
360
|
|
|
356
361
|
**Honest setup time:** under a minute to a working voice portal with a genuinely good voice — Kokoro-82M runs on CPU out of the box (one-time ~200 MB model download in the background; the browser voice covers the wait). ~15 minutes for the full experience: cloned voices via a self-hosted TTS shim, Whisper-grade transcription, phone-from-anywhere (certs + token).
|
|
357
362
|
|
|
@@ -377,17 +382,21 @@ Origin checks reject cross-site browser requests on every bind. Keep the portal
|
|
|
377
382
|
|
|
378
383
|
**macOS:**
|
|
379
384
|
```bash
|
|
380
|
-
brew install tmux ffmpeg
|
|
381
|
-
|
|
385
|
+
brew install tmux uv # ffmpeg optional: only for host-mic PTT + voice cloning
|
|
386
|
+
uv tool install agentwire-dev
|
|
382
387
|
```
|
|
383
388
|
|
|
389
|
+
> Bare `pip install agentwire-dev` fails on Homebrew Python 3.12+ with `error: externally-managed-environment` (PEP 668). `uv tool install` (or `pipx install agentwire-dev`) sidesteps that by installing into its own isolated environment.
|
|
390
|
+
|
|
384
391
|
**Ubuntu/Debian:**
|
|
385
392
|
```bash
|
|
386
|
-
sudo apt install tmux ffmpeg
|
|
387
|
-
|
|
388
|
-
|
|
393
|
+
sudo apt install tmux # ffmpeg optional: only for host-mic PTT + voice cloning
|
|
394
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
395
|
+
uv tool install agentwire-dev
|
|
389
396
|
```
|
|
390
397
|
|
|
398
|
+
`pipx install agentwire-dev` works everywhere too. Prefer plain pip? Use a venv: `python3 -m venv ~/.agentwire-venv && source ~/.agentwire-venv/bin/activate && pip install agentwire-dev`.
|
|
399
|
+
|
|
391
400
|
**WSL2:** Same as Ubuntu. Audio is limited; use as remote worker with portal on Windows host.
|
|
392
401
|
|
|
393
402
|
</details>
|
|
@@ -73,8 +73,8 @@ session to commanding many.
|
|
|
73
73
|
## Quick Start
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
|
-
# Install
|
|
77
|
-
|
|
76
|
+
# Install (isolated tool env — works on any Python, including Homebrew/Debian PEP 668 setups)
|
|
77
|
+
uv tool install agentwire-dev
|
|
78
78
|
|
|
79
79
|
# Setup (interactive)
|
|
80
80
|
agentwire init
|
|
@@ -83,12 +83,13 @@ agentwire init
|
|
|
83
83
|
agentwire portal start
|
|
84
84
|
# Open http://127.0.0.1:8765 in Chrome — your cockpit is live (voice works immediately too)
|
|
85
85
|
|
|
86
|
-
#
|
|
87
|
-
|
|
88
|
-
agentwire dev
|
|
86
|
+
# Start your first agent session
|
|
87
|
+
agentwire new -s hello -p ~/projects/hello
|
|
89
88
|
```
|
|
90
89
|
|
|
91
|
-
**
|
|
90
|
+
> **Optional:** clone this repo (`git clone https://github.com/dotdevdotdev/agentwire-dev ~/projects/agentwire-dev`) and `agentwire dev` opens a guided helper session inside it — setup walkthrough, project wiring, issue filing, forking. It requires the source checkout; everything above works without one.
|
|
91
|
+
|
|
92
|
+
**Requirements:** Python 3.10+, tmux, Claude Code. Optional: ffmpeg (only for host-mic push-to-talk capture and voice cloning — browser voice input works without it).
|
|
92
93
|
|
|
93
94
|
**Honest setup time:** under a minute to a working voice portal with a genuinely good voice — Kokoro-82M runs on CPU out of the box (one-time ~200 MB model download in the background; the browser voice covers the wait). ~15 minutes for the full experience: cloned voices via a self-hosted TTS shim, Whisper-grade transcription, phone-from-anywhere (certs + token).
|
|
94
95
|
|
|
@@ -114,17 +115,21 @@ Origin checks reject cross-site browser requests on every bind. Keep the portal
|
|
|
114
115
|
|
|
115
116
|
**macOS:**
|
|
116
117
|
```bash
|
|
117
|
-
brew install tmux ffmpeg
|
|
118
|
-
|
|
118
|
+
brew install tmux uv # ffmpeg optional: only for host-mic PTT + voice cloning
|
|
119
|
+
uv tool install agentwire-dev
|
|
119
120
|
```
|
|
120
121
|
|
|
122
|
+
> Bare `pip install agentwire-dev` fails on Homebrew Python 3.12+ with `error: externally-managed-environment` (PEP 668). `uv tool install` (or `pipx install agentwire-dev`) sidesteps that by installing into its own isolated environment.
|
|
123
|
+
|
|
121
124
|
**Ubuntu/Debian:**
|
|
122
125
|
```bash
|
|
123
|
-
sudo apt install tmux ffmpeg
|
|
124
|
-
|
|
125
|
-
|
|
126
|
+
sudo apt install tmux # ffmpeg optional: only for host-mic PTT + voice cloning
|
|
127
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
128
|
+
uv tool install agentwire-dev
|
|
126
129
|
```
|
|
127
130
|
|
|
131
|
+
`pipx install agentwire-dev` works everywhere too. Prefer plain pip? Use a venv: `python3 -m venv ~/.agentwire-venv && source ~/.agentwire-venv/bin/activate && pip install agentwire-dev`.
|
|
132
|
+
|
|
128
133
|
**WSL2:** Same as Ubuntu. Audio is limited; use as remote worker with portal on Windows host.
|
|
129
134
|
|
|
130
135
|
</details>
|
|
@@ -187,7 +187,7 @@ Command Categories:
|
|
|
187
187
|
# - msg: polite agent-to-agent inbox (rides the watchdog)
|
|
188
188
|
from . import 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
|
|
189
189
|
from . import session_cli
|
|
190
|
-
from . import channels_cli, portal_cli, tts_cli
|
|
190
|
+
from . import channels_cli, config_cli, portal_cli, tts_cli
|
|
191
191
|
from . import scheduler_cli, ensure_cli
|
|
192
192
|
from . import doctor_cli, history_cli, machine_cli, safety_cli
|
|
193
193
|
from . import handoff_cli, hooks_cli, mcp_cli, roles_cli, tunnels_cli
|
|
@@ -222,6 +222,7 @@ Command Categories:
|
|
|
222
222
|
system_cli.register_system_parser,
|
|
223
223
|
push_cli.register_push_parser,
|
|
224
224
|
repo_cli.register_repo_parser,
|
|
225
|
+
config_cli.register_config_parser,
|
|
225
226
|
]
|
|
226
227
|
for _reg in _REGISTRARS:
|
|
227
228
|
_reg(subparsers)
|
|
@@ -353,6 +354,7 @@ _GROUP_COMMANDS = [
|
|
|
353
354
|
"portal", "tts", "stt", "tunnels", "machine", "history", "handoff",
|
|
354
355
|
"wiki", "hooks", "projects", "safety", "network", "listen",
|
|
355
356
|
"voiceclone", "roles", "task", "lock", "scheduler", "council", "limits",
|
|
357
|
+
"config",
|
|
356
358
|
]
|
|
357
359
|
|
|
358
360
|
|
|
@@ -236,11 +236,11 @@ class TmuxAgent(AgentBackend):
|
|
|
236
236
|
# Use base64 + load-buffer on remote to avoid PTY flooding
|
|
237
237
|
import base64
|
|
238
238
|
encoded = base64.b64encode(text.encode()).decode()
|
|
239
|
+
# Pipe straight into the tmux buffer — no on-disk temp that could
|
|
240
|
+
# expose message content or be pre-planted on the remote host
|
|
239
241
|
cmd = (
|
|
240
|
-
f"echo {shlex.quote(encoded)} | base64 -d
|
|
241
|
-
f"tmux load-buffer /tmp/aw-send-$$.txt && "
|
|
242
|
+
f"echo {shlex.quote(encoded)} | base64 -d | tmux load-buffer - && "
|
|
242
243
|
f"tmux paste-buffer -t {shlex.quote(session_name)} && "
|
|
243
|
-
f"rm -f /tmp/aw-send-$$.txt && "
|
|
244
244
|
f"sleep 0.2 && "
|
|
245
245
|
f"tmux send-keys -t {shlex.quote(session_name)} Enter"
|
|
246
246
|
)
|
|
@@ -288,7 +288,10 @@ def cmd_say(args) -> int:
|
|
|
288
288
|
display = getattr(args, 'display', None)
|
|
289
289
|
# Capture whether the toast actually reached the portal, so the caller can
|
|
290
290
|
# report it honestly rather than claiming "shown" when the portal is down.
|
|
291
|
-
|
|
291
|
+
# Briefing cards are info, not action items: normal priority, but a longer
|
|
292
|
+
# fade than the 8s default since the card carries more than the spoken line.
|
|
293
|
+
toast_ok = _post_desktop_notification(display, session=session, priority="normal",
|
|
294
|
+
timeout=30) if display else None
|
|
292
295
|
|
|
293
296
|
def _say_result(rc: int, sink: str, clients: int = 0) -> int:
|
|
294
297
|
"""Report which sink actually received the audio (#444): browser
|
|
@@ -170,49 +170,6 @@ def write_task_context(
|
|
|
170
170
|
return context_file
|
|
171
171
|
|
|
172
172
|
|
|
173
|
-
def read_task_context(session: str) -> dict | None:
|
|
174
|
-
"""Read task context file.
|
|
175
|
-
|
|
176
|
-
Args:
|
|
177
|
-
session: tmux session name
|
|
178
|
-
|
|
179
|
-
Returns:
|
|
180
|
-
Context dict or None if not found
|
|
181
|
-
"""
|
|
182
|
-
context_file = TASKS_DIR / f"{session}.json"
|
|
183
|
-
if not context_file.exists():
|
|
184
|
-
return None
|
|
185
|
-
|
|
186
|
-
try:
|
|
187
|
-
return json.loads(context_file.read_text())
|
|
188
|
-
except (json.JSONDecodeError, OSError):
|
|
189
|
-
return None
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
def update_task_context(session: str, **updates) -> bool:
|
|
193
|
-
"""Update fields in task context file.
|
|
194
|
-
|
|
195
|
-
Args:
|
|
196
|
-
session: tmux session name
|
|
197
|
-
**updates: Fields to update
|
|
198
|
-
|
|
199
|
-
Returns:
|
|
200
|
-
True if updated successfully
|
|
201
|
-
"""
|
|
202
|
-
context = read_task_context(session)
|
|
203
|
-
if context is None:
|
|
204
|
-
return False
|
|
205
|
-
|
|
206
|
-
context.update(updates)
|
|
207
|
-
context_file = TASKS_DIR / f"{session}.json"
|
|
208
|
-
|
|
209
|
-
try:
|
|
210
|
-
context_file.write_text(json.dumps(context, indent=2))
|
|
211
|
-
return True
|
|
212
|
-
except OSError:
|
|
213
|
-
return False
|
|
214
|
-
|
|
215
|
-
|
|
216
173
|
def clear_task_context(session: str) -> None:
|
|
217
174
|
"""Remove task context and completion signal files.
|
|
218
175
|
|
|
@@ -332,145 +289,6 @@ def get_summary_prompt(summary_file: str) -> str:
|
|
|
332
289
|
return SYSTEM_SUMMARY_PROMPT.format(summary_file=summary_file)
|
|
333
290
|
|
|
334
291
|
|
|
335
|
-
def is_session_idle(session: str, idle_threshold: float = 3.0) -> bool:
|
|
336
|
-
"""Check if a session is currently idle.
|
|
337
|
-
|
|
338
|
-
Uses the portal's cached status if available, otherwise checks tmux activity.
|
|
339
|
-
|
|
340
|
-
Args:
|
|
341
|
-
session: Session name
|
|
342
|
-
idle_threshold: Seconds of inactivity to consider idle
|
|
343
|
-
|
|
344
|
-
Returns:
|
|
345
|
-
True if session is idle, False otherwise
|
|
346
|
-
"""
|
|
347
|
-
# Try to get activity time from tmux
|
|
348
|
-
# Note: display-message and capture-pane don't support = prefix for exact match
|
|
349
|
-
try:
|
|
350
|
-
result = subprocess.run(
|
|
351
|
-
["tmux", "display-message", "-p", "-t", session, "#{pane_last_activity}"],
|
|
352
|
-
capture_output=True,
|
|
353
|
-
text=True,
|
|
354
|
-
timeout=5,
|
|
355
|
-
)
|
|
356
|
-
if result.returncode == 0 and result.stdout.strip():
|
|
357
|
-
last_activity = int(result.stdout.strip())
|
|
358
|
-
current_time = int(time.time())
|
|
359
|
-
idle_seconds = current_time - last_activity
|
|
360
|
-
return idle_seconds >= idle_threshold
|
|
361
|
-
except (subprocess.TimeoutExpired, ValueError, subprocess.SubprocessError):
|
|
362
|
-
pass
|
|
363
|
-
|
|
364
|
-
# Fallback: check if output is changing
|
|
365
|
-
# This is less reliable but works as a backup
|
|
366
|
-
return False
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
def wait_for_idle(
|
|
370
|
-
session: str,
|
|
371
|
-
timeout: float = 300.0,
|
|
372
|
-
idle_threshold: float = 3.0,
|
|
373
|
-
poll_interval: float = 2.0,
|
|
374
|
-
stable_count: int = 3,
|
|
375
|
-
) -> bool:
|
|
376
|
-
"""Wait for a session to become idle.
|
|
377
|
-
|
|
378
|
-
"Idle" means the session has not produced output for idle_threshold seconds
|
|
379
|
-
for stable_count consecutive checks.
|
|
380
|
-
|
|
381
|
-
Args:
|
|
382
|
-
session: Session name
|
|
383
|
-
timeout: Maximum seconds to wait
|
|
384
|
-
idle_threshold: Seconds of inactivity to consider idle
|
|
385
|
-
poll_interval: Seconds between checks
|
|
386
|
-
stable_count: Number of consecutive idle checks required
|
|
387
|
-
|
|
388
|
-
Returns:
|
|
389
|
-
True if session became idle, False if timeout
|
|
390
|
-
|
|
391
|
-
Raises:
|
|
392
|
-
CompletionTimeout: If timeout is exceeded
|
|
393
|
-
"""
|
|
394
|
-
start_time = time.time()
|
|
395
|
-
consecutive_idle = 0
|
|
396
|
-
last_output_hash = None
|
|
397
|
-
|
|
398
|
-
while True:
|
|
399
|
-
elapsed = time.time() - start_time
|
|
400
|
-
if elapsed >= timeout:
|
|
401
|
-
raise CompletionTimeout(
|
|
402
|
-
f"Timeout waiting for session '{session}' to become idle "
|
|
403
|
-
f"after {timeout:.0f}s"
|
|
404
|
-
)
|
|
405
|
-
|
|
406
|
-
# Check if session is still running
|
|
407
|
-
result = subprocess.run(
|
|
408
|
-
["tmux", "has-session", "-t", f"={session}"],
|
|
409
|
-
capture_output=True,
|
|
410
|
-
)
|
|
411
|
-
if result.returncode != 0:
|
|
412
|
-
raise CompletionError(f"Session '{session}' no longer exists")
|
|
413
|
-
|
|
414
|
-
# Get current output snapshot
|
|
415
|
-
# Note: capture-pane doesn't support = prefix for exact match
|
|
416
|
-
result = subprocess.run(
|
|
417
|
-
["tmux", "capture-pane", "-t", session, "-p", "-S", "-20"],
|
|
418
|
-
capture_output=True,
|
|
419
|
-
text=True,
|
|
420
|
-
timeout=5,
|
|
421
|
-
)
|
|
422
|
-
if result.returncode != 0:
|
|
423
|
-
time.sleep(poll_interval)
|
|
424
|
-
continue
|
|
425
|
-
|
|
426
|
-
current_hash = hash(result.stdout)
|
|
427
|
-
|
|
428
|
-
if current_hash == last_output_hash:
|
|
429
|
-
consecutive_idle += 1
|
|
430
|
-
if consecutive_idle >= stable_count:
|
|
431
|
-
return True
|
|
432
|
-
else:
|
|
433
|
-
consecutive_idle = 0
|
|
434
|
-
last_output_hash = current_hash
|
|
435
|
-
|
|
436
|
-
time.sleep(poll_interval)
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
def wait_for_file(
|
|
440
|
-
path: Path,
|
|
441
|
-
timeout: float = 60.0,
|
|
442
|
-
poll_interval: float = 1.0,
|
|
443
|
-
) -> bool:
|
|
444
|
-
"""Wait for a file to be created.
|
|
445
|
-
|
|
446
|
-
Args:
|
|
447
|
-
path: Path to the file
|
|
448
|
-
timeout: Maximum seconds to wait
|
|
449
|
-
poll_interval: Seconds between checks
|
|
450
|
-
|
|
451
|
-
Returns:
|
|
452
|
-
True if file was created
|
|
453
|
-
|
|
454
|
-
Raises:
|
|
455
|
-
CompletionTimeout: If timeout is exceeded
|
|
456
|
-
"""
|
|
457
|
-
start_time = time.time()
|
|
458
|
-
|
|
459
|
-
while True:
|
|
460
|
-
if path.exists() and path.stat().st_size > 0:
|
|
461
|
-
# Give a moment for the file to be fully written
|
|
462
|
-
time.sleep(0.5)
|
|
463
|
-
return True
|
|
464
|
-
|
|
465
|
-
elapsed = time.time() - start_time
|
|
466
|
-
if elapsed >= timeout:
|
|
467
|
-
raise CompletionTimeout(
|
|
468
|
-
f"Timeout waiting for file '{path}' after {timeout:.0f}s"
|
|
469
|
-
)
|
|
470
|
-
|
|
471
|
-
time.sleep(poll_interval)
|
|
472
|
-
|
|
473
|
-
|
|
474
292
|
def parse_summary_file(path: Path) -> SummaryResult:
|
|
475
293
|
"""Parse a task summary file.
|
|
476
294
|
|
|
@@ -596,53 +414,3 @@ def status_to_exit_code(status: str) -> int:
|
|
|
596
414
|
return 7
|
|
597
415
|
else:
|
|
598
416
|
return 2
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
# =============================================================================
|
|
602
|
-
# Loop mode helpers
|
|
603
|
-
# =============================================================================
|
|
604
|
-
|
|
605
|
-
# Directory for iteration review files (relative to project root)
|
|
606
|
-
ITERATIONS_DIR = ".agentwire/iterations"
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
def generate_iteration_filename(session: str, iteration: int) -> str:
|
|
610
|
-
"""Generate a filename for an iteration review file.
|
|
611
|
-
|
|
612
|
-
Args:
|
|
613
|
-
session: tmux session name
|
|
614
|
-
iteration: Current iteration number (1-based)
|
|
615
|
-
|
|
616
|
-
Returns:
|
|
617
|
-
Relative path like .agentwire/iterations/mysession-iter-1.md
|
|
618
|
-
"""
|
|
619
|
-
return f"{ITERATIONS_DIR}/{session}-iter-{iteration}.md"
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
# Prompt sent between loop iterations to get a review
|
|
623
|
-
ITERATION_REVIEW_PROMPT = """Review your progress so far. Write a brief status report to {iter_file}:
|
|
624
|
-
|
|
625
|
-
# Iteration {iteration} Review
|
|
626
|
-
|
|
627
|
-
## Status
|
|
628
|
-
complete | incomplete
|
|
629
|
-
|
|
630
|
-
## What Was Done
|
|
631
|
-
[Brief description of work in this iteration]
|
|
632
|
-
|
|
633
|
-
## Remaining Work
|
|
634
|
-
[What still needs to be done, or "none" if complete]
|
|
635
|
-
|
|
636
|
-
Use "complete" if the task is fully done. Use "incomplete" if more work is needed.
|
|
637
|
-
Write the file now."""
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
# Prompt sent to continue the loop with context
|
|
641
|
-
ITERATION_CONTINUE_PROMPT = """Continue working on the task. This is iteration {iteration} of {max_iterations}.
|
|
642
|
-
|
|
643
|
-
Previous iteration reviews are in {iterations_dir}/ — read them for context on what's been done.
|
|
644
|
-
|
|
645
|
-
Original task:
|
|
646
|
-
{original_prompt}
|
|
647
|
-
|
|
648
|
-
Continue where you left off. Focus on remaining work identified in previous reviews."""
|
|
@@ -74,6 +74,12 @@ class ServerConfig:
|
|
|
74
74
|
# bearer token then transits in cleartext. Required to start a non-loopback
|
|
75
75
|
# bind without TLS — the BYO-tunnel case where the tunnel terminates TLS.
|
|
76
76
|
allow_insecure: bool = False
|
|
77
|
+
# Emit HTTP Strict-Transport-Security. Leave OFF for self-signed /
|
|
78
|
+
# localhost / LAN — HSTS + a self-signed cert locks the browser out of the
|
|
79
|
+
# portal if the cert ever rotates. Enable ONLY when serving a real
|
|
80
|
+
# (CA-signed) cert directly. Behind Cloudflare Tunnel / a reverse proxy,
|
|
81
|
+
# set HSTS at the edge instead.
|
|
82
|
+
hsts: bool = False
|
|
77
83
|
|
|
78
84
|
|
|
79
85
|
@dataclass
|
|
@@ -590,6 +596,7 @@ def _dict_to_config(data: dict) -> Config:
|
|
|
590
596
|
# "" (explicit disable) must survive — don't collapse it to None.
|
|
591
597
|
auth_token=server_data.get("auth_token"),
|
|
592
598
|
allow_insecure=bool(server_data.get("allow_insecure", False)),
|
|
599
|
+
hsts=bool(server_data.get("hsts", False)),
|
|
593
600
|
)
|
|
594
601
|
|
|
595
602
|
# Projects
|