agentwire-dev 1.61.0__tar.gz → 1.63.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.61.0 → agentwire_dev-1.63.0}/PKG-INFO +1 -1
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/__init__.py +1 -1
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/core.py +48 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_worktree.py +9 -1
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/pane_cli.py +2 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/notify.py +12 -1
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/projects.py +62 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/sessions_admin.py +4 -4
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/session_cli.py +59 -5
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/css/desktop.css +990 -0
- agentwire_dev-1.63.0/agentwire/static/js/card-terminal.js +260 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/collage.js +110 -5
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/command-palette.js +5 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/desktop-manager.js +11 -1
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/desktop.js +274 -7
- agentwire_dev-1.63.0/agentwire/static/js/lineage.js +138 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/scratchpad.js +4 -0
- agentwire_dev-1.63.0/agentwire/static/js/session-hud-controller.js +284 -0
- agentwire_dev-1.63.0/agentwire/static/js/session-hud-spawn.js +144 -0
- agentwire_dev-1.63.0/agentwire/static/js/session-hud.js +311 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/session-window.js +97 -569
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/shortcuts.js +2 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/config-section.js +37 -2
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/sessions-section.js +40 -3
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar.js +6 -3
- agentwire_dev-1.63.0/agentwire/static/js/spawn-ghost.js +105 -0
- agentwire_dev-1.63.0/agentwire/static/js/terminal-pane.js +779 -0
- agentwire_dev-1.63.0/agentwire/static/js/topology-render.js +788 -0
- agentwire_dev-1.63.0/agentwire/static/js/workspace-window.js +141 -0
- agentwire_dev-1.63.0/agentwire/static/topology-harness.html +120 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/INDEX.md +1 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/portal.md +3 -1
- agentwire_dev-1.63.0/docs/wiki/internals/session-topology.md +93 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/window-collage.md +4 -1
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/sessions/worktree-sessions.md +25 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/integration/test_worktree_cmd.py +110 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_cli_commands.py +4 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_portal_api.py +51 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_routes_snapshot.py +2 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_worktree_branch_cleanup.py +112 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.agentwire.yml.example +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.claude/commands/handoff.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.claude/skills/wiki/SKILL.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/FUNDING.yml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/workflows/pytest.yml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/workflows/ruff.yml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/workflows/security.yml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/workflows/tts-smoke.yml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.gitignore +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/AGENTS.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/CODE_OF_CONDUCT.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/CONTRIBUTING.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/Dockerfile.local +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/LICENSE +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/README.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/RELEASING.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/SECURITY.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/SPONSORS.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/__main__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/agents/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/agents/base.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/agents/tmux.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/cached_status.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels/base.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels/email.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels/push.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels/quo.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/chrome_tabs.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/completion.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/config.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/config_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/inbox.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/minutes.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/state.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/view.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/devices.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/diff_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/doctor_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/doctor_voice.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/ensure_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/fetch.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/git_state.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/instructions.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/parser.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/renderer.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/schema.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/history.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/history_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/agentwire-permission.sh +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/audit_logger.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/mcp-tool-damage-control.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/read-tool-damage-control.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/control-plane.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/outbound.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/publish.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/idle-handler.sh +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/queue-processor.sh +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/inbox.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/limits_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/listen.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/locking.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/machine_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_channels.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_chrome.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_core.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_council.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_desktop.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_handoff.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_history.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_listen.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_lock.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_machine.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_msg.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_notify.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_pane.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_projects.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_scheduler.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_scratchpad.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_server.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_services.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_session.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_status.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_task.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_tunnels.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_voice.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_wiki.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/msg_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/network.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/notify_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/onboarding.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/palette_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/pane_manager.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/portal_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/project_config.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/projects.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/prompt_router.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/prompts_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/push_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/push_store.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/repo_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/research.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/agentwire.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/anchor.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/chatbot.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/contributor.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/correspondent.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-brain.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-conscience.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-critic.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-devils-advocate.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-gut.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-historian.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-member.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-orchestrator.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/init.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/notifications.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/orchestrator.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/soul.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/task-runner.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/voice.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/worker-worktree.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/worker.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/artifacts.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/config.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/council.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/desktop.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/history.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/machines.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/palette.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/permission.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/push.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/safety.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/scheduler.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/scratchpad.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/sessions.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/voice.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/safety/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/safety/_core.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/safety_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/safety_commands.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/dispatch.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/gates.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/loop.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/models.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/report.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/schedule.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/state.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/zombie.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scratchpad.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/security.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/send_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/server.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/services.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/session_context.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/session_ready.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/ssh.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/announcements.json +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/apple-touch-icon.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/css/mobile.css +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/favicon-32.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/favicon-64.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/bear.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/cat.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/crown.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/custom/agentwire-portal.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/custom/agentwire-tts.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/custom/agentwire.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/deer.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/drone.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/eagle.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/fox.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/hawk.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/horse.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/lion.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/rabbit.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/robot.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/tiger.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/wolf.webp +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/img/icon-192.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/img/icon-512.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/.gitkeep +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/announcement-modal.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/api.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/artifact-window.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/council-window.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/dead-key-suppressor.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/help-modal.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/icon-manager.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/mobile.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/notification-prefs.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/notifications-panel.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/ptt.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/push-client.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/review-window.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/safety-shared.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/safety-window.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/service-classification.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/session-id.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/council-section.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/services-section.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/tile-manager.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/toast.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/token-modal.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/utils/ansi.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/utils/swipe.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/voice/autosend-prefs.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/voice/browser-stt.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/voice/browser-tts.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/voice/jargon.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/voice/prompt.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/manifest.webmanifest +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/service-worker.js +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/base.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/cloud.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/engine.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/local.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/server_backend.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/stt_server.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/system_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tabs_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tasks.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tasks_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/base.html +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/council/minutes.html.j2 +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/desktop.html +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/email_notification.html +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/mobile.html +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/pair.html +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/tmux.conf +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templating.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/aws.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/docker.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/gcp.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/gh.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/git.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/gws.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/kubectl.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/npm.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/terraform.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/uv.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/audio.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/base.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/engines/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/engines/chatterbox.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/engines/kokoro.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/engines/zonos.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/kokoro_server.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/local.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/registry.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts_server.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tunnels.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tunnels_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/usage_limit.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/__init__.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/chunker.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/event_log.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/file_io.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/paths.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/speech.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/subprocess.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/validation.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/voice_status.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/wiki.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/wiki_audit.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/wiki_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/worktree.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/worktree_registry.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/decisions/obsidian-second-brain.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/logo.png +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/architecture.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/briefing-mode.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/communication/channels.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/communication/hammerspoon.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/communication/handoff.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/concepts.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/council.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/deployment/remote-access.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/deployment/remote-machines.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/glossary.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/damage-control.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/parallel-refactor.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/shell-escaping.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/troubleshooting.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/quickstart.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/research/briefing-mode-feasibility.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/research/orchestration-transport-alternatives.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/security/damage-control-hardening.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/security/pip-audit.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/security/remote-access-hardening.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/security/secrets.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/services.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/sessions/messaging.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/sessions/prompt-routing.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/sessions/window-sizing.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/usage-limit-recovery.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/voice/shim-contract.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/voice/stt-cloud.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/voice/stt-self-hosted.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/voice/tts-self-hosted.md +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/pyproject.toml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/conftest.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/e2e/test_portal_ui.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/fixtures/sample_agentwire.yml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/fixtures/sample_config.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/fixtures/sample_scheduler.yaml +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/integration/test_council_portal.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/integration/test_scheduler_board.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/integration/test_send_verified_tmux.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/integration/test_server_websockets.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_announcements.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_build_agent_command.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_channels.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_chrome_tabs.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_cli_output.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_cli_smoke.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_config.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_config_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_control_plane_protection.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_core_created_by_rooting.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_council_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_council_inbox.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_council_minutes.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_council_state.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_council_view.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_damage_control_bypass.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_damage_control_hooks.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_damage_control_sync.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_dangling_worktrees.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_devices.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_diff_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_doctor_task_migration.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_doctor_voice.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_event_log.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_file_io.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_guarded_launch_command.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_handoff_git_state.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_handoff_instructions.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_handoff_parser.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_handoff_renderer.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_history.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_hooks_install.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_idle_handler.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_idle_nag.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_inbox.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_init_command.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_install_parity.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_limits_tick_isolation.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_locking.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_mcp_server.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_mcp_tools_args.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_msg_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_notify_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_onboarding_reinit.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_palette_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_pip_environment.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_posture_default.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_project_config.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_prompt_router.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_push.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_rebuild_guard.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_repo_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_roles.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_safety_commands.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_safety_disabled_rules.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_safety_escape_hatch.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_safety_heal.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_safety_kill_switch.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_scheduler.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_scheduler_parsing.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_scheduler_zombie.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_scratchpad.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_security.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_server_async.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_server_pure.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_services.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_session_context.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_session_created_by_env.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_session_ready.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_shared_dir_guard.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_shim_selfheal.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_skill_install.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_speech_tags.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_ssh.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_stt_backend.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_stt_cloud.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_stt_engine.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_task_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tasks.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tasks_cli.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_templating.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_terminal_resize.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tmux_template.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tts_engine_resolution.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tts_local.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tunnels_probe.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_unattended_env_isolation.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_usage_limit.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_validation.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_voice_status.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_wiki.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_wiki_audit.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_window_cycling_binding.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_worktree.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_worktree_layout.py +0 -0
- {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_worktree_registry.py +0 -0
|
@@ -740,6 +740,54 @@ def _record_session_creator(session_name: str, created_by: str | None, via: str)
|
|
|
740
740
|
store_session_metadata(session_name, metadata)
|
|
741
741
|
|
|
742
742
|
|
|
743
|
+
def _record_session_role(session_name: str, role: str | None) -> None:
|
|
744
|
+
"""Record the session's ROLE axis (orchestrator/worker) to disk (merge-preserving).
|
|
745
|
+
|
|
746
|
+
Distinct from the etiquette/persona ``roles:`` list in ``.agentwire.yml`` —
|
|
747
|
+
this is the fundamental authority axis derived at creation time (``kind``
|
|
748
|
+
in cmd_new, ``effective_kind`` in cmd_worktree, "worker" for cmd_spawn).
|
|
749
|
+
Read back by list_local_sessions() and the session_created notify lookup.
|
|
750
|
+
"""
|
|
751
|
+
if not role:
|
|
752
|
+
return
|
|
753
|
+
metadata = load_session_metadata(session_name)
|
|
754
|
+
metadata["role"] = role
|
|
755
|
+
store_session_metadata(session_name, metadata)
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
def notify_portal_session_created(session_name: str, parent: str | None, role: str | None) -> None:
|
|
759
|
+
"""Tell the portal a session was just created, with topology context (#747).
|
|
760
|
+
|
|
761
|
+
Fires immediately from the creating process instead of relying solely on
|
|
762
|
+
the global tmux ``session-created`` hook, which only knows the bare
|
|
763
|
+
session name (no parent/role) and can race a slow first-message delivery
|
|
764
|
+
before metadata is written. Fire-and-forget — failures are silently
|
|
765
|
+
ignored since the portal may not be running.
|
|
766
|
+
"""
|
|
767
|
+
import ssl
|
|
768
|
+
|
|
769
|
+
payload: dict = {"event": "session_created", "session": session_name}
|
|
770
|
+
if parent:
|
|
771
|
+
payload["parent"] = parent
|
|
772
|
+
if role:
|
|
773
|
+
payload["role"] = role
|
|
774
|
+
|
|
775
|
+
try:
|
|
776
|
+
ctx = ssl.create_default_context()
|
|
777
|
+
ctx.check_hostname = False
|
|
778
|
+
ctx.verify_mode = ssl.CERT_NONE
|
|
779
|
+
|
|
780
|
+
req = urllib.request.Request(
|
|
781
|
+
f"{_default_portal_url()}/api/notify",
|
|
782
|
+
data=json.dumps(payload).encode(),
|
|
783
|
+
headers={"Content-Type": "application/json", **_portal_auth_headers()},
|
|
784
|
+
method="POST",
|
|
785
|
+
)
|
|
786
|
+
urllib.request.urlopen(req, timeout=3, context=ctx)
|
|
787
|
+
except Exception:
|
|
788
|
+
pass
|
|
789
|
+
|
|
790
|
+
|
|
743
791
|
def _display_parent(session_name: str, path: str = "") -> "str | None":
|
|
744
792
|
"""The session that should visually own this one in the sidebar.
|
|
745
793
|
|
|
@@ -225,6 +225,7 @@ def worktree_remove(
|
|
|
225
225
|
project_dir: str = "",
|
|
226
226
|
keep_branch: bool = False,
|
|
227
227
|
force_delete_branch: bool = False,
|
|
228
|
+
close_pr_branch: bool = False,
|
|
228
229
|
) -> str:
|
|
229
230
|
"""Tear down a worktree session: kill the session, remove the worktree + branch, unregister.
|
|
230
231
|
|
|
@@ -245,7 +246,12 @@ def worktree_remove(
|
|
|
245
246
|
project_dir: Path to the git repo (default: server cwd).
|
|
246
247
|
keep_branch: Skip branch cleanup entirely (leave the branch as-is).
|
|
247
248
|
force_delete_branch: Delete the branch even if not confirmed merged —
|
|
248
|
-
use only when you're sure the work is safe to discard.
|
|
249
|
+
use only when you're sure the work is safe to discard. Still
|
|
250
|
+
refuses a branch with an OPEN PR (deleting it would silently
|
|
251
|
+
close the PR) unless close_pr_branch is also set.
|
|
252
|
+
close_pr_branch: Combined with force_delete_branch, also delete a
|
|
253
|
+
branch that has an OPEN PR, closing it. Explicit escape hatch —
|
|
254
|
+
only set this when you mean to close that PR.
|
|
249
255
|
|
|
250
256
|
Returns:
|
|
251
257
|
Success message describing what was removed, or a loud failure
|
|
@@ -258,6 +264,8 @@ def worktree_remove(
|
|
|
258
264
|
args += ["--keep-branch"]
|
|
259
265
|
if force_delete_branch:
|
|
260
266
|
args += ["--force-delete-branch"]
|
|
267
|
+
if close_pr_branch:
|
|
268
|
+
args += ["--close-pr-branch"]
|
|
261
269
|
data = run_agentwire_cmd(args)
|
|
262
270
|
session = data.get("session", name)
|
|
263
271
|
killed = " (killed live session)" if data.get("killed") else ""
|
|
@@ -37,6 +37,7 @@ from .core import (
|
|
|
37
37
|
build_agent_command,
|
|
38
38
|
inject_session_env,
|
|
39
39
|
load_config,
|
|
40
|
+
load_session_metadata,
|
|
40
41
|
parse_env_args,
|
|
41
42
|
tmux_session_exists,
|
|
42
43
|
)
|
|
@@ -172,6 +173,7 @@ def list_local_sessions(show_context: bool = False) -> list[dict]:
|
|
|
172
173
|
"posture": cfg.get("posture"),
|
|
173
174
|
"roles": cfg.get("roles", []),
|
|
174
175
|
"parent": _display_parent(parts[0], path),
|
|
176
|
+
"role": load_session_metadata(parts[0]).get("role"),
|
|
175
177
|
}
|
|
176
178
|
if usage_limit_parked(parts[0]):
|
|
177
179
|
session_info["usage_limit"] = True
|
|
@@ -66,9 +66,20 @@ class NotifyRoutesMixin:
|
|
|
66
66
|
await self.broadcast_dashboard("sessions_update", {"sessions": sessions_data})
|
|
67
67
|
|
|
68
68
|
elif event == "session_created":
|
|
69
|
+
# #747: name/parent/role travel in the payload when the
|
|
70
|
+
# creating process (cmd_new et al.) posts this explicitly —
|
|
71
|
+
# that's authoritative, no race. The bare global tmux hook
|
|
72
|
+
# (session-created, any tmux session) carries only the name,
|
|
73
|
+
# so fall back to a fresh lookup for that case (metadata may
|
|
74
|
+
# not be written yet on a very fast reattach — best-effort).
|
|
69
75
|
self._invalidate_session_caches()
|
|
70
|
-
await self.broadcast_dashboard("session_created", {"session": session})
|
|
71
76
|
sessions_data = await self._get_sessions_data()
|
|
77
|
+
entry = next((s for s in sessions_data if s.get("name") == session), None)
|
|
78
|
+
parent = data.get("parent") or (entry.get("parent") if entry else None)
|
|
79
|
+
role = data.get("role") or (entry.get("role") if entry else None)
|
|
80
|
+
await self.broadcast_dashboard("session_created", {
|
|
81
|
+
"session": session, "name": session, "parent": parent, "role": role,
|
|
82
|
+
})
|
|
72
83
|
await self.broadcast_dashboard("sessions_update", {"sessions": sessions_data})
|
|
73
84
|
|
|
74
85
|
elif event == "pane_died":
|
|
@@ -379,6 +379,66 @@ class ProjectsRoutesMixin:
|
|
|
379
379
|
|
|
380
380
|
return web.json_response({"existing": result.get("existing", [])})
|
|
381
381
|
|
|
382
|
+
async def api_worktree_cleanup(self, request: web.Request) -> web.Response:
|
|
383
|
+
"""Tear down an orphaned worktree (Session HUD ghost card "Clean up").
|
|
384
|
+
|
|
385
|
+
Thin wrapper over the plain `agentwire worktree --remove` form — the
|
|
386
|
+
CLI's own merge/open-PR guard decides whether the branch is also
|
|
387
|
+
deleted; this never escalates to --force-delete-branch.
|
|
388
|
+
|
|
389
|
+
Body: {"name": "<branch or session>", "project": "/path/to/repo"}
|
|
390
|
+
Returns whatever the CLI returns verbatim: on success
|
|
391
|
+
{success, session, path, killed, worktree_removed, branch,
|
|
392
|
+
branch_deleted, branch_note, orphaned_tabs}; on failure
|
|
393
|
+
{success: false, error}.
|
|
394
|
+
"""
|
|
395
|
+
try:
|
|
396
|
+
data = await request.json()
|
|
397
|
+
except Exception:
|
|
398
|
+
return web.json_response({"success": False, "error": "Invalid JSON body"}, status=400)
|
|
399
|
+
|
|
400
|
+
name = (data.get("name") or "").strip()
|
|
401
|
+
project = (data.get("project") or "").strip()
|
|
402
|
+
if not name or not project:
|
|
403
|
+
return web.json_response({"success": False, "error": "name and project are required"}, status=400)
|
|
404
|
+
|
|
405
|
+
# Thin wrapper: the git/registry/branch-safety logic lives in the CLI (SSOT).
|
|
406
|
+
success, result = await self.run_agentwire_cmd(
|
|
407
|
+
["worktree", "--remove", name, "-p", project]
|
|
408
|
+
)
|
|
409
|
+
return web.json_response(result, status=200 if success else 400)
|
|
410
|
+
|
|
411
|
+
async def api_worktree_adopt(self, request: web.Request) -> web.Response:
|
|
412
|
+
"""Spawn a session into an existing worktree (Session HUD ghost card "Adopt").
|
|
413
|
+
|
|
414
|
+
Thin wrapper over `agentwire worktree <name> -p <project> --existing
|
|
415
|
+
[--created-by <createdBy>]` — checks out the branch already on disk
|
|
416
|
+
(no new branch) and, when the dead session's recorded creator is
|
|
417
|
+
known, roots the new session under that same parent so it reports
|
|
418
|
+
back the way the original session would have.
|
|
419
|
+
|
|
420
|
+
Body: {"name": "<branch>", "project": "/path/to/repo", "createdBy": "<session>"}
|
|
421
|
+
Returns whatever the CLI returns verbatim (same shape as `agentwire new`'s
|
|
422
|
+
json — success/session/path/... — or {success: false, error}).
|
|
423
|
+
"""
|
|
424
|
+
try:
|
|
425
|
+
data = await request.json()
|
|
426
|
+
except Exception:
|
|
427
|
+
return web.json_response({"success": False, "error": "Invalid JSON body"}, status=400)
|
|
428
|
+
|
|
429
|
+
name = (data.get("name") or "").strip()
|
|
430
|
+
project = (data.get("project") or "").strip()
|
|
431
|
+
created_by = (data.get("createdBy") or "").strip()
|
|
432
|
+
if not name or not project:
|
|
433
|
+
return web.json_response({"success": False, "error": "name and project are required"}, status=400)
|
|
434
|
+
|
|
435
|
+
args = ["worktree", name, "-p", project, "--existing"]
|
|
436
|
+
if created_by:
|
|
437
|
+
args += ["--created-by", created_by]
|
|
438
|
+
|
|
439
|
+
success, result = await self.run_agentwire_cmd(args)
|
|
440
|
+
return web.json_response(result, status=200 if success else 400)
|
|
441
|
+
|
|
382
442
|
|
|
383
443
|
def register_projects_routes(server, app):
|
|
384
444
|
"""Wire the projects domain's routes onto ``app``."""
|
|
@@ -389,3 +449,5 @@ def register_projects_routes(server, app):
|
|
|
389
449
|
app.router.add_get("/api/session/defaults", server.api_session_defaults)
|
|
390
450
|
app.router.add_get("/api/check-path", server.api_check_path)
|
|
391
451
|
app.router.add_get("/api/check-branches", server.api_check_branches)
|
|
452
|
+
app.router.add_post("/api/worktree/cleanup", server.api_worktree_cleanup)
|
|
453
|
+
app.router.add_post("/api/worktree/adopt", server.api_worktree_adopt)
|
|
@@ -183,10 +183,10 @@ class SessionsAdminRoutesMixin:
|
|
|
183
183
|
yaml_config["voice"] = voice
|
|
184
184
|
await self._write_agentwire_yaml(session_path, yaml_config, machine_id)
|
|
185
185
|
|
|
186
|
-
#
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
186
|
+
# No manual broadcast here (#747): the `agentwire new` subprocess
|
|
187
|
+
# just awaited above already posted the enriched session_created
|
|
188
|
+
# (name/parent/role) + sessions_update to this same portal from
|
|
189
|
+
# inside cmd_new, before returning.
|
|
190
190
|
|
|
191
191
|
# Wait until the tmux pane has actually rendered something. The CLI
|
|
192
192
|
# returns the moment `tmux send-keys` *queues* the agent command, so
|
|
@@ -29,12 +29,14 @@ from .core import (
|
|
|
29
29
|
_output_json,
|
|
30
30
|
_output_result,
|
|
31
31
|
_record_session_creator,
|
|
32
|
+
_record_session_role,
|
|
32
33
|
_resolve_posture_from_args,
|
|
33
34
|
_resolve_posture_or_config,
|
|
34
35
|
_run_remote,
|
|
35
36
|
_set_session_name_env,
|
|
36
37
|
build_agent_command,
|
|
37
38
|
load_config,
|
|
39
|
+
notify_portal_session_created,
|
|
38
40
|
parse_env_args,
|
|
39
41
|
resolve_default_created_by,
|
|
40
42
|
tmux_session_exists,
|
|
@@ -504,6 +506,14 @@ def cmd_new(args) -> int:
|
|
|
504
506
|
# into place, and start the agent (skipped when bare).
|
|
505
507
|
_launch_tmux_session(session_name, session_path, agent.env, agent_cmd)
|
|
506
508
|
|
|
509
|
+
# Record creator/role and push the enriched session_created event (#747)
|
|
510
|
+
# as early as possible — before the potentially slow first-message wait
|
|
511
|
+
# below — so the portal broadcast carries real parent/role instead of
|
|
512
|
+
# racing the metadata write against the async global tmux hook.
|
|
513
|
+
_record_session_creator(session_name, created_by, via="new")
|
|
514
|
+
_record_session_role(session_name, kind)
|
|
515
|
+
notify_portal_session_created(session_name, created_by, kind)
|
|
516
|
+
|
|
507
517
|
# Update project config (.agentwire.yml) - only if --persist is given.
|
|
508
518
|
# Persist USER roles (--roles) only — the intrinsic etiquette and soul are
|
|
509
519
|
# derived/auto-appended each run, never written into project config.
|
|
@@ -567,8 +577,6 @@ def cmd_new(args) -> int:
|
|
|
567
577
|
file=sys.stderr,
|
|
568
578
|
)
|
|
569
579
|
|
|
570
|
-
_record_session_creator(session_name, created_by, via="new")
|
|
571
|
-
|
|
572
580
|
if json_mode:
|
|
573
581
|
result = {
|
|
574
582
|
"success": True,
|
|
@@ -1119,6 +1127,10 @@ def _worktree_list(args, project_path: Path, json_mode: bool) -> int:
|
|
|
1119
1127
|
r["git"] = worktree_status(Path(r.get("worktree_path", "")))
|
|
1120
1128
|
dead_msgs = inbox.list_dead(r.get("session", ""))
|
|
1121
1129
|
r["dead_reports"] = [m.to_dict() for m in dead_msgs if m.kind in ("done", "escalation")]
|
|
1130
|
+
# Recorded creator/parent (persists after the session dies) — lets a
|
|
1131
|
+
# dead orphan entry still be placed in its family and re-adopted with
|
|
1132
|
+
# the same reporting relationship it had before (#781 ghost cards).
|
|
1133
|
+
r["created_by"] = _display_parent(r.get("session", ""), r.get("worktree_path", ""))
|
|
1122
1134
|
|
|
1123
1135
|
if json_mode:
|
|
1124
1136
|
_output_json({"success": True, "entries": rows})
|
|
@@ -1454,10 +1466,40 @@ def _branch_merge_state(project_path: Path, branch: str, base: str | None) -> st
|
|
|
1454
1466
|
return "unknown"
|
|
1455
1467
|
|
|
1456
1468
|
|
|
1457
|
-
def
|
|
1469
|
+
def _open_pr_number(project_path: Path, branch: str) -> int | None:
|
|
1470
|
+
"""Best-effort: the OPEN PR number for `branch`, or None if there isn't one
|
|
1471
|
+
(or `gh` is unavailable/unauthenticated) — never hard-fails, matching
|
|
1472
|
+
`_branch_merge_state`'s best-effort posture.
|
|
1473
|
+
"""
|
|
1474
|
+
if not shutil.which("gh"):
|
|
1475
|
+
return None
|
|
1476
|
+
result = subprocess.run(
|
|
1477
|
+
["gh", "pr", "view", branch, "--json", "state,number"],
|
|
1478
|
+
cwd=project_path, capture_output=True, text=True,
|
|
1479
|
+
)
|
|
1480
|
+
if result.returncode != 0:
|
|
1481
|
+
return None
|
|
1482
|
+
try:
|
|
1483
|
+
pr = json.loads(result.stdout)
|
|
1484
|
+
except json.JSONDecodeError:
|
|
1485
|
+
return None
|
|
1486
|
+
if str(pr.get("state", "")).upper() == "OPEN":
|
|
1487
|
+
return pr.get("number")
|
|
1488
|
+
return None
|
|
1489
|
+
|
|
1490
|
+
|
|
1491
|
+
def _delete_branch_if_safe(
|
|
1492
|
+
project_path: Path, branch: str, base: str | None, force: bool = False, close_pr_branch: bool = False,
|
|
1493
|
+
) -> tuple[bool, str]:
|
|
1458
1494
|
"""Best-effort local + remote branch cleanup. Never touches an unmerged branch
|
|
1459
1495
|
unless `force` — deleting an unmerged branch would silently drop real work.
|
|
1460
1496
|
|
|
1497
|
+
`force` bypasses the merge-state check but NOT an open PR: deleting the
|
|
1498
|
+
remote head branch of an OPEN PR silently closes it (GitHub loses the head
|
|
1499
|
+
ref), which is a different, more surprising destruction than "dropping
|
|
1500
|
+
unmerged local work" — so it needs its own explicit override,
|
|
1501
|
+
`close_pr_branch` (#756).
|
|
1502
|
+
|
|
1461
1503
|
Returns (deleted, note) — note explains a skip, or names the confirmed state
|
|
1462
1504
|
on delete.
|
|
1463
1505
|
"""
|
|
@@ -1465,6 +1507,13 @@ def _delete_branch_if_safe(project_path: Path, branch: str, base: str | None, fo
|
|
|
1465
1507
|
state = _branch_merge_state(project_path, branch, base)
|
|
1466
1508
|
if state != "merged":
|
|
1467
1509
|
return False, f"not confirmed merged (state={state}); kept — pass --force-delete-branch to override"
|
|
1510
|
+
elif not close_pr_branch:
|
|
1511
|
+
open_pr = _open_pr_number(project_path, branch)
|
|
1512
|
+
if open_pr is not None:
|
|
1513
|
+
return False, (
|
|
1514
|
+
f"branch {branch} has OPEN PR #{open_pr} — force-deleting closes it. "
|
|
1515
|
+
"Merge/close the PR first, or pass --close-pr-branch to override."
|
|
1516
|
+
)
|
|
1468
1517
|
|
|
1469
1518
|
local = subprocess.run(
|
|
1470
1519
|
["git", "-C", str(project_path), "branch", "-D", branch],
|
|
@@ -1486,6 +1535,7 @@ def _delete_branch_if_safe(project_path: Path, branch: str, base: str | None, fo
|
|
|
1486
1535
|
def _teardown_entry(
|
|
1487
1536
|
project_path: Path, worktree_dir: Path, session_name: str, worktree_path: Path,
|
|
1488
1537
|
branch: str | None, base: str | None, *, keep_branch: bool = False, force_branch: bool = False,
|
|
1538
|
+
close_pr_branch: bool = False,
|
|
1489
1539
|
) -> dict:
|
|
1490
1540
|
"""Core atomic teardown: force-remove the worktree + prune, kill session,
|
|
1491
1541
|
unregister, best-effort branch cleanup. Shared by --remove and
|
|
@@ -1522,7 +1572,9 @@ def _teardown_entry(
|
|
|
1522
1572
|
|
|
1523
1573
|
branch_deleted, branch_note = (False, "")
|
|
1524
1574
|
if branch and not keep_branch:
|
|
1525
|
-
branch_deleted, branch_note = _delete_branch_if_safe(
|
|
1575
|
+
branch_deleted, branch_note = _delete_branch_if_safe(
|
|
1576
|
+
project_path, branch, base, force=force_branch, close_pr_branch=close_pr_branch,
|
|
1577
|
+
)
|
|
1526
1578
|
|
|
1527
1579
|
# Only unregister once the dir is confirmed gone (see docstring).
|
|
1528
1580
|
worktree_registry.unregister(project_path, session=session_name, worktree_path=worktree_path)
|
|
@@ -1561,6 +1613,7 @@ def _worktree_remove(args, project_path: Path, worktree_dir: Path, json_mode: bo
|
|
|
1561
1613
|
project_path, worktree_dir, session_name, worktree_path, branch, base,
|
|
1562
1614
|
keep_branch=getattr(args, 'keep_branch', False),
|
|
1563
1615
|
force_branch=getattr(args, 'force_delete_branch', False),
|
|
1616
|
+
close_pr_branch=getattr(args, 'close_pr_branch', False),
|
|
1564
1617
|
)
|
|
1565
1618
|
|
|
1566
1619
|
if json_mode:
|
|
@@ -2012,7 +2065,8 @@ def register_session_parser(subparsers) -> None:
|
|
|
2012
2065
|
"remnant) — this flags a LIVE session no one is watching.")
|
|
2013
2066
|
parser.add_argument("--remove", action="store_true", help="Atomic teardown: force-remove the worktree, kill the session, delete the branch once merged, and unregister (cleanup/recovery)")
|
|
2014
2067
|
parser.add_argument("--keep-branch", action="store_true", help="With --remove: skip branch cleanup entirely (default: best-effort delete once confirmed merged)")
|
|
2015
|
-
parser.add_argument("--force-delete-branch", action="store_true", help="With --remove: delete the branch (local + remote) even if not confirmed merged")
|
|
2068
|
+
parser.add_argument("--force-delete-branch", action="store_true", help="With --remove: delete the branch (local + remote) even if not confirmed merged. Refuses if the branch has an OPEN PR (would silently close it) unless --close-pr-branch is also given")
|
|
2069
|
+
parser.add_argument("--close-pr-branch", action="store_true", help="With --remove --force-delete-branch: also delete a branch that has an OPEN PR, closing it (explicit escape hatch for #756's guard)")
|
|
2016
2070
|
parser.add_argument("--prune", action="store_true", help="Drop registry entries whose worktree is gone + git worktree prune")
|
|
2017
2071
|
parser.add_argument("--gc-merged", action="store_true", help="Tear down (session/worktree/branch) any registered entry whose branch is confirmed merged; implies --prune (runs standalone too)")
|
|
2018
2072
|
parser.add_argument("--all", action="store_true", help="With --list/--dangling: include worktree sessions across every repo")
|