agentwire-dev 1.29.0__tar.gz → 1.29.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.29.0 → agentwire_dev-1.29.1}/PKG-INFO +1 -1
- agentwire_dev-1.29.1/SECURITY.md +59 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/__init__.py +1 -1
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/server.py +25 -15
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/deployment/remote-machines.md +3 -3
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/conftest.py +1 -1
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_cli_safety.py +6 -2
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_history.py +2 -2
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_missions_config.py +5 -5
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_project_config.py +4 -4
- agentwire_dev-1.29.0/SECURITY.md +0 -46
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/.github/FUNDING.yml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/.gitignore +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/CHANGELOG.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/CLA.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/CODE_OF_CONDUCT.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/CONTRIBUTING.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/Dockerfile.local +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/Dockerfile.runpod +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/LICENSE +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/README.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/RELEASING.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/SPONSORS.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/__main__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/agents/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/agents/base.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/agents/tmux.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/cached_status.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/channels/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/channels/base.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/channels/email.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/channels/quo.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/cli_safety.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/completion.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/config.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/fetch.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/handoff/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/handoff/git_state.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/handoff/instructions.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/handoff/parser.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/handoff/renderer.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/handoff/schema.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/history.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/agentwire-permission.sh +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/audit_logger.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/idle-handler.sh +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/listen.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/locking.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/mcp_server.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/missions/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/missions/cli.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/missions/config.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/missions/dispatcher.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/missions/eligibility.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/missions/feedback_router.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/missions/gc.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/missions/github.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/missions/naming.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/missions/state.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/network.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/onboarding.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/overnight.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/pane_manager.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/project_config.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/projects.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/prompts/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/prompts/init.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/roles/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/roles/agentwire.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/roles/chatbot.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/roles/init.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/roles/notifications.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/roles/orchestrator.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/roles/task-runner.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/roles/voice.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/roles/worker.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/safety/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/safety/_core.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/scheduler.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/search.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-Echo--black.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-Echo--transparent.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-Echo.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-email-banner.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers--full--transparent-top.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers--full-black.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers--telephone-fg.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers--transparent-top.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers--transparent.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/css/desktop.css +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/favicon.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/android.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/automaton.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/bot.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/cyborg.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/droid.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/drone.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/guardian.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/mech.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/probe.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/robot.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/sentinel.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/unit.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/blob.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/cloud.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/crystal.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/cyclops.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/flame.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/fuzzy.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/horned.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/moon.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/slime.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/star.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/tentacle.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/projects/winged.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/bear.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/cat.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/crown.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/custom/agentwire-portal.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/custom/agentwire-tts.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/custom/agentwire.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/deer.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/drone.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/eagle.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/fox.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/hawk.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/horse.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/lion.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/rabbit.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/robot.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/tiger.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/sessions/wolf.jpeg +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/.gitkeep +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/artifact-window.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/components/icon-picker.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/components/list-card.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/components/type-tag.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/desktop-manager.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/desktop.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/icon-manager.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/new-project-modal.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/notifications-panel.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/quicktask-modal.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/safety-shared.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/safety-window.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/session-id.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/session-window.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/sidebar/config-section.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/sidebar/machines-section.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/sidebar/missions-section.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/sidebar/projects-section.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/sidebar/safety-section.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/sidebar/services-section.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/sidebar/sessions-section.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/sidebar.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/terminal-font-prefs.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/tile-manager.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/utils/auto-refresh.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/winbox.bundle.min.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/js/windows/chat-window.js +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/stt/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/stt/base.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/stt/server_backend.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/stt/stt_server.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/stt/whisperkit.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tasks.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/templates/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/templates/base.html +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/templates/desktop.html +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/templates/email_notification.html +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/templates/handoff/theme.css.j2 +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/templates/tmux.conf +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/templating.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tooldefs/aws.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tooldefs/docker.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tooldefs/gcp.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tooldefs/gh.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tooldefs/git.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tooldefs/gws.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tooldefs/kubectl.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tooldefs/npm.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tooldefs/terraform.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tooldefs/uv.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/base.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/engines/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/engines/chatterbox.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/engines/kokoro.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/engines/qwen_base.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/engines/qwen_custom.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/engines/qwen_design.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/engines/zonos.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/registry.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts/runpod_handler.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tts_server.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/tunnels.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/utils/__init__.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/utils/chunker.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/utils/file_io.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/utils/paths.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/utils/subprocess.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/validation.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/voiceclone.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/voices/darren.wav +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/voices/default.wav +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/voices/jessica.wav +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/voices/lisa.wav +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/voices/may.wav +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/worktree.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/logo.png +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/INDEX.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/architecture.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/communication/channels.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/communication/hammerspoon.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/communication/handoff.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/concepts.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/deployment/remote-access.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/glossary.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/internals/damage-control.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/internals/portal.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/internals/shell-escaping.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/internals/troubleshooting.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/missions.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/quickstart.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/sessions/pi.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/tts/runpod-tts.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/docs/wiki/tts/tts-self-hosted.md +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/pyproject.toml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/requirements-tts.txt +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/templates/launchd/dev.agentwire.mission-dispatcher.plist +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/templates/launchd/dev.agentwire.mission-feedback-router.plist +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/templates/launchd/dev.agentwire.mission-janitor.plist +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/e2e/test_portal_ui.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/fixtures/sample_agentwire.yml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/fixtures/sample_config.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/fixtures/sample_scheduler.yaml +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/integration/test_missions_concurrency.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/integration/test_missions_lifecycle.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/integration/test_scheduler_board.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/integration/test_server_websockets.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_build_agent_command.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_channels.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_cli_commands.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_cli_output.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_config.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_damage_control_hooks.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_damage_control_sync.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_file_io.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_handoff_git_state.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_handoff_instructions.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_handoff_parser.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_handoff_renderer.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_locking.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_mcp_server.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_mcp_tools_args.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_missions_cli.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_missions_dispatcher.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_missions_eligibility.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_missions_feedback_router.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_missions_gc.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_missions_github.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_missions_naming.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_missions_state.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_overnight_resume_flags.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_portal_api.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_roles.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_safety_disabled_rules.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_safety_escape_hatch.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_safety_kill_switch.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_safety_mission_worker.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_scheduler.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_scheduler_parsing.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_search.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_server_async.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_server_pure.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_tasks.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_templating.py +0 -0
- {agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/tests/unit/test_worktree.py +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a Vulnerability
|
|
4
|
+
|
|
5
|
+
If you discover a security vulnerability in AgentWire, please report it privately.
|
|
6
|
+
|
|
7
|
+
**Do NOT open a public GitHub issue for security vulnerabilities.**
|
|
8
|
+
|
|
9
|
+
### How to Report
|
|
10
|
+
|
|
11
|
+
Email: security@agentwire.dev
|
|
12
|
+
|
|
13
|
+
Include:
|
|
14
|
+
- Description of the vulnerability
|
|
15
|
+
- Steps to reproduce
|
|
16
|
+
- Potential impact
|
|
17
|
+
- Any suggested fixes (optional)
|
|
18
|
+
|
|
19
|
+
### What to Expect
|
|
20
|
+
|
|
21
|
+
- **Acknowledgment:** Within 48 hours
|
|
22
|
+
- **Initial Assessment:** Within 1 week
|
|
23
|
+
- **Resolution Timeline:** Depends on severity, typically 30-90 days
|
|
24
|
+
|
|
25
|
+
### Scope
|
|
26
|
+
|
|
27
|
+
This security policy applies to:
|
|
28
|
+
- The AgentWire CLI (`agentwire` command)
|
|
29
|
+
- The AgentWire portal (web interface)
|
|
30
|
+
- Official AgentWire packages on PyPI
|
|
31
|
+
|
|
32
|
+
### Out of Scope
|
|
33
|
+
|
|
34
|
+
- Third-party dependencies (report to their maintainers)
|
|
35
|
+
- Self-hosted TTS/STT servers
|
|
36
|
+
- User misconfiguration
|
|
37
|
+
|
|
38
|
+
## Security Features
|
|
39
|
+
|
|
40
|
+
AgentWire includes built-in security features:
|
|
41
|
+
|
|
42
|
+
- **Damage Control Hooks:** Block 300+ dangerous command patterns
|
|
43
|
+
- **Path Protection:** Prevent access to sensitive files (.env, SSH keys, credentials)
|
|
44
|
+
- **Audit Logging:** All blocked operations are logged
|
|
45
|
+
|
|
46
|
+
See `docs/wiki/internals/damage-control.md` for details.
|
|
47
|
+
|
|
48
|
+
## Trust Model
|
|
49
|
+
|
|
50
|
+
The portal (HTTPS server bound to `0.0.0.0:8765` by default) **has no built-in authentication or authorization on its API endpoints**. This is by design — agentwire is built for a local-network trust perimeter, typically running on the same machine as the operator's browser or behind a Cloudflare Tunnel + Zero Trust gate (see `docs/wiki/deployment/remote-access.md`).
|
|
51
|
+
|
|
52
|
+
What this means in practice:
|
|
53
|
+
|
|
54
|
+
- **Anyone who can reach the portal port can drive it.** All `/api/*` endpoints (scheduler control, missions dispatch, project deletion, artifact upload, desktop window control) execute without auth.
|
|
55
|
+
- **Do not expose the portal directly to the public internet.** Use either firewall rules limiting access to trusted IPs, or front it with an auth gateway. Cloudflare Tunnel + Zero Trust is the recommended pattern; details in the deployment docs.
|
|
56
|
+
- **Project deletion via `/api/projects/delete`** validates the path is absolute, contains no `..`, contains no shell metacharacters, and is not in a protected list. Local execution uses argv form (no shell); SSH execution uses `shlex.quote` per argument. These mitigations don't substitute for perimeter security — they reduce blast radius if the perimeter fails.
|
|
57
|
+
- **CSRF / Origin checks are not enforced** on state-changing POSTs. A browser inside the trust perimeter that loads attacker-controlled content could be coerced into making requests to the portal. If your portal is reachable from a browser on a less-trusted network, add an origin check or fence it behind an auth proxy.
|
|
58
|
+
|
|
59
|
+
If you need authentication, the recommended path is **Cloudflare Tunnel + Zero Trust** rather than adding auth in-process: identity, MFA, audit, and revocation are all handled upstream and survive process restarts.
|
|
@@ -2343,39 +2343,49 @@ class AgentWireServer:
|
|
|
2343
2343
|
machine = data.get("machine")
|
|
2344
2344
|
delete_type = data.get("deleteType")
|
|
2345
2345
|
|
|
2346
|
-
if not path:
|
|
2346
|
+
if not path or not isinstance(path, str):
|
|
2347
2347
|
return web.json_response({"success": False, "error": "Missing path"})
|
|
2348
2348
|
if delete_type not in ("config", "folder"):
|
|
2349
2349
|
return web.json_response({"success": False, "error": "Invalid deleteType"})
|
|
2350
2350
|
|
|
2351
|
-
#
|
|
2351
|
+
# Path validation: absolute, no traversal, no shell metacharacters.
|
|
2352
|
+
# The endpoint has no auth (local-trust model — see SECURITY.md), so
|
|
2353
|
+
# treat the input as untrusted regardless and reject anything that
|
|
2354
|
+
# could escape argv quoting on either local or remote (SSH) execution.
|
|
2355
|
+
if not path.startswith("/"):
|
|
2356
|
+
return web.json_response({"success": False, "error": "path must be absolute"})
|
|
2357
|
+
if ".." in Path(path).parts:
|
|
2358
|
+
return web.json_response({"success": False, "error": "path may not contain '..'"})
|
|
2359
|
+
if re.search(r"[\s;&|`$<>(){}\[\]\\\"'*?#]", path):
|
|
2360
|
+
return web.json_response({"success": False, "error": "path contains disallowed characters"})
|
|
2361
|
+
if path.rstrip("/") in ("", "/root", "/home", "/Users", "/tmp", "/etc") or path.rstrip("/") in ("~", "$HOME"):
|
|
2362
|
+
return web.json_response({"success": False, "error": "Cannot delete protected paths"})
|
|
2363
|
+
|
|
2364
|
+
# Build argv. For SSH we still need to cross a remote shell, so
|
|
2365
|
+
# quote with shlex; locally we use array form with shell=False.
|
|
2352
2366
|
if delete_type == "config":
|
|
2353
|
-
|
|
2367
|
+
target = f"{path.rstrip('/')}/.agentwire.yml"
|
|
2368
|
+
local_argv = ["rm", "-f", target]
|
|
2354
2369
|
else:
|
|
2355
|
-
|
|
2356
|
-
if path in ("/", "/root", "/home") or path.rstrip("/") in ("~", "$HOME"):
|
|
2357
|
-
return web.json_response({"success": False, "error": "Cannot delete protected paths"})
|
|
2358
|
-
cmd = f"rm -rf '{path}'"
|
|
2370
|
+
local_argv = ["rm", "-rf", path]
|
|
2359
2371
|
|
|
2360
|
-
# Execute locally or remotely
|
|
2361
2372
|
if machine and machine != "local":
|
|
2362
|
-
# Remote
|
|
2373
|
+
# Remote shell — quote each argv element through shlex.
|
|
2374
|
+
remote_cmd = " ".join(shlex.quote(a) for a in local_argv)
|
|
2363
2375
|
result = await asyncio.to_thread(
|
|
2364
2376
|
subprocess.run,
|
|
2365
|
-
["ssh", machine,
|
|
2377
|
+
["ssh", machine, remote_cmd],
|
|
2366
2378
|
capture_output=True,
|
|
2367
2379
|
text=True,
|
|
2368
|
-
timeout=30
|
|
2380
|
+
timeout=30,
|
|
2369
2381
|
)
|
|
2370
2382
|
else:
|
|
2371
|
-
# Local
|
|
2372
2383
|
result = await asyncio.to_thread(
|
|
2373
2384
|
subprocess.run,
|
|
2374
|
-
|
|
2375
|
-
shell=True,
|
|
2385
|
+
local_argv,
|
|
2376
2386
|
capture_output=True,
|
|
2377
2387
|
text=True,
|
|
2378
|
-
timeout=30
|
|
2388
|
+
timeout=30,
|
|
2379
2389
|
)
|
|
2380
2390
|
|
|
2381
2391
|
if result.returncode != 0:
|
|
@@ -186,13 +186,13 @@ Each machine should have a `~/.agentwire/machine/CLAUDE.md` — a living documen
|
|
|
186
186
|
When an AI agent needs to do ops work on a remote machine (manage services, install packages, debug the box itself), spawn a Claude Code session in `~/.agentwire/machine/` rather than SSHing and running ad-hoc commands. The agent picks up both `~/.claude/CLAUDE.md` (user preferences) and `~/.agentwire/machine/CLAUDE.md` (machine context) automatically, giving it full situational awareness without needing to rediscover everything.
|
|
187
187
|
|
|
188
188
|
```bash
|
|
189
|
-
# Spawn an ops session on a remote machine
|
|
190
|
-
ssh
|
|
189
|
+
# Spawn an ops session on a remote machine (replace `my-server` with your hostname)
|
|
190
|
+
ssh my-server
|
|
191
191
|
cd ~/.agentwire/machine
|
|
192
192
|
claude # gets both global prefs and machine context
|
|
193
193
|
|
|
194
194
|
# Or spawn via agentwire from the Mac
|
|
195
|
-
agentwire new -s
|
|
195
|
+
agentwire new -s my-server-ops --machine my-server -p ~/.agentwire/machine
|
|
196
196
|
```
|
|
197
197
|
|
|
198
198
|
### What to Put in `~/.agentwire/machine/CLAUDE.md`
|
|
@@ -105,12 +105,16 @@ class TestIsPathAllowedForOp:
|
|
|
105
105
|
assert is_path_allowed_for_op("/home/user/project/dist/file.whl", allowed, "delete") is True
|
|
106
106
|
|
|
107
107
|
def test_limited_permissions_allow(self):
|
|
108
|
+
import os
|
|
109
|
+
env_path = os.path.expanduser("~/.env")
|
|
108
110
|
allowed = [{"path": "~/.env", "allow": {"read", "write"}}]
|
|
109
|
-
assert is_path_allowed_for_op(
|
|
111
|
+
assert is_path_allowed_for_op(env_path, allowed, "write") is True
|
|
110
112
|
|
|
111
113
|
def test_limited_permissions_deny(self):
|
|
114
|
+
import os
|
|
115
|
+
env_path = os.path.expanduser("~/.env")
|
|
112
116
|
allowed = [{"path": "~/.env", "allow": {"read", "write"}}]
|
|
113
|
-
assert is_path_allowed_for_op(
|
|
117
|
+
assert is_path_allowed_for_op(env_path, allowed, "delete") is False
|
|
114
118
|
|
|
115
119
|
|
|
116
120
|
# --- check_command_safety ---
|
|
@@ -19,9 +19,9 @@ class TestPathEncoding:
|
|
|
19
19
|
|
|
20
20
|
def test_round_trip_lossy_with_hyphens(self):
|
|
21
21
|
"""Paths with hyphens lose information (known Claude Code limitation)."""
|
|
22
|
-
original = "/
|
|
22
|
+
original = "/home/user/projects/my-app"
|
|
23
23
|
encoded = encode_project_path(original)
|
|
24
|
-
assert encoded == "-
|
|
24
|
+
assert encoded == "-home-user-projects-my-app"
|
|
25
25
|
# decode converts ALL dashes to slashes — can't distinguish original hyphens
|
|
26
26
|
decoded = decode_project_path(encoded)
|
|
27
27
|
assert decoded != original # Lossy
|
|
@@ -21,8 +21,8 @@ def missions_yaml(tmp_path):
|
|
|
21
21
|
"default_max_iterations": 3,
|
|
22
22
|
"repos": {
|
|
23
23
|
"agentwire-dev": {
|
|
24
|
-
"name": "
|
|
25
|
-
"projects_dir": "/
|
|
24
|
+
"name": "acme/example-repo",
|
|
25
|
+
"projects_dir": "/home/user/projects",
|
|
26
26
|
"per_repo_concurrency": 1,
|
|
27
27
|
},
|
|
28
28
|
},
|
|
@@ -47,8 +47,8 @@ class TestLoadConfig:
|
|
|
47
47
|
assert cfg.global_concurrency == 3
|
|
48
48
|
assert "agentwire-dev" in cfg.repos
|
|
49
49
|
repo = cfg.repos["agentwire-dev"]
|
|
50
|
-
assert repo.name == "
|
|
51
|
-
assert repo.projects_dir == Path("/
|
|
50
|
+
assert repo.name == "acme/example-repo"
|
|
51
|
+
assert repo.projects_dir == Path("/home/user/projects")
|
|
52
52
|
assert repo.per_repo_concurrency == 1
|
|
53
53
|
|
|
54
54
|
def test_project_override_per_repo_concurrency(self, missions_yaml, tmp_path):
|
|
@@ -79,7 +79,7 @@ class TestLoadConfig:
|
|
|
79
79
|
cfg = load_config(global_path=missions_yaml)
|
|
80
80
|
repo = cfg.get_repo("agentwire-dev")
|
|
81
81
|
assert repo is not None
|
|
82
|
-
assert repo.name == "
|
|
82
|
+
assert repo.name == "acme/example-repo"
|
|
83
83
|
assert cfg.get_repo("nope") is None
|
|
84
84
|
|
|
85
85
|
def test_tilde_in_projects_dir_expanded(self, tmp_path):
|
|
@@ -94,7 +94,7 @@ class TestProjectConfig:
|
|
|
94
94
|
data = {
|
|
95
95
|
"type": "claude-bypass",
|
|
96
96
|
"roles": ["agentwire", "voice"],
|
|
97
|
-
"voice": "
|
|
97
|
+
"voice": "default",
|
|
98
98
|
"parent": "main",
|
|
99
99
|
"shell": "/bin/bash",
|
|
100
100
|
"tasks": {"t1": {"prompt": "hello"}},
|
|
@@ -102,7 +102,7 @@ class TestProjectConfig:
|
|
|
102
102
|
config = ProjectConfig.from_dict(data)
|
|
103
103
|
assert config.type == SessionType.CLAUDE_BYPASS
|
|
104
104
|
assert config.roles == ["agentwire", "voice"]
|
|
105
|
-
assert config.voice == "
|
|
105
|
+
assert config.voice == "default"
|
|
106
106
|
assert config.parent == "main"
|
|
107
107
|
assert config.shell == "/bin/bash"
|
|
108
108
|
assert "t1" in config.tasks
|
|
@@ -133,11 +133,11 @@ class TestProjectConfig:
|
|
|
133
133
|
full = ProjectConfig(
|
|
134
134
|
type=SessionType.WORKER,
|
|
135
135
|
roles=["agentwire"],
|
|
136
|
-
voice="
|
|
136
|
+
voice="default",
|
|
137
137
|
).to_dict()
|
|
138
138
|
assert full["type"] == "worker"
|
|
139
139
|
assert full["roles"] == ["agentwire"]
|
|
140
|
-
assert full["voice"] == "
|
|
140
|
+
assert full["voice"] == "default"
|
|
141
141
|
|
|
142
142
|
def test_round_trip(self):
|
|
143
143
|
original = ProjectConfig(
|
agentwire_dev-1.29.0/SECURITY.md
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# Security Policy
|
|
2
|
-
|
|
3
|
-
## Reporting a Vulnerability
|
|
4
|
-
|
|
5
|
-
If you discover a security vulnerability in AgentWire, please report it privately.
|
|
6
|
-
|
|
7
|
-
**Do NOT open a public GitHub issue for security vulnerabilities.**
|
|
8
|
-
|
|
9
|
-
### How to Report
|
|
10
|
-
|
|
11
|
-
Email: security@agentwire.dev
|
|
12
|
-
|
|
13
|
-
Include:
|
|
14
|
-
- Description of the vulnerability
|
|
15
|
-
- Steps to reproduce
|
|
16
|
-
- Potential impact
|
|
17
|
-
- Any suggested fixes (optional)
|
|
18
|
-
|
|
19
|
-
### What to Expect
|
|
20
|
-
|
|
21
|
-
- **Acknowledgment:** Within 48 hours
|
|
22
|
-
- **Initial Assessment:** Within 1 week
|
|
23
|
-
- **Resolution Timeline:** Depends on severity, typically 30-90 days
|
|
24
|
-
|
|
25
|
-
### Scope
|
|
26
|
-
|
|
27
|
-
This security policy applies to:
|
|
28
|
-
- The AgentWire CLI (`agentwire` command)
|
|
29
|
-
- The AgentWire portal (web interface)
|
|
30
|
-
- Official AgentWire packages on PyPI
|
|
31
|
-
|
|
32
|
-
### Out of Scope
|
|
33
|
-
|
|
34
|
-
- Third-party dependencies (report to their maintainers)
|
|
35
|
-
- Self-hosted TTS/STT servers
|
|
36
|
-
- User misconfiguration
|
|
37
|
-
|
|
38
|
-
## Security Features
|
|
39
|
-
|
|
40
|
-
AgentWire includes built-in security features:
|
|
41
|
-
|
|
42
|
-
- **Damage Control Hooks:** Block 300+ dangerous command patterns
|
|
43
|
-
- **Path Protection:** Prevent access to sensitive files (.env, SSH keys, credentials)
|
|
44
|
-
- **Audit Logging:** All blocked operations are logged
|
|
45
|
-
|
|
46
|
-
See `docs/wiki/internals/damage-control.md` for details.
|
|
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
|
|
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
|
|
File without changes
|
{agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/audit_logger.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/agentwire.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/containers.yaml
RENAMED
|
File without changes
|
{agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/core.yaml
RENAMED
|
File without changes
|
{agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/databases.yaml
RENAMED
|
File without changes
|
{agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/firebase.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/hooks/damage-control/rules/remote.yaml
RENAMED
|
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
|
|
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
|
{agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-Echo--transparent.png
RENAMED
|
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
|
{agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/agentwire-splash-logo-layers.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentwire_dev-1.29.0 → agentwire_dev-1.29.1}/agentwire/static/icons/machines/automaton.jpeg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|