agentwire-dev 1.49.0__tar.gz → 1.50.1__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.49.0 → agentwire_dev-1.50.1}/PKG-INFO +54 -40
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/README.md +53 -39
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/__init__.py +1 -1
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/idle-handler.sh +11 -4
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/notify_cli.py +27 -5
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/send_cli.py +9 -5
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/services.py +36 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/session_ready.py +28 -10
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/announcements.json +18 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/templates/base.html +3 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/sessions/prompt-routing.md +12 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.claude/commands/handoff.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.claude/skills/wiki/SKILL.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.github/FUNDING.yml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.github/workflows/pytest.yml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.github/workflows/ruff.yml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.github/workflows/security.yml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.github/workflows/tts-smoke.yml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/.gitignore +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/AGENTS.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/CODE_OF_CONDUCT.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/CONTRIBUTING.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/Dockerfile.local +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/LICENSE +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/RELEASING.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/SECURITY.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/SPONSORS.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/__main__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/agents/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/agents/base.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/agents/tmux.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/cached_status.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/channels/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/channels/base.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/channels/email.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/channels/push.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/channels/quo.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/channels_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/completion.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/config.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/core.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/council/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/council/cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/council/inbox.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/council/state.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/council/view.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/devices.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/diff_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/doctor_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/doctor_voice.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/ensure_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/fetch.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/handoff/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/handoff/git_state.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/handoff/instructions.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/handoff/parser.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/handoff/renderer.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/handoff/schema.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/handoff_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/history.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/history_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/agentwire-permission.sh +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/audit_logger.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/mcp-tool-damage-control.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/read-tool-damage-control.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/control-plane.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/outbound.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/publish.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks/queue-processor.sh +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/hooks_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/inbox.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/limits_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/listen.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/locking.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/machine_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_channels.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_core.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_council.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_desktop.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_handoff.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_history.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_listen.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_lock.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_machine.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_msg.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_notify.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_pane.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_projects.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_scheduler.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_scratchpad.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_server.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_services.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_session.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_status.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_task.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_tunnels.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_voice.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_voiceclone.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_wiki.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/mcp_worktree.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/msg_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/network.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/onboarding.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/pane_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/pane_manager.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/portal_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/project_config.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/projects.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/prompt_router.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/prompts_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/push_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/push_store.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/repo_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/research.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/agentwire.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/anchor.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/chatbot.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/correspondent.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/council-brain.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/council-conscience.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/council-critic.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/council-devils-advocate.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/council-gut.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/council-historian.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/council-member.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/council-orchestrator.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/init.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/notifications.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/orchestrator.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/soul.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/task-runner.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/voice.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/worker.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles/worktree-session.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/roles_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/artifacts.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/config.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/council.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/desktop.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/history.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/machines.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/notify.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/permission.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/projects.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/push.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/safety.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/scheduler.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/scratchpad.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/sessions.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/sessions_admin.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/routes/voice.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/safety/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/safety/_core.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/safety_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/safety_commands.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/scheduler.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/scheduler_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/scratchpad.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/security.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/server.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/session_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/session_context.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/ssh.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/css/desktop.css +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/css/mobile.css +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/favicon.png +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/bear.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/cat.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/crown.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/custom/agentwire-portal.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/custom/agentwire-tts.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/custom/agentwire.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/deer.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/drone.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/eagle.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/fox.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/hawk.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/horse.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/lion.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/rabbit.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/robot.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/tiger.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/icons/sessions/wolf.webp +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/img/icon-192.png +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/img/icon-512.png +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/.gitkeep +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/announcement-modal.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/api.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/artifact-window.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/collage.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/command-palette.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/council-window.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/dead-key-suppressor.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/desktop-manager.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/desktop.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/help-modal.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/icon-manager.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/mobile.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/notification-prefs.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/notifications-panel.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/push-client.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/review-window.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/safety-shared.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/safety-window.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/scratchpad.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/service-classification.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/session-id.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/session-window.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/shortcuts.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/sidebar/config-section.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/sidebar/council-section.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/sidebar/machines-section.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/sidebar/projects-section.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/sidebar/safety-section.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/sidebar/services-section.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/sidebar/sessions-section.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/sidebar.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/terminal-font-prefs.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/tile-manager.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/toast.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/token-modal.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/utils/ansi.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/utils/swipe.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/voice/autosend-prefs.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/voice/browser-stt.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/voice/browser-tts.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/voice/jargon.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/voice/prompt.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/js/winbox.bundle.min.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/manifest.webmanifest +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/static/service-worker.js +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/stt/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/stt/base.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/stt/cloud.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/stt/engine.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/stt/local.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/stt/server_backend.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/stt/stt_server.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/system_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tasks.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/templates/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/templates/desktop.html +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/templates/email_notification.html +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/templates/handoff/theme.css.j2 +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/templates/mobile.html +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/templates/pair.html +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/templates/tmux.conf +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/templating.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tooldefs/aws.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tooldefs/docker.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tooldefs/gcp.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tooldefs/gh.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tooldefs/git.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tooldefs/gws.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tooldefs/kubectl.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tooldefs/npm.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tooldefs/terraform.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tooldefs/uv.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts/audio.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts/base.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts/engines/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts/engines/chatterbox.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts/engines/kokoro.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts/engines/zonos.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts/kokoro_server.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts/local.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts/registry.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tts_server.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tunnels.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/tunnels_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/usage_limit.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/utils/__init__.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/utils/chunker.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/utils/event_log.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/utils/file_io.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/utils/paths.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/utils/speech.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/utils/subprocess.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/validation.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/voice_status.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/voiceclone.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/voices/darren.wav +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/voices/default.wav +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/voices/jessica.wav +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/voices/lisa.wav +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/voices/may.wav +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/wiki.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/wiki_audit.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/wiki_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/worktree.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/agentwire/worktree_registry.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/decisions/obsidian-second-brain.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/logo.png +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/INDEX.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/architecture.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/briefing-mode.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/communication/channels.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/communication/hammerspoon.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/communication/handoff.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/concepts.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/council.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/deployment/remote-access.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/deployment/remote-machines.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/glossary.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/internals/damage-control.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/internals/parallel-refactor.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/internals/portal.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/internals/shell-escaping.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/internals/troubleshooting.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/internals/window-collage.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/quickstart.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/research/briefing-mode-feasibility.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/research/orchestration-transport-alternatives.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/security/damage-control-hardening.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/security/pip-audit.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/security/remote-access-hardening.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/security/secrets.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/services.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/sessions/messaging.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/sessions/pi.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/sessions/window-sizing.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/sessions/worktree-sessions.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/usage-limit-recovery.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/voice/shim-contract.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/voice/stt-cloud.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/voice/stt-self-hosted.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/docs/wiki/voice/tts-self-hosted.md +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/pyproject.toml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/conftest.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/e2e/test_portal_ui.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/fixtures/sample_agentwire.yml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/fixtures/sample_config.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/fixtures/sample_scheduler.yaml +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/integration/test_council_portal.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/integration/test_scheduler_board.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/integration/test_server_websockets.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/integration/test_worktree_cmd.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_announcements.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_build_agent_command.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_channels.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_cli_commands.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_cli_output.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_cli_smoke.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_config.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_control_plane_protection.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_council_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_council_inbox.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_council_state.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_council_view.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_damage_control_bypass.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_damage_control_hooks.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_damage_control_sync.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_devices.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_diff_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_doctor_voice.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_event_log.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_file_io.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_handoff_git_state.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_handoff_instructions.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_handoff_parser.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_handoff_renderer.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_history.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_hooks_install.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_idle_handler.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_idle_nag.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_inbox.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_init_command.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_limits_tick_isolation.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_locking.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_mcp_server.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_mcp_tools_args.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_msg_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_portal_api.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_project_config.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_prompt_router.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_push.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_rebuild_guard.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_repo_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_roles.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_routes_snapshot.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_safety_commands.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_safety_disabled_rules.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_safety_escape_hatch.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_safety_heal.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_safety_kill_switch.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_scheduler.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_scheduler_parsing.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_scratchpad.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_security.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_server_async.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_server_pure.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_services.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_session_context.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_session_ready.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_skill_install.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_speech_tags.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_ssh.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_stt_backend.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_stt_cloud.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_stt_engine.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_task_cli.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_tasks.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_templating.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_terminal_resize.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_tmux_template.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_tts_engine_resolution.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_tts_local.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_tunnels_probe.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_usage_limit.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_validation.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_voice_status.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_wiki.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_wiki_audit.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_worktree.py +0 -0
- {agentwire_dev-1.49.0 → agentwire_dev-1.50.1}/tests/unit/test_worktree_registry.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentwire-dev
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.50.1
|
|
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
|
|
@@ -266,11 +266,11 @@ Description-Content-Type: text/markdown
|
|
|
266
266
|
</p>
|
|
267
267
|
|
|
268
268
|
<p align="center">
|
|
269
|
-
<strong>
|
|
269
|
+
<strong>A self-hosted, keyboard-driven cockpit for running a whole <em>fleet</em> of Claude Code agents at once.</strong>
|
|
270
270
|
</p>
|
|
271
271
|
|
|
272
272
|
<p align="center">
|
|
273
|
-
|
|
273
|
+
From a wall of tmux panes to one cockpit. Worktrees, command palette, scheduler, voice — every layer stacks, so you ship far more than you ever could hand-juggling terminals. Your machine, your keys, no telemetry.
|
|
274
274
|
</p>
|
|
275
275
|
|
|
276
276
|
<p align="center">
|
|
@@ -285,39 +285,51 @@ Description-Content-Type: text/markdown
|
|
|
285
285
|
|
|
286
286
|
## Why AgentWire
|
|
287
287
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
288
|
+
Running several Claude Code agents by hand means a wall of tmux panes: constant
|
|
289
|
+
context-switching, copy-pasting between sessions, tracking which branch each agent
|
|
290
|
+
sits on, babysitting every one. It doesn't scale past one or two before **your
|
|
291
|
+
attention** — not the model — becomes the bottleneck. AgentWire turns that wall into
|
|
292
|
+
one cockpit, and its capabilities **compound**:
|
|
293
|
+
|
|
294
|
+
- **It compounds.** Worktrees + command palette + quick-action keys + tab-switching
|
|
295
|
+
+ scheduler + voice each stack on the others to multiply how much one person can
|
|
296
|
+
run at once. That's the whole point — not any single feature.
|
|
297
|
+
- **Orchestrate _many_ agents, not watch one.** Every session is a window; **F3**
|
|
298
|
+
fans them into a Mission-Control collage; **Tab** cycles between them; **Cmd/Ctrl+K**
|
|
299
|
+
runs any action. Council deliberates, briefing mode fans out, worktree sessions
|
|
300
|
+
isolate parallel work — tmux- and Claude-Code-native from the ground up.
|
|
301
|
+
- **Autonomous and unattended.** A scheduler runs recurring jobs (research, test runs,
|
|
302
|
+
cleanup, doc-drift); gates verify *real work happened*; repo tasks open *draft PRs,
|
|
303
|
+
not commits to main*; reliability plumbing (verified delivery, dead-letter,
|
|
304
|
+
email-on-fail, usage-limit recovery) means nothing silently fails.
|
|
305
|
+
- **Your machine, your keys, no telemetry.** Runs entirely on your hardware, loopback
|
|
306
|
+
by default. No cloud account, no third party in the loop — your code and your API
|
|
307
|
+
keys never leave the machine. 300+ damage-control blocks make running unattended sane.
|
|
308
|
+
|
|
309
|
+
> **Use the official app to watch one session; use AgentWire to command a whole
|
|
310
|
+
> fleet — on your own hardware, by keyboard, with voice layered on top.**
|
|
304
311
|
|
|
305
312
|
---
|
|
306
313
|
|
|
307
314
|
## What It Does
|
|
308
315
|
|
|
309
|
-
|
|
316
|
+
A self-hosted, desktop-style portal where **every agent session is a window** —
|
|
317
|
+
reachable from any device on your LAN, running on your own hardware with your own keys.
|
|
310
318
|
|
|
311
319
|
```
|
|
312
|
-
|
|
313
|
-
|
|
320
|
+
You → AgentWire Portal → tmux sessions → a fleet of Claude Code agents
|
|
321
|
+
⌨️🎤 (WebSocket) 📺 🤖🤖🤖
|
|
314
322
|
```
|
|
315
323
|
|
|
316
|
-
**From your
|
|
317
|
-
-
|
|
318
|
-
-
|
|
319
|
-
-
|
|
320
|
-
-
|
|
324
|
+
**From your laptop, phone, or tablet on your network:**
|
|
325
|
+
- Every session is a draggable window; **F3** collage, **Tab** to cycle
|
|
326
|
+
- Command palette (**Cmd/Ctrl+K**) runs any action; quick-action keys throughout
|
|
327
|
+
- Branch a session into an isolated git worktree for parallel work
|
|
328
|
+
- Put repeat work on a scheduler; hand hard calls to a council
|
|
329
|
+
- Push-to-talk in, spoken summaries back — drive sessions by ear while off-tab
|
|
330
|
+
|
|
331
|
+
**The outcome:** the whole fleet feels like one machine. You go from babysitting one
|
|
332
|
+
session to commanding many.
|
|
321
333
|
|
|
322
334
|
---
|
|
323
335
|
|
|
@@ -332,7 +344,7 @@ agentwire init
|
|
|
332
344
|
|
|
333
345
|
# Run
|
|
334
346
|
agentwire portal start
|
|
335
|
-
# Open http://127.0.0.1:8765 in Chrome — voice works immediately
|
|
347
|
+
# Open http://127.0.0.1:8765 in Chrome — your cockpit is live (voice works immediately too)
|
|
336
348
|
```
|
|
337
349
|
|
|
338
350
|
**Requirements:** Python 3.10+, tmux, ffmpeg, Claude Code
|
|
@@ -382,18 +394,20 @@ pip install agentwire-dev
|
|
|
382
394
|
|
|
383
395
|
## Features
|
|
384
396
|
|
|
397
|
+
The cockpit, then the layers that stack on it:
|
|
398
|
+
|
|
385
399
|
| Feature | Description |
|
|
386
400
|
|---------|-------------|
|
|
387
|
-
| **
|
|
388
|
-
| **
|
|
401
|
+
| **Desktop UI** | Every session is a draggable window; **F3** collage grid, **Tab** to cycle, **Cmd/Ctrl+K** command palette |
|
|
402
|
+
| **Multi-Session** | Run multiple agents on different projects simultaneously |
|
|
403
|
+
| **Git Worktrees** | Same project, multiple branches, parallel agents — each in an isolated worktree session |
|
|
404
|
+
| **Worker Orchestration** | Spawn worker panes, coordinate tasks, auto-reap when idle |
|
|
389
405
|
| **Council** | Fan a prompt to multiple "soul" sessions (brain, conscience, critic…), synthesize with attribution |
|
|
390
|
-
| **Scheduler** | Recurring autonomous tasks with gates, priorities, and usage-limit recovery |
|
|
406
|
+
| **Scheduler** | Recurring autonomous tasks with gates, priorities, and usage-limit recovery — draft PRs, not commits to main |
|
|
391
407
|
| **Briefing Mode** | A terse human-facing anchor fans out verbose worktree correspondents, then briefs you on cue |
|
|
392
|
-
| **
|
|
393
|
-
| **Git Worktrees** | Same project, multiple branches, parallel agents |
|
|
408
|
+
| **Voice** | Push-to-talk in, neural TTS out on CPU (Kokoro); voice cloning via a self-hosted GPU shim; global macOS hotkeys dictate to a background session from any app |
|
|
394
409
|
| **Remote Machines** | SSH into GPU servers and talk to agents there |
|
|
395
|
-
| **
|
|
396
|
-
| **Safety Hooks** | 300+ dangerous commands blocked (rm -rf, force push, etc.) |
|
|
410
|
+
| **Safety Hooks** | 300+ dangerous commands blocked (rm -rf, force push, etc.), all logged |
|
|
397
411
|
| **Outbound Channels** | Email (Resend) + SMS (Quo / OpenPhone) for cross-device notifications |
|
|
398
412
|
| **Session Roles** | Leader/worker patterns for multi-agent workflows |
|
|
399
413
|
|
|
@@ -407,13 +421,13 @@ agentwire new -s myproject -p ~/projects/myproject
|
|
|
407
421
|
```
|
|
408
422
|
|
|
409
423
|
**2. Open the portal:**
|
|
410
|
-
Visit `http://127.0.0.1:8765` in Chrome (or your phone/tablet with LAN access configured)
|
|
424
|
+
Visit `http://127.0.0.1:8765` in Chrome (or your phone/tablet with LAN access configured). Each session is a window — open as many as you want and **Tab** between them, or **F3** for the collage grid.
|
|
411
425
|
|
|
412
|
-
**3.
|
|
413
|
-
|
|
426
|
+
**3. Drive it by keyboard:**
|
|
427
|
+
**Cmd/Ctrl+K** runs any action; quick-action keys send to the focused session; branch a session into a worktree for parallel work; put repeat jobs on the scheduler.
|
|
414
428
|
|
|
415
|
-
**4.
|
|
416
|
-
|
|
429
|
+
**4. Add voice on top:**
|
|
430
|
+
Hold the mic to speak (in instant mode the transcript appears for a quick glance — Enter sends it), and agent responses are spoken back — Kokoro neural voice out of the box, so you can drive sessions and hear summaries by ear while your eyes are elsewhere.
|
|
417
431
|
|
|
418
432
|
---
|
|
419
433
|
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
<strong>
|
|
6
|
+
<strong>A self-hosted, keyboard-driven cockpit for running a whole <em>fleet</em> of Claude Code agents at once.</strong>
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
|
|
10
|
+
From a wall of tmux panes to one cockpit. Worktrees, command palette, scheduler, voice — every layer stacks, so you ship far more than you ever could hand-juggling terminals. Your machine, your keys, no telemetry.
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
@@ -22,39 +22,51 @@
|
|
|
22
22
|
|
|
23
23
|
## Why AgentWire
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
25
|
+
Running several Claude Code agents by hand means a wall of tmux panes: constant
|
|
26
|
+
context-switching, copy-pasting between sessions, tracking which branch each agent
|
|
27
|
+
sits on, babysitting every one. It doesn't scale past one or two before **your
|
|
28
|
+
attention** — not the model — becomes the bottleneck. AgentWire turns that wall into
|
|
29
|
+
one cockpit, and its capabilities **compound**:
|
|
30
|
+
|
|
31
|
+
- **It compounds.** Worktrees + command palette + quick-action keys + tab-switching
|
|
32
|
+
+ scheduler + voice each stack on the others to multiply how much one person can
|
|
33
|
+
run at once. That's the whole point — not any single feature.
|
|
34
|
+
- **Orchestrate _many_ agents, not watch one.** Every session is a window; **F3**
|
|
35
|
+
fans them into a Mission-Control collage; **Tab** cycles between them; **Cmd/Ctrl+K**
|
|
36
|
+
runs any action. Council deliberates, briefing mode fans out, worktree sessions
|
|
37
|
+
isolate parallel work — tmux- and Claude-Code-native from the ground up.
|
|
38
|
+
- **Autonomous and unattended.** A scheduler runs recurring jobs (research, test runs,
|
|
39
|
+
cleanup, doc-drift); gates verify *real work happened*; repo tasks open *draft PRs,
|
|
40
|
+
not commits to main*; reliability plumbing (verified delivery, dead-letter,
|
|
41
|
+
email-on-fail, usage-limit recovery) means nothing silently fails.
|
|
42
|
+
- **Your machine, your keys, no telemetry.** Runs entirely on your hardware, loopback
|
|
43
|
+
by default. No cloud account, no third party in the loop — your code and your API
|
|
44
|
+
keys never leave the machine. 300+ damage-control blocks make running unattended sane.
|
|
45
|
+
|
|
46
|
+
> **Use the official app to watch one session; use AgentWire to command a whole
|
|
47
|
+
> fleet — on your own hardware, by keyboard, with voice layered on top.**
|
|
41
48
|
|
|
42
49
|
---
|
|
43
50
|
|
|
44
51
|
## What It Does
|
|
45
52
|
|
|
46
|
-
|
|
53
|
+
A self-hosted, desktop-style portal where **every agent session is a window** —
|
|
54
|
+
reachable from any device on your LAN, running on your own hardware with your own keys.
|
|
47
55
|
|
|
48
56
|
```
|
|
49
|
-
|
|
50
|
-
|
|
57
|
+
You → AgentWire Portal → tmux sessions → a fleet of Claude Code agents
|
|
58
|
+
⌨️🎤 (WebSocket) 📺 🤖🤖🤖
|
|
51
59
|
```
|
|
52
60
|
|
|
53
|
-
**From your
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
61
|
+
**From your laptop, phone, or tablet on your network:**
|
|
62
|
+
- Every session is a draggable window; **F3** collage, **Tab** to cycle
|
|
63
|
+
- Command palette (**Cmd/Ctrl+K**) runs any action; quick-action keys throughout
|
|
64
|
+
- Branch a session into an isolated git worktree for parallel work
|
|
65
|
+
- Put repeat work on a scheduler; hand hard calls to a council
|
|
66
|
+
- Push-to-talk in, spoken summaries back — drive sessions by ear while off-tab
|
|
67
|
+
|
|
68
|
+
**The outcome:** the whole fleet feels like one machine. You go from babysitting one
|
|
69
|
+
session to commanding many.
|
|
58
70
|
|
|
59
71
|
---
|
|
60
72
|
|
|
@@ -69,7 +81,7 @@ agentwire init
|
|
|
69
81
|
|
|
70
82
|
# Run
|
|
71
83
|
agentwire portal start
|
|
72
|
-
# Open http://127.0.0.1:8765 in Chrome — voice works immediately
|
|
84
|
+
# Open http://127.0.0.1:8765 in Chrome — your cockpit is live (voice works immediately too)
|
|
73
85
|
```
|
|
74
86
|
|
|
75
87
|
**Requirements:** Python 3.10+, tmux, ffmpeg, Claude Code
|
|
@@ -119,18 +131,20 @@ pip install agentwire-dev
|
|
|
119
131
|
|
|
120
132
|
## Features
|
|
121
133
|
|
|
134
|
+
The cockpit, then the layers that stack on it:
|
|
135
|
+
|
|
122
136
|
| Feature | Description |
|
|
123
137
|
|---------|-------------|
|
|
124
|
-
| **
|
|
125
|
-
| **
|
|
138
|
+
| **Desktop UI** | Every session is a draggable window; **F3** collage grid, **Tab** to cycle, **Cmd/Ctrl+K** command palette |
|
|
139
|
+
| **Multi-Session** | Run multiple agents on different projects simultaneously |
|
|
140
|
+
| **Git Worktrees** | Same project, multiple branches, parallel agents — each in an isolated worktree session |
|
|
141
|
+
| **Worker Orchestration** | Spawn worker panes, coordinate tasks, auto-reap when idle |
|
|
126
142
|
| **Council** | Fan a prompt to multiple "soul" sessions (brain, conscience, critic…), synthesize with attribution |
|
|
127
|
-
| **Scheduler** | Recurring autonomous tasks with gates, priorities, and usage-limit recovery |
|
|
143
|
+
| **Scheduler** | Recurring autonomous tasks with gates, priorities, and usage-limit recovery — draft PRs, not commits to main |
|
|
128
144
|
| **Briefing Mode** | A terse human-facing anchor fans out verbose worktree correspondents, then briefs you on cue |
|
|
129
|
-
| **
|
|
130
|
-
| **Git Worktrees** | Same project, multiple branches, parallel agents |
|
|
145
|
+
| **Voice** | Push-to-talk in, neural TTS out on CPU (Kokoro); voice cloning via a self-hosted GPU shim; global macOS hotkeys dictate to a background session from any app |
|
|
131
146
|
| **Remote Machines** | SSH into GPU servers and talk to agents there |
|
|
132
|
-
| **
|
|
133
|
-
| **Safety Hooks** | 300+ dangerous commands blocked (rm -rf, force push, etc.) |
|
|
147
|
+
| **Safety Hooks** | 300+ dangerous commands blocked (rm -rf, force push, etc.), all logged |
|
|
134
148
|
| **Outbound Channels** | Email (Resend) + SMS (Quo / OpenPhone) for cross-device notifications |
|
|
135
149
|
| **Session Roles** | Leader/worker patterns for multi-agent workflows |
|
|
136
150
|
|
|
@@ -144,13 +158,13 @@ agentwire new -s myproject -p ~/projects/myproject
|
|
|
144
158
|
```
|
|
145
159
|
|
|
146
160
|
**2. Open the portal:**
|
|
147
|
-
Visit `http://127.0.0.1:8765` in Chrome (or your phone/tablet with LAN access configured)
|
|
161
|
+
Visit `http://127.0.0.1:8765` in Chrome (or your phone/tablet with LAN access configured). Each session is a window — open as many as you want and **Tab** between them, or **F3** for the collage grid.
|
|
148
162
|
|
|
149
|
-
**3.
|
|
150
|
-
|
|
163
|
+
**3. Drive it by keyboard:**
|
|
164
|
+
**Cmd/Ctrl+K** runs any action; quick-action keys send to the focused session; branch a session into a worktree for parallel work; put repeat jobs on the scheduler.
|
|
151
165
|
|
|
152
|
-
**4.
|
|
153
|
-
|
|
166
|
+
**4. Add voice on top:**
|
|
167
|
+
Hold the mic to speak (in instant mode the transcript appears for a quick glance — Enter sends it), and agent responses are spoken back — Kokoro neural voice out of the box, so you can drive sessions and hear summaries by ear while your eyes are elsewhere.
|
|
154
168
|
|
|
155
169
|
---
|
|
156
170
|
|
|
@@ -370,10 +370,17 @@ complete | incomplete | error
|
|
|
370
370
|
echo "[$(date -Iseconds)] TASK-ORPHAN: killing tmux session" >> "$dlog"
|
|
371
371
|
tmux kill-session -t "$tmux_session" 2>/dev/null &
|
|
372
372
|
) &
|
|
373
|
-
|
|
374
|
-
#
|
|
375
|
-
|
|
376
|
-
|
|
373
|
+
else
|
|
374
|
+
# Pane-0 session went idle: tell its parent. Resolution lives inside
|
|
375
|
+
# notify-parent (prompt_router.resolve_parent) so all three precedence
|
|
376
|
+
# sources are honored — worker pane → pane 0, creator recorded at
|
|
377
|
+
# `agentwire new` time (session metadata), then `.agentwire.yml parent:`.
|
|
378
|
+
# The old code passed only the .agentwire.yml value and skipped the call
|
|
379
|
+
# entirely when it was empty, so worktree / `agentwire new` children
|
|
380
|
+
# (whose parent lives in metadata, not config) never notified anyone.
|
|
381
|
+
# TMUX_PANE is inherited, so the CLI knows which session this is; a
|
|
382
|
+
# top-level session resolves to no parent and this is a harmless no-op.
|
|
383
|
+
$AGENTWIRE notify-parent --on-idle -q "is idle and done working" 2>/dev/null &
|
|
377
384
|
fi
|
|
378
385
|
fi
|
|
379
386
|
fi
|
|
@@ -51,11 +51,30 @@ def cmd_notify_parent(args) -> int:
|
|
|
51
51
|
current_session = pane_manager.get_current_session()
|
|
52
52
|
current_pane = pane_manager.get_current_pane_index()
|
|
53
53
|
|
|
54
|
-
#
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
# --on-idle: the idle hook is reporting that a pane-0 session went idle.
|
|
55
|
+
# Infrastructure services (portal, tts/stt, scheduler, the idle-nag bridge,
|
|
56
|
+
# custom services) cycle active→idle constantly and are NOT delegated work,
|
|
57
|
+
# so they must never fire a "child finished" ping at their parent. A
|
|
58
|
+
# worktree / `agentwire new` child is not a service and is unaffected.
|
|
59
|
+
if getattr(args, 'on_idle', False) and current_session:
|
|
60
|
+
from agentwire import services
|
|
61
|
+
|
|
62
|
+
if services.is_service_session(current_session):
|
|
63
|
+
return _output_result(True, json_mode, "", skipped="service-session")
|
|
64
|
+
|
|
65
|
+
# If no explicit target, resolve the parent through the SAME precedence the
|
|
66
|
+
# prompt router uses (worker pane → pane 0; else creator recorded at
|
|
67
|
+
# `agentwire new` time; else `.agentwire.yml parent:`). The old path looked
|
|
68
|
+
# only at `.agentwire.yml`, so a worktree/`agentwire new` child — whose
|
|
69
|
+
# parent lives in session metadata, not config — resolved to nothing and its
|
|
70
|
+
# idle notification silently dropped (the parent never heard the child go
|
|
71
|
+
# idle). resolve_parent reads the creator metadata, closing that gap.
|
|
72
|
+
if not target_session and current_session is not None and current_pane is not None:
|
|
73
|
+
from agentwire import prompt_router
|
|
74
|
+
|
|
75
|
+
resolved = prompt_router.resolve_parent(current_session, current_pane)
|
|
76
|
+
if resolved:
|
|
77
|
+
target_session = resolved[0]
|
|
59
78
|
|
|
60
79
|
# Build notification message (--raw sends verbatim — queued messages
|
|
61
80
|
# already carry their own [WORKER SUMMARY ...] / [PROMPT ...] headers)
|
|
@@ -255,6 +274,9 @@ def register_notify_parser(subparsers) -> None:
|
|
|
255
274
|
notify_cmd_parser.add_argument("-q", "--quiet", action="store_true", help="Suppress output")
|
|
256
275
|
notify_cmd_parser.add_argument("--raw", action="store_true",
|
|
257
276
|
help="Send the message verbatim (no [NOTIFY from ...] prefix)")
|
|
277
|
+
notify_cmd_parser.add_argument("--on-idle", dest="on_idle", action="store_true",
|
|
278
|
+
help="Idle-hook mode: suppress the notify if the current session "
|
|
279
|
+
"is an infrastructure service (they cycle idle constantly)")
|
|
258
280
|
notify_cmd_parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
259
281
|
notify_cmd_parser.set_defaults(func=cmd_notify_parent)
|
|
260
282
|
|
|
@@ -186,13 +186,17 @@ def cmd_send(args) -> int:
|
|
|
186
186
|
|
|
187
187
|
if verify:
|
|
188
188
|
# Same delivery verification as --wait-ready, but without waiting for a
|
|
189
|
-
# fresh-boot banner — for an already-running session,
|
|
190
|
-
#
|
|
191
|
-
#
|
|
192
|
-
#
|
|
189
|
+
# fresh-boot banner — for an already-running session, confirm the paste
|
|
190
|
+
# landed AND submitted. retries=1: a whole-send retry only fires when the
|
|
191
|
+
# paste never landed in the box (phase 1 of _deliver_once) — i.e. it
|
|
192
|
+
# genuinely vanished, so re-pasting can't double-deliver. Once text has
|
|
193
|
+
# landed, _deliver_once re-presses Enter in place (never re-pastes), so
|
|
194
|
+
# the old double-delivery worry the retries=0 choice guarded against
|
|
195
|
+
# can't happen anymore. Staying patient here is what keeps a laggy host
|
|
196
|
+
# from surfacing a false failure the parent has to clean up by hand.
|
|
193
197
|
from agentwire.session_ready import send_verified
|
|
194
198
|
|
|
195
|
-
ok = send_verified(session, prompt, retries=
|
|
199
|
+
ok = send_verified(session, prompt, retries=1)
|
|
196
200
|
if json_mode:
|
|
197
201
|
print(json.dumps({"success": True, "session": session_full, "machine": None,
|
|
198
202
|
"verified": ok,
|
|
@@ -78,6 +78,42 @@ def notifications_session_name() -> str:
|
|
|
78
78
|
)
|
|
79
79
|
|
|
80
80
|
|
|
81
|
+
# Built-in infrastructure sessions — the Python mirror of the frontend's
|
|
82
|
+
# SERVICE_SESSIONS allowlist (static/js/service-classification.js). These are
|
|
83
|
+
# long-lived services, not delegated work, so they must never fire a
|
|
84
|
+
# "child finished" idle notification at a parent (the idle-nag bridge alone
|
|
85
|
+
# cycles active→idle ~1440×/day). Kept in lockstep with the JS set.
|
|
86
|
+
_BUILTIN_SERVICE_SESSIONS = frozenset({
|
|
87
|
+
"agentwire-portal",
|
|
88
|
+
"agentwire-tts",
|
|
89
|
+
"agentwire-stt",
|
|
90
|
+
"agentwire-kokoro",
|
|
91
|
+
"agentwire-scheduler",
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def is_service_session(name: str) -> bool:
|
|
96
|
+
"""Is *name* an infrastructure service session (vs. a working session)?
|
|
97
|
+
|
|
98
|
+
True for the built-in infra sessions, the configurable idle-nag bridge, and
|
|
99
|
+
any user-defined custom service. Used to suppress idle parent-notifications
|
|
100
|
+
for services — a worktree / `agentwire new` child is NOT a service and still
|
|
101
|
+
notifies. Name-only and dependency-light so the idle hook can call it cheaply
|
|
102
|
+
on every idle event.
|
|
103
|
+
"""
|
|
104
|
+
bare = (name or "").split("@")[0]
|
|
105
|
+
if not bare:
|
|
106
|
+
return False
|
|
107
|
+
if bare in _BUILTIN_SERVICE_SESSIONS or bare == notifications_session_name():
|
|
108
|
+
return True
|
|
109
|
+
try:
|
|
110
|
+
from .config import load_config
|
|
111
|
+
|
|
112
|
+
return any(s.name == bare for s in load_config().services.custom)
|
|
113
|
+
except Exception:
|
|
114
|
+
return False
|
|
115
|
+
|
|
116
|
+
|
|
81
117
|
def _source_dir() -> str:
|
|
82
118
|
"""agentwire source dir (dev.source_dir), project for built-in services."""
|
|
83
119
|
try:
|
|
@@ -25,11 +25,21 @@ VERIFY_SCROLLBACK_LINES = 200
|
|
|
25
25
|
# Enter to dismiss its ``[Pasted text]`` banner before submitting).
|
|
26
26
|
POLL_INTERVAL = 0.15
|
|
27
27
|
# Max wait for a paste to appear in the input box before giving up on this try.
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
# Generous because under host load tmux ``capture-pane`` itself lags and a large
|
|
29
|
+
# paste renders slowly — a tight budget here is the #1 cause of "the text landed
|
|
30
|
+
# but delivery reported failure" on a bogged-down machine.
|
|
31
|
+
LAND_TIMEOUT = 8.0
|
|
32
|
+
# Max wait, after a single Enter, for the box to clear (the keystroke to
|
|
33
|
+
# register). Per-press, not the whole submit phase — see SUBMIT_BUDGET.
|
|
34
|
+
SUBMIT_TIMEOUT = 4.0
|
|
35
|
+
# Wall-clock ceiling on the whole press-Enter-and-confirm phase. Re-pressing is
|
|
36
|
+
# driven by this deadline rather than a fixed count so a laggy box is waited out
|
|
37
|
+
# (each idle Enter on an already-submitted/empty box is a harmless no-op), but a
|
|
38
|
+
# genuinely wedged session still fails in bounded time instead of hanging.
|
|
39
|
+
SUBMIT_BUDGET = 20.0
|
|
40
|
+
# Floor on re-presses regardless of how fast the budget burns (slow snapshots
|
|
41
|
+
# can eat the wall-clock before we've pressed Enter enough times).
|
|
42
|
+
MIN_ENTER_ATTEMPTS = 4
|
|
33
43
|
|
|
34
44
|
# Substrings that mean "Claude is actively working" — a spinner footer, the
|
|
35
45
|
# token counter, the esc-to-interrupt hint, or tool-output glyphs. A
|
|
@@ -259,19 +269,27 @@ def _deliver_once(
|
|
|
259
269
|
if not _poll(landed_or_done, LAND_TIMEOUT):
|
|
260
270
|
return False
|
|
261
271
|
|
|
262
|
-
# Phase 2 — press Enter and confirm the box cleared.
|
|
263
|
-
#
|
|
264
|
-
# Enter (dismiss the ``[Pasted text]``
|
|
265
|
-
|
|
272
|
+
# Phase 2 — press Enter and confirm the box cleared. Re-press is driven by a
|
|
273
|
+
# wall-clock budget, not a fixed count: a single Enter can be swallowed under
|
|
274
|
+
# load, a large paste needs a second Enter (dismiss the ``[Pasted text]``
|
|
275
|
+
# banner, then submit), and on a bogged-down host the box renders slowly. We
|
|
276
|
+
# keep pressing until the box clears or SUBMIT_BUDGET elapses — an idle Enter
|
|
277
|
+
# on an already-submitted/empty box is a harmless no-op, so over-pressing is
|
|
278
|
+
# safe, while a tight count would give up before a laggy box ever caught up.
|
|
279
|
+
deadline = time.time() + SUBMIT_BUDGET
|
|
280
|
+
attempts = 0
|
|
281
|
+
while True:
|
|
266
282
|
if submitted(_snapshot(session, pane_index), message, marker):
|
|
267
283
|
return True
|
|
268
284
|
press_enter(session, pane_index=pane_index)
|
|
285
|
+
attempts += 1
|
|
269
286
|
if _poll(
|
|
270
287
|
lambda: submitted(_snapshot(session, pane_index), message, marker),
|
|
271
288
|
SUBMIT_TIMEOUT,
|
|
272
289
|
):
|
|
273
290
|
return True
|
|
274
|
-
|
|
291
|
+
if attempts >= MIN_ENTER_ATTEMPTS and time.time() >= deadline:
|
|
292
|
+
return False
|
|
275
293
|
|
|
276
294
|
|
|
277
295
|
def send_verified(
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"announcements": [
|
|
3
|
+
{
|
|
4
|
+
"id": "2026-06-cockpit-positioning",
|
|
5
|
+
"placement": "modal",
|
|
6
|
+
"emoji": "🛩️",
|
|
7
|
+
"title": "Stop babysitting one agent. Command a fleet.",
|
|
8
|
+
"date": "2026-06-29",
|
|
9
|
+
"body": "Here's how to think about AgentWire: it's a self-hosted, keyboard-driven cockpit for running a whole fleet of Claude Code agents at once — not a voice toy with sessions bolted on. The capabilities compound. Every session is a window (F3 collage, Tab to cycle); the command palette (Cmd/Ctrl+K) runs any action; worktree sessions isolate parallel work; the scheduler runs recurring jobs unattended as draft PRs. Voice is a layer that stacks on all of it — push-to-talk in, spoken summaries by ear while you're off-tab, and global macOS hotkeys to dictate to a background session from any app. One person commands many agents instead of babysitting one.",
|
|
10
|
+
"highlights": [
|
|
11
|
+
"From a wall of tmux panes to one cockpit — the pieces compound",
|
|
12
|
+
"Every session is a window: F3 collage, Tab to cycle, Cmd/Ctrl+K for any action",
|
|
13
|
+
"Worktrees + scheduler + council run parallel and unattended work",
|
|
14
|
+
"Voice is a compounding layer, not the headline"
|
|
15
|
+
],
|
|
16
|
+
"cta": {
|
|
17
|
+
"label": "Press F1 for the full tour",
|
|
18
|
+
"url": "https://github.com/dotdevdotdev/agentwire-dev"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
3
21
|
{
|
|
4
22
|
"id": "2026-06-help-modal",
|
|
5
23
|
"placement": "modal",
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
|
7
7
|
<meta http-equiv="Pragma" content="no-cache">
|
|
8
8
|
<meta http-equiv="Expires" content="0">
|
|
9
|
+
<meta name="description" content="A self-hosted, keyboard-driven cockpit for running a whole fleet of Claude Code agents at once. Your machine, your keys, no telemetry.">
|
|
10
|
+
<meta property="og:title" content="AgentWire">
|
|
11
|
+
<meta property="og:description" content="A self-hosted, keyboard-driven cockpit for running a whole fleet of Claude Code agents at once. Worktrees, command palette, scheduler, voice — every layer stacks.">
|
|
9
12
|
<link rel="icon" type="image/png" href="/static/favicon.png">
|
|
10
13
|
<link rel="manifest" href="/manifest.webmanifest">
|
|
11
14
|
<link rel="apple-touch-icon" href="/static/img/icon-192.png">
|
|
@@ -37,6 +37,18 @@ Depth-1 and local-machine only. Remote (`@machine`) parents are out of scope:
|
|
|
37
37
|
each machine's own watchdog sweeps its panes; cross-machine delivery falls
|
|
38
38
|
back to human-only.
|
|
39
39
|
|
|
40
|
+
**Idle notifications use the same resolution.** When a pane-0 session goes idle,
|
|
41
|
+
`idle-handler.sh` calls `agentwire notify-parent --on-idle`, which resolves the
|
|
42
|
+
parent through the precedence above — so a worktree / `agentwire new` child whose
|
|
43
|
+
parent lives in **creator metadata** (not `.agentwire.yml`) now correctly pings
|
|
44
|
+
its spawner on completion. Earlier the idle hook read only the `.agentwire.yml`
|
|
45
|
+
`parent:` field and silently dropped the notification when it was empty.
|
|
46
|
+
`--on-idle` additionally suppresses the ping when the source is an infrastructure
|
|
47
|
+
**service** (`services.is_service_session` — portal/tts/stt/kokoro/scheduler, the
|
|
48
|
+
idle-nag bridge, custom services); those cycle active→idle constantly and aren't
|
|
49
|
+
delegated work. Worker-pane (`notify-parent` from pane > 0) and explicit `--to`
|
|
50
|
+
callers skip the service check.
|
|
51
|
+
|
|
40
52
|
## Delivery safety
|
|
41
53
|
|
|
42
54
|
Every delivery goes through `safe_deliver()` (also used by
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|