agentwire-dev 1.35.1__tar.gz → 1.37.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.35.1 → agentwire_dev-1.37.0}/PKG-INFO +3 -2
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/README.md +2 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/__init__.py +1 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/__main__.py +205 -41
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/agents/tmux.py +2 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/channels/email.py +11 -7
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/channels/quo.py +12 -7
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/config.py +67 -14
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/history.py +2 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/agentwire-permission.sh +20 -2
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/idle-handler.sh +21 -3
- agentwire_dev-1.37.0/agentwire/hooks/queue-processor.sh +105 -0
- agentwire_dev-1.37.0/agentwire/inbox.py +385 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/limits_cli.py +37 -11
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/mcp_server.py +61 -0
- agentwire_dev-1.37.0/agentwire/msg_cli.py +163 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/project_config.py +52 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/projects.py +2 -1
- agentwire_dev-1.37.0/agentwire/prompt_router.py +768 -0
- agentwire_dev-1.37.0/agentwire/prompts_cli.py +126 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/__init__.py +41 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/agentwire.md +5 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/council-member.md +1 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/orchestrator.md +1 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/worker.md +1 -0
- agentwire_dev-1.37.0/agentwire/roles/worktree-mission.md +35 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/security.py +2 -2
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/server.py +160 -64
- agentwire_dev-1.37.0/agentwire/ssh.py +100 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/css/desktop.css +20 -0
- agentwire_dev-1.37.0/agentwire/static/css/mobile.css +558 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/command-palette.js +1 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/desktop.js +4 -3
- agentwire_dev-1.37.0/agentwire/static/js/mobile.js +575 -0
- agentwire_dev-1.37.0/agentwire/static/js/service-classification.js +43 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/session-window.js +3 -2
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/sidebar/services-section.js +2 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/sidebar/sessions-section.js +2 -24
- agentwire_dev-1.37.0/agentwire/stt/__init__.py +67 -0
- agentwire_dev-1.37.0/agentwire/stt/cloud.py +107 -0
- agentwire_dev-1.37.0/agentwire/stt/engine.py +171 -0
- agentwire_dev-1.37.0/agentwire/stt/stt_server.py +136 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/templates/desktop.html +1 -0
- agentwire_dev-1.37.0/agentwire/templates/mobile.html +52 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tunnels.py +17 -8
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/usage_limit.py +5 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/validation.py +7 -3
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/INDEX.md +18 -3
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/architecture.md +2 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/communication/channels.md +11 -7
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/deployment/remote-machines.md +92 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/glossary.md +1 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/missions.md +2 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/quickstart.md +11 -5
- agentwire_dev-1.37.0/docs/wiki/research/orchestration-transport-alternatives.md +176 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/scheduling/scheduled-workloads.md +1 -1
- agentwire_dev-1.37.0/docs/wiki/security/secrets.md +90 -0
- agentwire_dev-1.37.0/docs/wiki/sessions/messaging.md +115 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/sessions/pi.md +17 -9
- agentwire_dev-1.37.0/docs/wiki/sessions/prompt-routing.md +127 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/usage-limit-recovery.md +5 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/voice/shim-contract.md +16 -14
- agentwire_dev-1.37.0/docs/wiki/voice/stt-cloud.md +69 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/voice/stt-self-hosted.md +7 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_build_agent_command.py +36 -6
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_channels.py +37 -15
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_config.py +27 -5
- agentwire_dev-1.37.0/tests/unit/test_inbox.py +244 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_portal_api.py +250 -1
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_project_config.py +51 -0
- agentwire_dev-1.37.0/tests/unit/test_prompt_router.py +844 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_roles.py +98 -0
- agentwire_dev-1.37.0/tests/unit/test_ssh.py +110 -0
- agentwire_dev-1.37.0/tests/unit/test_stt_cloud.py +149 -0
- agentwire_dev-1.37.0/tests/unit/test_stt_engine.py +98 -0
- agentwire_dev-1.37.0/tests/unit/test_task_cli.py +70 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_terminal_resize.py +6 -3
- agentwire_dev-1.37.0/tests/unit/test_validation.py +40 -0
- agentwire_dev-1.35.1/agentwire/hooks/queue-processor.sh +0 -78
- agentwire_dev-1.35.1/agentwire/stt/__init__.py +0 -36
- agentwire_dev-1.35.1/agentwire/stt/stt_server.py +0 -246
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/.github/FUNDING.yml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/.github/workflows/tts-smoke.yml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/.gitignore +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/CHANGELOG.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/CLA.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/CODE_OF_CONDUCT.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/CONTRIBUTING.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/Dockerfile.local +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/Dockerfile.runpod +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/LICENSE +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/RELEASING.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/SECURITY.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/SPONSORS.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/agents/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/agents/base.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/cached_status.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/channels/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/channels/base.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/cli_safety.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/completion.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/council/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/council/cli.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/council/inbox.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/council/state.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/fetch.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/handoff/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/handoff/git_state.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/handoff/instructions.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/handoff/parser.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/handoff/renderer.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/handoff/schema.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/audit_logger.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/listen.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/locking.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/missions/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/missions/cli.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/missions/config.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/missions/dispatcher.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/missions/eligibility.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/missions/feedback_router.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/missions/gc.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/missions/github.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/missions/naming.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/missions/state.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/network.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/onboarding.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/overnight.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/pane_manager.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/prompts/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/prompts/init.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/chatbot.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/council-brain.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/council-conscience.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/council-critic.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/council-devils-advocate.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/council-gut.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/council-historian.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/council-orchestrator.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/init.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/notifications.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/soul.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/task-runner.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/roles/voice.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/safety/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/safety/_core.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/scheduler.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/scratchpad.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/services.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/session_ready.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-Echo--black.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-Echo--transparent.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-Echo.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-email-banner.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers--full--transparent-top.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers--full-black.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers--telephone-fg.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers--transparent-top.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers--transparent.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/agentwire-splash-logo-layers.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/announcements.json +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/favicon.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/android.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/automaton.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/bot.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/cyborg.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/droid.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/drone.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/guardian.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/mech.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/probe.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/robot.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/sentinel.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/machines/unit.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/blob.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/cloud.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/crystal.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/cyclops.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/flame.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/fuzzy.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/horned.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/moon.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/slime.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/star.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/tentacle.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/projects/winged.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/bear.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/cat.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/crown.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/custom/agentwire-portal.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/custom/agentwire-tts.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/custom/agentwire.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/deer.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/drone.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/eagle.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/fox.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/hawk.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/horse.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/lion.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/rabbit.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/robot.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/tiger.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/icons/sessions/wolf.jpeg +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/.gitkeep +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/announcement-modal.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/api.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/artifact-window.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/collage.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/components/icon-picker.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/components/list-card.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/components/type-tag.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/dead-key-suppressor.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/desktop-manager.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/icon-manager.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/notification-prefs.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/notifications-panel.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/safety-shared.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/safety-window.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/scratchpad.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/session-id.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/sidebar/config-section.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/sidebar/missions-section.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/sidebar.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/tile-manager.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/token-modal.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/utils/ansi.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/utils/auto-refresh.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/voice/browser-stt.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/voice/browser-tts.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/voice/jargon.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/voice/prompt.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/stt/base.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/stt/server_backend.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tasks.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/templates/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/templates/base.html +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/templates/email_notification.html +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/templates/tmux.conf +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/templating.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tooldefs/aws.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tooldefs/docker.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tooldefs/gcp.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tooldefs/gh.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tooldefs/git.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tooldefs/gws.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tooldefs/kubectl.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tooldefs/npm.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tooldefs/terraform.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tooldefs/uv.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/audio.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/base.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/engines/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/engines/chatterbox.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/engines/kokoro.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/engines/qwen_base.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/engines/qwen_custom.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/engines/qwen_design.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/engines/zonos.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/local.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts/registry.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/tts_server.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/utils/__init__.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/utils/chunker.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/utils/file_io.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/utils/paths.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/utils/speech.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/utils/subprocess.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/voiceclone.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/voices/darren.wav +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/voices/default.wav +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/voices/jessica.wav +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/voices/lisa.wav +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/voices/may.wav +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/agentwire/worktree.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/decisions/obsidian-second-brain.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/logo.png +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/communication/hammerspoon.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/communication/handoff.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/concepts.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/council.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/deployment/remote-access.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/internals/damage-control.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/internals/portal.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/internals/shell-escaping.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/internals/troubleshooting.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/internals/window-collage.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/services.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/sessions/window-sizing.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/docs/wiki/voice/tts-self-hosted.md +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/pyproject.toml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/requirements-tts.txt +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/templates/launchd/dev.agentwire.mission-dispatcher.plist +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/templates/launchd/dev.agentwire.mission-feedback-router.plist +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/templates/launchd/dev.agentwire.mission-janitor.plist +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/conftest.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/e2e/test_portal_ui.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/fixtures/sample_agentwire.yml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/fixtures/sample_config.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/fixtures/sample_scheduler.yaml +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/integration/test_missions_concurrency.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/integration/test_missions_lifecycle.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/integration/test_scheduler_board.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/integration/test_server_websockets.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_announcements.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_cli_commands.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_cli_output.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_cli_safety.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_council_cli.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_council_inbox.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_council_state.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_damage_control_hooks.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_damage_control_sync.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_file_io.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_handoff_git_state.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_handoff_instructions.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_handoff_parser.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_handoff_renderer.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_history.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_hooks_install.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_idle_handler.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_locking.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_mcp_server.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_mcp_tools_args.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_missions_cli.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_missions_config.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_missions_dispatcher.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_missions_eligibility.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_missions_feedback_router.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_missions_gc.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_missions_github.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_missions_naming.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_missions_state.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_overnight_resume_flags.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_safety_disabled_rules.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_safety_escape_hatch.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_safety_kill_switch.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_safety_mission_worker.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_scheduler.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_scheduler_parsing.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_scratchpad.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_security.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_server_async.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_server_pure.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_services.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_session_ready.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_speech_tags.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_stt_backend.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_tasks.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_templating.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_tmux_template.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_tts_engine_resolution.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_tts_local.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_usage_limit.py +0 -0
- {agentwire_dev-1.35.1 → agentwire_dev-1.37.0}/tests/unit/test_worktree.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentwire-dev
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.37.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
|
|
@@ -849,7 +849,8 @@ Agent responses are spoken back — Kokoro neural voice out of the box, or any T
|
|
|
849
849
|
AgentWire supports orchestrator/worker patterns for complex tasks:
|
|
850
850
|
|
|
851
851
|
```yaml
|
|
852
|
-
# .agentwire.yml in your project
|
|
852
|
+
# .agentwire.yml in your project (keep it gitignored — it's personal config,
|
|
853
|
+
# and tracked copies break worktree dispatch; agentwire adds it to .gitignore for you)
|
|
853
854
|
type: claude-bypass
|
|
854
855
|
roles:
|
|
855
856
|
- agentwire
|
|
@@ -128,7 +128,8 @@ Agent responses are spoken back — Kokoro neural voice out of the box, or any T
|
|
|
128
128
|
AgentWire supports orchestrator/worker patterns for complex tasks:
|
|
129
129
|
|
|
130
130
|
```yaml
|
|
131
|
-
# .agentwire.yml in your project
|
|
131
|
+
# .agentwire.yml in your project (keep it gitignored — it's personal config,
|
|
132
|
+
# and tracked copies break worktree dispatch; agentwire adds it to .gitignore for you)
|
|
132
133
|
type: claude-bypass
|
|
133
134
|
roles:
|
|
134
135
|
- agentwire
|
|
@@ -36,7 +36,15 @@ from .project_config import (
|
|
|
36
36
|
normalize_session_type,
|
|
37
37
|
save_project_config,
|
|
38
38
|
)
|
|
39
|
-
from .roles import
|
|
39
|
+
from .roles import (
|
|
40
|
+
WORKTREE_MISSION_ROLE,
|
|
41
|
+
RoleConfig,
|
|
42
|
+
inject_soul,
|
|
43
|
+
inject_worktree_mission,
|
|
44
|
+
load_roles,
|
|
45
|
+
merge_roles,
|
|
46
|
+
render_mission_placeholders,
|
|
47
|
+
)
|
|
40
48
|
from .worktree import ensure_worktree, parse_session_name, remove_worktree
|
|
41
49
|
|
|
42
50
|
# Default config directory
|
|
@@ -193,10 +201,20 @@ def build_agent_command(session_type: str, roles: list[RoleConfig] | None = None
|
|
|
193
201
|
raise ValueError(
|
|
194
202
|
f"No config for pi provider '{provider}'. "
|
|
195
203
|
f"Add pi.providers.{provider} to ~/.agentwire/config.yaml "
|
|
196
|
-
f"with at least env_var
|
|
204
|
+
f"with at least env_var and default_model, and put the key "
|
|
205
|
+
f"itself in ~/.agentwire/.env (docs/wiki/security/secrets.md)."
|
|
197
206
|
)
|
|
198
207
|
env_var = provider_cfg.get("env_var", f"{provider.upper().replace('-', '_')}_API_KEY")
|
|
199
|
-
|
|
208
|
+
if provider_cfg.get("api_key"):
|
|
209
|
+
print(
|
|
210
|
+
f"Warning: pi.providers.{provider}.api_key in config.yaml is "
|
|
211
|
+
f"ignored — put {env_var}=... in ~/.agentwire/.env instead "
|
|
212
|
+
f"(docs/wiki/security/secrets.md)",
|
|
213
|
+
file=sys.stderr,
|
|
214
|
+
)
|
|
215
|
+
# The key comes from the process environment — ~/.agentwire/.env is
|
|
216
|
+
# loaded on every entry point, so one line there is all it takes.
|
|
217
|
+
api_key = os.environ.get(env_var, "")
|
|
200
218
|
default_model = provider_cfg.get("default_model", "")
|
|
201
219
|
|
|
202
220
|
# Merge provider key + any global pi extra_env
|
|
@@ -2418,32 +2436,38 @@ def cmd_notify_parent(args) -> int:
|
|
|
2418
2436
|
if parent:
|
|
2419
2437
|
target_session = parent
|
|
2420
2438
|
|
|
2421
|
-
# Build notification message
|
|
2422
|
-
|
|
2423
|
-
if
|
|
2424
|
-
notification =
|
|
2439
|
+
# Build notification message (--raw sends verbatim — queued messages
|
|
2440
|
+
# already carry their own [WORKER SUMMARY ...] / [PROMPT ...] headers)
|
|
2441
|
+
if getattr(args, 'raw', False):
|
|
2442
|
+
notification = text
|
|
2425
2443
|
else:
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
if target_session:
|
|
2430
|
-
if target_session == current_session and current_pane == 0:
|
|
2431
|
-
print("Cannot notify own pane", file=sys.stderr)
|
|
2432
|
-
return 1
|
|
2433
|
-
pane_manager.send_to_pane(target_session, 0, notification)
|
|
2434
|
-
if not getattr(args, 'quiet', False):
|
|
2435
|
-
print(f"Notified {target_session}")
|
|
2436
|
-
elif current_pane is not None and current_pane > 0 and current_session:
|
|
2437
|
-
pane_manager.send_to_pane(current_session, 0, notification)
|
|
2438
|
-
if not getattr(args, 'quiet', False):
|
|
2439
|
-
print(f"Notified {current_session} pane 0")
|
|
2444
|
+
source = current_session or "unknown"
|
|
2445
|
+
if current_pane is not None and current_pane > 0:
|
|
2446
|
+
notification = f"[NOTIFY from {source} pane {current_pane}] {text}"
|
|
2440
2447
|
else:
|
|
2441
|
-
|
|
2448
|
+
notification = f"[NOTIFY from {source}] {text}"
|
|
2449
|
+
|
|
2450
|
+
if target_session:
|
|
2451
|
+
if target_session == current_session and current_pane == 0:
|
|
2452
|
+
print("Cannot notify own pane", file=sys.stderr)
|
|
2442
2453
|
return 1
|
|
2443
|
-
|
|
2444
|
-
|
|
2454
|
+
elif current_pane is not None and current_pane > 0 and current_session:
|
|
2455
|
+
target_session = current_session
|
|
2456
|
+
else:
|
|
2457
|
+
print("No target session (set 'parent' in .agentwire.yml or use --to)", file=sys.stderr)
|
|
2445
2458
|
return 1
|
|
2446
2459
|
|
|
2460
|
+
# safe_deliver refuses targets where a paste could do damage (live
|
|
2461
|
+
# dialog on screen, bare shell, parked session) and verifies the paste
|
|
2462
|
+
# actually landed. Callers (queue processor) retry on failure.
|
|
2463
|
+
from agentwire import prompt_router
|
|
2464
|
+
|
|
2465
|
+
delivered, reason = prompt_router.safe_deliver(target_session, 0, notification)
|
|
2466
|
+
if not delivered:
|
|
2467
|
+
print(f"Notification not delivered to {target_session}: {reason}", file=sys.stderr)
|
|
2468
|
+
return 1
|
|
2469
|
+
if not getattr(args, 'quiet', False):
|
|
2470
|
+
print(f"Notified {target_session}")
|
|
2447
2471
|
return 0
|
|
2448
2472
|
|
|
2449
2473
|
|
|
@@ -2843,6 +2867,23 @@ def store_session_metadata(session_name: str, metadata: dict) -> None:
|
|
|
2843
2867
|
pass
|
|
2844
2868
|
|
|
2845
2869
|
|
|
2870
|
+
def _record_session_creator(session_name: str, created_by: str | None, via: str) -> None:
|
|
2871
|
+
"""Record which session created this one (merge-preserving).
|
|
2872
|
+
|
|
2873
|
+
The creator becomes the session's parent for prompt routing
|
|
2874
|
+
(prompt_router.resolve_parent), winning over .agentwire.yml `parent:`.
|
|
2875
|
+
"""
|
|
2876
|
+
if not created_by or created_by == session_name.split("@")[0]:
|
|
2877
|
+
return
|
|
2878
|
+
metadata = load_session_metadata(session_name)
|
|
2879
|
+
metadata.update({
|
|
2880
|
+
"created_by": created_by,
|
|
2881
|
+
"created_at": datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
|
2882
|
+
"created_via": via,
|
|
2883
|
+
})
|
|
2884
|
+
store_session_metadata(session_name, metadata)
|
|
2885
|
+
|
|
2886
|
+
|
|
2846
2887
|
def cmd_notify(args) -> int:
|
|
2847
2888
|
"""Send a notification to the portal about session/pane state changes.
|
|
2848
2889
|
|
|
@@ -3272,6 +3313,13 @@ def cmd_new(args) -> int:
|
|
|
3272
3313
|
default_role = config.get("session", {}).get("default_role", "agentwire")
|
|
3273
3314
|
role_names = [default_role] if default_role else []
|
|
3274
3315
|
|
|
3316
|
+
# Standing mission briefing for worktree dispatches: cmd_worktree passes
|
|
3317
|
+
# mission_context (branch/cwd/base/creator values) which both opts the
|
|
3318
|
+
# session into the worktree-mission role and templates its placeholders.
|
|
3319
|
+
mission_context = getattr(args, 'mission_context', None)
|
|
3320
|
+
if mission_context:
|
|
3321
|
+
role_names = inject_worktree_mission(role_names)
|
|
3322
|
+
|
|
3275
3323
|
# Always-inject the soul personality role (rides last for recency weight)
|
|
3276
3324
|
role_names = inject_soul(role_names, load_config(), no_soul=getattr(args, 'no_soul', False))
|
|
3277
3325
|
|
|
@@ -3284,6 +3332,11 @@ def cmd_new(args) -> int:
|
|
|
3284
3332
|
if missing:
|
|
3285
3333
|
return _output_result(False, json_mode, f"Roles not found: {', '.join(missing)}")
|
|
3286
3334
|
|
|
3335
|
+
if mission_context:
|
|
3336
|
+
for role in roles:
|
|
3337
|
+
if role.name == WORKTREE_MISSION_ROLE:
|
|
3338
|
+
role.instructions = render_mission_placeholders(role.instructions, mission_context)
|
|
3339
|
+
|
|
3287
3340
|
# Parse session name: project, branch, machine
|
|
3288
3341
|
project, branch, machine_id = parse_session_name(name)
|
|
3289
3342
|
|
|
@@ -3657,6 +3710,13 @@ def cmd_new(args) -> int:
|
|
|
3657
3710
|
if not first_message_delivered and not json_mode:
|
|
3658
3711
|
print(f"Warning: first message not delivered to '{session_name}' — paste it manually", file=sys.stderr)
|
|
3659
3712
|
|
|
3713
|
+
# Record the creating session as parent for prompt routing. --created-by
|
|
3714
|
+
# overrides; empty string opts out; default = the calling tmux session.
|
|
3715
|
+
created_by = getattr(args, 'created_by', None)
|
|
3716
|
+
if created_by is None:
|
|
3717
|
+
created_by = pane_manager.get_current_session()
|
|
3718
|
+
_record_session_creator(session_name, created_by, via="new")
|
|
3719
|
+
|
|
3660
3720
|
if json_mode:
|
|
3661
3721
|
result = {
|
|
3662
3722
|
"success": True,
|
|
@@ -4066,6 +4126,15 @@ def cmd_kill(args) -> int:
|
|
|
4066
4126
|
if not json_mode:
|
|
4067
4127
|
print(f"Killed session '{session}'")
|
|
4068
4128
|
|
|
4129
|
+
# Drop session metadata (creator record) so a future unrelated session
|
|
4130
|
+
# reusing this name doesn't inherit a stale parent.
|
|
4131
|
+
metadata_file = CONFIG_DIR / "sessions" / session.split("@")[0] / "metadata.json"
|
|
4132
|
+
if metadata_file.exists():
|
|
4133
|
+
try:
|
|
4134
|
+
metadata_file.unlink()
|
|
4135
|
+
except OSError:
|
|
4136
|
+
pass
|
|
4137
|
+
|
|
4069
4138
|
_notify_portal_sessions_changed()
|
|
4070
4139
|
|
|
4071
4140
|
if json_mode:
|
|
@@ -4435,6 +4504,10 @@ def cmd_send_keys(args) -> int:
|
|
|
4435
4504
|
# Parse session@machine format
|
|
4436
4505
|
session, machine_id = _parse_session_target(session_full)
|
|
4437
4506
|
|
|
4507
|
+
# Optional pane targeting (worker panes); None targets the session.
|
|
4508
|
+
pane = getattr(args, 'pane', None)
|
|
4509
|
+
target = f"{session}.{pane}" if pane is not None else session
|
|
4510
|
+
|
|
4438
4511
|
if machine_id:
|
|
4439
4512
|
# Remote: SSH and run tmux commands
|
|
4440
4513
|
machine = _get_machine_config(machine_id)
|
|
@@ -4443,10 +4516,10 @@ def cmd_send_keys(args) -> int:
|
|
|
4443
4516
|
return 1
|
|
4444
4517
|
|
|
4445
4518
|
# Build remote command with pauses between keys
|
|
4446
|
-
|
|
4519
|
+
quoted_target = shlex.quote(target)
|
|
4447
4520
|
cmd_parts = []
|
|
4448
4521
|
for i, key in enumerate(keys):
|
|
4449
|
-
cmd_parts.append(f"tmux send-keys -t {
|
|
4522
|
+
cmd_parts.append(f"tmux send-keys -t {quoted_target} {shlex.quote(key)}")
|
|
4450
4523
|
if i < len(keys) - 1:
|
|
4451
4524
|
cmd_parts.append("sleep 0.1")
|
|
4452
4525
|
|
|
@@ -4473,14 +4546,14 @@ def cmd_send_keys(args) -> int:
|
|
|
4473
4546
|
# Send each key group with a pause between
|
|
4474
4547
|
for i, key in enumerate(keys):
|
|
4475
4548
|
subprocess.run(
|
|
4476
|
-
["tmux", "send-keys", "-t",
|
|
4549
|
+
["tmux", "send-keys", "-t", target, key],
|
|
4477
4550
|
check=True
|
|
4478
4551
|
)
|
|
4479
4552
|
# Brief pause between key groups (not after last one)
|
|
4480
4553
|
if i < len(keys) - 1:
|
|
4481
4554
|
time.sleep(0.1)
|
|
4482
4555
|
|
|
4483
|
-
print(f"Sent keys to {
|
|
4556
|
+
print(f"Sent keys to {target}")
|
|
4484
4557
|
return 0
|
|
4485
4558
|
|
|
4486
4559
|
|
|
@@ -4726,6 +4799,12 @@ def cmd_worktree(args) -> int:
|
|
|
4726
4799
|
- --ref: detached at a ref. `agentwire worktree review-v2 --ref v2.0.0`
|
|
4727
4800
|
|
|
4728
4801
|
If the worktree already exists, reattaches to the existing session.
|
|
4802
|
+
|
|
4803
|
+
Default/--existing dispatches auto-inject the bundled worktree-mission
|
|
4804
|
+
briefing role (isolation, no live-tool mutation, in-worktree
|
|
4805
|
+
verification, draft-PR + notify-back contract) with branch/cwd/base/
|
|
4806
|
+
creator templated in — opt out with --no-mission. --ref dispatches skip
|
|
4807
|
+
it (detached checkout, nothing to push).
|
|
4729
4808
|
"""
|
|
4730
4809
|
json_mode = getattr(args, 'json', False)
|
|
4731
4810
|
name = args.name
|
|
@@ -4751,13 +4830,42 @@ def cmd_worktree(args) -> int:
|
|
|
4751
4830
|
session_name = f"{project_name}-{name}"
|
|
4752
4831
|
worktree_path = worktree_dir / session_name
|
|
4753
4832
|
|
|
4754
|
-
|
|
4833
|
+
default_base = getattr(args, 'base', None) or wt_config.get("default_base", "main")
|
|
4834
|
+
no_mission = getattr(args, 'no_mission', False)
|
|
4835
|
+
|
|
4836
|
+
def _mission_context(base_branch: str) -> dict | None:
|
|
4837
|
+
"""Values templated into the worktree-mission briefing role.
|
|
4838
|
+
|
|
4839
|
+
None (no briefing) when --no-mission is passed, or for --ref
|
|
4840
|
+
dispatches — a detached review checkout has no branch to push, so
|
|
4841
|
+
the finishing contract doesn't apply.
|
|
4842
|
+
"""
|
|
4843
|
+
if no_mission or ref:
|
|
4844
|
+
return None
|
|
4845
|
+
creator = pane_manager.get_current_session()
|
|
4846
|
+
notify_back = (
|
|
4847
|
+
f'agentwire notify-parent --to {creator} "{session_name}: <one-liner + PR URL>"'
|
|
4848
|
+
if creator else
|
|
4849
|
+
f'agentwire notify-parent "{session_name}: <one-liner + PR URL>"'
|
|
4850
|
+
)
|
|
4851
|
+
return {
|
|
4852
|
+
"session": session_name,
|
|
4853
|
+
"branch": name,
|
|
4854
|
+
"worktree_path": str(worktree_path),
|
|
4855
|
+
"main_checkout": str(project_path),
|
|
4856
|
+
"base_branch": base_branch,
|
|
4857
|
+
"creator": creator or "your creator session",
|
|
4858
|
+
"notify_back": notify_back,
|
|
4859
|
+
}
|
|
4860
|
+
|
|
4861
|
+
def _launch_session(mission_context: dict | None = None):
|
|
4755
4862
|
return cmd_new(type('Args', (), {
|
|
4756
4863
|
'session': session_name, 'path': str(worktree_path), 'json': json_mode,
|
|
4757
4864
|
'force': False, 'bare': False, 'restricted': False, 'prompted': False,
|
|
4758
4865
|
'type': getattr(args, 'type', None), 'roles': getattr(args, 'roles', None),
|
|
4759
4866
|
'instructions': None, 'persist': False,
|
|
4760
4867
|
'env': getattr(args, 'env', None),
|
|
4868
|
+
'mission_context': mission_context,
|
|
4761
4869
|
})())
|
|
4762
4870
|
|
|
4763
4871
|
# If worktree already exists, reattach
|
|
@@ -4769,10 +4877,11 @@ def cmd_worktree(args) -> int:
|
|
|
4769
4877
|
if tmux_session_exists(session_name):
|
|
4770
4878
|
subprocess.run(["tmux", "attach-session", "-t", session_name])
|
|
4771
4879
|
else:
|
|
4772
|
-
return _launch_session()
|
|
4880
|
+
return _launch_session(_mission_context(default_base))
|
|
4773
4881
|
return 0
|
|
4774
4882
|
|
|
4775
4883
|
# Resolve the git ref to create the worktree from
|
|
4884
|
+
pr_base = default_base
|
|
4776
4885
|
if ref:
|
|
4777
4886
|
# --ref mode: detached at a specific ref (tag, commit, branch)
|
|
4778
4887
|
git_ref = ref
|
|
@@ -4794,7 +4903,8 @@ def cmd_worktree(args) -> int:
|
|
|
4794
4903
|
return _output_result(False, json_mode, f"Failed to detect current branch in {project_path}")
|
|
4795
4904
|
base_branch = result.stdout.strip()
|
|
4796
4905
|
else:
|
|
4797
|
-
base_branch =
|
|
4906
|
+
base_branch = default_base
|
|
4907
|
+
pr_base = base_branch
|
|
4798
4908
|
git_ref = f"origin/{base_branch}"
|
|
4799
4909
|
new_branch = name
|
|
4800
4910
|
mode_label = f"new branch {name} from {git_ref}"
|
|
@@ -4841,7 +4951,7 @@ def cmd_worktree(args) -> int:
|
|
|
4841
4951
|
print(f"Created worktree: {worktree_path}")
|
|
4842
4952
|
print(f"Mode: {mode_label}")
|
|
4843
4953
|
|
|
4844
|
-
return _launch_session()
|
|
4954
|
+
return _launch_session(_mission_context(pr_base))
|
|
4845
4955
|
|
|
4846
4956
|
|
|
4847
4957
|
def cmd_fork(args) -> int:
|
|
@@ -6737,6 +6847,45 @@ def cmd_doctor(args) -> int:
|
|
|
6737
6847
|
print(" Fix: agentwire stt start")
|
|
6738
6848
|
print(" If it won't boot: uv pip install --python .venv/bin/python -e '.[stt]'")
|
|
6739
6849
|
issues_found += 1
|
|
6850
|
+
elif getattr(stt_cfg, "backend", "default") == "cloud":
|
|
6851
|
+
cloud_cfg = getattr(stt_cfg, "cloud", None) or {}
|
|
6852
|
+
key_env = cloud_cfg.get("api_key_env", "OPENAI_API_KEY")
|
|
6853
|
+
if os.environ.get(key_env):
|
|
6854
|
+
print(f" [ok] Stt: cloud tier ({key_env} is set)")
|
|
6855
|
+
else:
|
|
6856
|
+
print(f" [!!] Stt: cloud tier but {key_env} is not set")
|
|
6857
|
+
print(" The portal will refuse to start until the key is in its environment.")
|
|
6858
|
+
print(" Fix: add the key to ~/.agentwire/.env (docs/wiki/security/secrets.md)")
|
|
6859
|
+
issues_found += 1
|
|
6860
|
+
|
|
6861
|
+
# 8c. Secrets — for each configured feature that needs a key, report
|
|
6862
|
+
# whether its env var is present. Names only, never values. Keys live in
|
|
6863
|
+
# ~/.agentwire/.env (docs/wiki/security/secrets.md), loaded on every
|
|
6864
|
+
# entry point, so os.environ is the authoritative view here.
|
|
6865
|
+
raw_cfg = load_config()
|
|
6866
|
+
expected_keys: list[tuple[str, list[str]]] = []
|
|
6867
|
+
channels_cfg = raw_cfg.get("channels", {}) or {}
|
|
6868
|
+
if channels_cfg.get("email"):
|
|
6869
|
+
expected_keys.append(("channels.email (Resend)", ["RESEND_API_KEY"]))
|
|
6870
|
+
if channels_cfg.get("quo"):
|
|
6871
|
+
expected_keys.append(
|
|
6872
|
+
("channels.quo (OpenPhone)", ["QUO_API_KEY", "OPENPHONE_API_KEY"])
|
|
6873
|
+
)
|
|
6874
|
+
for pname, pcfg in (raw_cfg.get("pi", {}).get("providers", {}) or {}).items():
|
|
6875
|
+
p_env_var = (pcfg or {}).get(
|
|
6876
|
+
"env_var", f"{pname.upper().replace('-', '_')}_API_KEY"
|
|
6877
|
+
)
|
|
6878
|
+
expected_keys.append((f"pi.providers.{pname}", [p_env_var]))
|
|
6879
|
+
if expected_keys:
|
|
6880
|
+
print("\nChecking secrets (~/.agentwire/.env)...")
|
|
6881
|
+
for feature, candidates in expected_keys:
|
|
6882
|
+
found = next((v for v in candidates if os.environ.get(v)), None)
|
|
6883
|
+
if found:
|
|
6884
|
+
print(f" [ok] {feature}: {found} is set")
|
|
6885
|
+
else:
|
|
6886
|
+
print(f" [!!] {feature}: {' / '.join(candidates)} not set")
|
|
6887
|
+
print(f" Fix: add {candidates[0]}=... to ~/.agentwire/.env")
|
|
6888
|
+
issues_found += 1
|
|
6740
6889
|
|
|
6741
6890
|
# 9. Validate remote machines
|
|
6742
6891
|
print("\nChecking remote machines...")
|
|
@@ -7465,7 +7614,7 @@ _VALID_PROJECT_NAME = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._-]*$")
|
|
|
7465
7614
|
def cmd_projects_create(args) -> int:
|
|
7466
7615
|
"""Create a new local project: make the directory, optionally git-init or clone, and write .agentwire.yml."""
|
|
7467
7616
|
from .config import get_config
|
|
7468
|
-
from .project_config import ProjectConfig, SessionType, save_project_config
|
|
7617
|
+
from .project_config import ProjectConfig, SessionType, ensure_gitignored, save_project_config
|
|
7469
7618
|
|
|
7470
7619
|
name = (args.name or "").strip()
|
|
7471
7620
|
clone_url = (getattr(args, "from_url", None) or "").strip() or None
|
|
@@ -7518,6 +7667,7 @@ def cmd_projects_create(args) -> int:
|
|
|
7518
7667
|
except OSError as e:
|
|
7519
7668
|
return _fail(f"Failed to create directory: {e}")
|
|
7520
7669
|
|
|
7670
|
+
gitignore_updated = ensure_gitignored(project_path)
|
|
7521
7671
|
config = ProjectConfig(type=SessionType.from_str("claude-bypass"), roles=[], voice=None)
|
|
7522
7672
|
if not save_project_config(config, project_path):
|
|
7523
7673
|
return _fail("Created project directory but failed to write .agentwire.yml")
|
|
@@ -7538,6 +7688,8 @@ def cmd_projects_create(args) -> int:
|
|
|
7538
7688
|
print(f" Cloned from: {clone_url}")
|
|
7539
7689
|
elif do_git_init:
|
|
7540
7690
|
print(" Initialized empty git repository")
|
|
7691
|
+
if gitignore_updated:
|
|
7692
|
+
print(" Added .agentwire.yml to .gitignore (personal config — keep it untracked)")
|
|
7541
7693
|
return 0
|
|
7542
7694
|
|
|
7543
7695
|
|
|
@@ -8444,8 +8596,6 @@ def cmd_ensure(args) -> int:
|
|
|
8444
8596
|
print(f" {preview_template(cmd, ctx)}")
|
|
8445
8597
|
print()
|
|
8446
8598
|
|
|
8447
|
-
if task.output.notify:
|
|
8448
|
-
print(f"Notification: {task.output.notify}")
|
|
8449
8599
|
if task.output.save:
|
|
8450
8600
|
print(f"Save output to: {preview_template(task.output.save, ctx)}")
|
|
8451
8601
|
|
|
@@ -9016,7 +9166,7 @@ def cmd_task_show(args) -> int:
|
|
|
9016
9166
|
"pre": [{"name": p.name, "cmd": p.cmd, "required": p.required, "validate": p.validate, "timeout": p.timeout} for p in task.pre],
|
|
9017
9167
|
"on_task_end": task.on_task_end,
|
|
9018
9168
|
"post": task.post,
|
|
9019
|
-
"output": {"capture": task.output.capture, "save": task.output.save
|
|
9169
|
+
"output": {"capture": task.output.capture, "save": task.output.save},
|
|
9020
9170
|
"validation_issues": issues,
|
|
9021
9171
|
})
|
|
9022
9172
|
return 0
|
|
@@ -9055,12 +9205,9 @@ def cmd_task_show(args) -> int:
|
|
|
9055
9205
|
print(f" {cmd}")
|
|
9056
9206
|
print()
|
|
9057
9207
|
|
|
9058
|
-
if task.output.
|
|
9208
|
+
if task.output.save:
|
|
9059
9209
|
print("Output:")
|
|
9060
|
-
|
|
9061
|
-
print(f" Save to: {task.output.save}")
|
|
9062
|
-
if task.output.notify:
|
|
9063
|
-
print(f" Notify: {task.output.notify}")
|
|
9210
|
+
print(f" Save to: {task.output.save}")
|
|
9064
9211
|
|
|
9065
9212
|
if issues:
|
|
9066
9213
|
print(f"\nValidation issues: {', '.join(issues)}")
|
|
@@ -10540,6 +10687,8 @@ def main() -> int:
|
|
|
10540
10687
|
notify_cmd_parser.add_argument("text", nargs="*", help="Notification message")
|
|
10541
10688
|
notify_cmd_parser.add_argument("--to", type=str, metavar="SESSION", help="Target session (default: parent from .agentwire.yml)")
|
|
10542
10689
|
notify_cmd_parser.add_argument("-q", "--quiet", action="store_true", help="Suppress output")
|
|
10690
|
+
notify_cmd_parser.add_argument("--raw", action="store_true",
|
|
10691
|
+
help="Send the message verbatim (no [NOTIFY from ...] prefix)")
|
|
10543
10692
|
notify_cmd_parser.set_defaults(func=cmd_notify_parent)
|
|
10544
10693
|
|
|
10545
10694
|
# === open command (artifact windows) ===
|
|
@@ -10617,6 +10766,8 @@ def main() -> int:
|
|
|
10617
10766
|
"send-keys", help="Send raw keys to a session (with pause between groups)"
|
|
10618
10767
|
)
|
|
10619
10768
|
send_keys_parser.add_argument("-s", "--session", required=True, help="Target session (supports session@machine)")
|
|
10769
|
+
send_keys_parser.add_argument("--pane", type=int, default=None,
|
|
10770
|
+
help="Target a specific pane index (default: the session's active pane)")
|
|
10620
10771
|
send_keys_parser.add_argument("keys", nargs="*", help="Key groups to send (e.g., 'hello world' Enter)")
|
|
10621
10772
|
send_keys_parser.set_defaults(func=cmd_send_keys)
|
|
10622
10773
|
|
|
@@ -10649,6 +10800,9 @@ def main() -> int:
|
|
|
10649
10800
|
new_parser.add_argument("--no-pull-first", dest="pull_first", action="store_false", help="Skip the fetch — branch from the local copy of <base> as-is")
|
|
10650
10801
|
new_parser.add_argument("--first-message", dest="first_message",
|
|
10651
10802
|
help="After the agent boots, deliver this as its first message (verified; local sessions only)")
|
|
10803
|
+
new_parser.add_argument("--created-by", dest="created_by",
|
|
10804
|
+
help="Record this session as the creator/parent for prompt routing "
|
|
10805
|
+
"(default: the calling tmux session; pass '' to opt out)")
|
|
10652
10806
|
new_parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
10653
10807
|
new_parser.set_defaults(func=cmd_new)
|
|
10654
10808
|
|
|
@@ -10746,6 +10900,8 @@ def main() -> int:
|
|
|
10746
10900
|
wt_parser.add_argument("--project", "-p", help="Path to git repo (default: from config or cwd)")
|
|
10747
10901
|
wt_parser.add_argument("--type", help="Session type override")
|
|
10748
10902
|
wt_parser.add_argument("--roles", help="Comma-separated role names")
|
|
10903
|
+
wt_parser.add_argument("--no-mission", dest="no_mission", action="store_true",
|
|
10904
|
+
help="Skip the auto-injected worktree-mission briefing role")
|
|
10749
10905
|
wt_parser.add_argument("--env", action="append", metavar="KEY=VAL", help="Inject env var via `tmux set-environment` (repeatable)")
|
|
10750
10906
|
wt_parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
10751
10907
|
wt_parser.set_defaults(func=cmd_worktree)
|
|
@@ -11488,6 +11644,14 @@ def main() -> int:
|
|
|
11488
11644
|
)
|
|
11489
11645
|
l_uninstall.set_defaults(func=limits_cli.cmd_limits_uninstall)
|
|
11490
11646
|
|
|
11647
|
+
# === prompts command group (prompt routing, rides the limits watchdog) ===
|
|
11648
|
+
from . import prompts_cli
|
|
11649
|
+
prompts_cli.register_prompts_parser(subparsers)
|
|
11650
|
+
|
|
11651
|
+
# === msg command group (polite agent-to-agent inbox, rides the watchdog) ===
|
|
11652
|
+
from . import msg_cli
|
|
11653
|
+
msg_cli.register_msg_parser(subparsers)
|
|
11654
|
+
|
|
11491
11655
|
# === council command group ===
|
|
11492
11656
|
council_parser = subparsers.add_parser(
|
|
11493
11657
|
"council",
|
|
@@ -9,6 +9,7 @@ import subprocess
|
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
|
|
11
11
|
from .base import AgentBackend
|
|
12
|
+
from ..ssh import ssh_base_opts
|
|
12
13
|
|
|
13
14
|
logger = logging.getLogger(__name__)
|
|
14
15
|
|
|
@@ -134,6 +135,7 @@ class TmuxAgent(AgentBackend):
|
|
|
134
135
|
port = machine.get("port")
|
|
135
136
|
ssh_cmd = [
|
|
136
137
|
"ssh",
|
|
138
|
+
*ssh_base_opts(),
|
|
137
139
|
"-o", "BatchMode=yes",
|
|
138
140
|
"-o", "ConnectTimeout=5",
|
|
139
141
|
]
|
|
@@ -9,7 +9,7 @@ import os
|
|
|
9
9
|
import random
|
|
10
10
|
import re
|
|
11
11
|
import sys
|
|
12
|
-
from dataclasses import dataclass
|
|
12
|
+
from dataclasses import dataclass, field
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
from typing import Optional
|
|
15
15
|
|
|
@@ -34,19 +34,23 @@ class EmailConfigError(NotificationError):
|
|
|
34
34
|
|
|
35
35
|
@dataclass
|
|
36
36
|
class EmailConfig:
|
|
37
|
-
"""Email notification configuration (Resend).
|
|
37
|
+
"""Email notification configuration (Resend).
|
|
38
|
+
|
|
39
|
+
The API key is env-only: RESEND_API_KEY, normally a line in
|
|
40
|
+
~/.agentwire/.env (docs/wiki/security/secrets.md). It is never read
|
|
41
|
+
from config.yaml.
|
|
42
|
+
"""
|
|
38
43
|
|
|
39
|
-
api_key: str = ""
|
|
40
44
|
from_address: str = ""
|
|
41
45
|
default_to: str = ""
|
|
42
46
|
banner_image_url: str = ""
|
|
43
47
|
echo_image_url: str = ""
|
|
44
48
|
echo_small_url: str = ""
|
|
45
49
|
logo_image_url: str = ""
|
|
50
|
+
api_key: str = field(init=False, default="")
|
|
46
51
|
|
|
47
52
|
def __post_init__(self):
|
|
48
|
-
|
|
49
|
-
self.api_key = os.environ.get("RESEND_API_KEY", "")
|
|
53
|
+
self.api_key = os.environ.get("RESEND_API_KEY", "")
|
|
50
54
|
|
|
51
55
|
|
|
52
56
|
# Playful greetings from Echo
|
|
@@ -225,8 +229,8 @@ def send_email(
|
|
|
225
229
|
if not email_config.api_key:
|
|
226
230
|
raise EmailConfigError(
|
|
227
231
|
"Email API key not configured. "
|
|
228
|
-
"
|
|
229
|
-
"
|
|
232
|
+
"Add RESEND_API_KEY=re_... to ~/.agentwire/.env "
|
|
233
|
+
"(see docs/wiki/security/secrets.md)"
|
|
230
234
|
)
|
|
231
235
|
|
|
232
236
|
# Determine recipients (list form — Resend's `to` field accepts an array)
|
|
@@ -9,7 +9,7 @@ import os
|
|
|
9
9
|
import sys
|
|
10
10
|
import urllib.error
|
|
11
11
|
import urllib.request
|
|
12
|
-
from dataclasses import dataclass
|
|
12
|
+
from dataclasses import dataclass, field
|
|
13
13
|
from typing import Optional
|
|
14
14
|
|
|
15
15
|
from .base import (
|
|
@@ -28,15 +28,19 @@ class QuoConfigError(NotificationError):
|
|
|
28
28
|
|
|
29
29
|
@dataclass
|
|
30
30
|
class QuoConfig:
|
|
31
|
-
"""Quo (OpenPhone) SMS configuration.
|
|
31
|
+
"""Quo (OpenPhone) SMS configuration.
|
|
32
|
+
|
|
33
|
+
The API key is env-only: QUO_API_KEY (or legacy OPENPHONE_API_KEY),
|
|
34
|
+
normally a line in ~/.agentwire/.env (docs/wiki/security/secrets.md).
|
|
35
|
+
It is never read from config.yaml.
|
|
36
|
+
"""
|
|
32
37
|
|
|
33
|
-
api_key: str = ""
|
|
34
38
|
from_number: str = "" # E.164 format (+1...) or phone number ID (PNxxx)
|
|
35
39
|
default_to: str = ""
|
|
40
|
+
api_key: str = field(init=False, default="")
|
|
36
41
|
|
|
37
42
|
def __post_init__(self):
|
|
38
|
-
|
|
39
|
-
self.api_key = os.environ.get("QUO_API_KEY", "") or os.environ.get("OPENPHONE_API_KEY", "")
|
|
43
|
+
self.api_key = os.environ.get("QUO_API_KEY", "") or os.environ.get("OPENPHONE_API_KEY", "")
|
|
40
44
|
|
|
41
45
|
|
|
42
46
|
API_URL = "https://api.openphone.com/v1/messages"
|
|
@@ -72,8 +76,9 @@ def send_quo_sms(
|
|
|
72
76
|
|
|
73
77
|
if not quo_config.api_key:
|
|
74
78
|
raise QuoConfigError(
|
|
75
|
-
"Quo API key not configured.
|
|
76
|
-
"
|
|
79
|
+
"Quo API key not configured. "
|
|
80
|
+
"Add QUO_API_KEY=... to ~/.agentwire/.env "
|
|
81
|
+
"(see docs/wiki/security/secrets.md)"
|
|
77
82
|
)
|
|
78
83
|
|
|
79
84
|
recipient = to or quo_config.default_to
|