agentwire-dev 1.63.0__tar.gz → 1.65.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.63.0 → agentwire_dev-1.65.0}/PKG-INFO +1 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/__init__.py +1 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/config.py +10 -4
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/core.py +1 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/council/cli.py +22 -19
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/doctor_cli.py +78 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +3 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +3 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/mcp-tool-damage-control.py +3 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/read-tool-damage-control.py +3 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +3 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_council.py +7 -6
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_desktop.py +28 -33
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_notify.py +11 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_scheduler.py +1 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_session.py +10 -6
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_worktree.py +10 -5
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/notify_cli.py +15 -14
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/projects.py +75 -5
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/__init__.py +41 -27
- agentwire_dev-1.65.0/agentwire/roles/reviewer-worktree.md +36 -0
- agentwire_dev-1.65.0/agentwire/roles/reviewer.md +29 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles_cli.py +143 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/desktop.py +29 -13
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/projects.py +94 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/safety/_core.py +3 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scheduler/gates.py +29 -6
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scheduler/models.py +1 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scheduler/report.py +2 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scheduler/state.py +3 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scheduler_cli.py +11 -5
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/server.py +21 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/session_cli.py +39 -15
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/css/desktop.css +266 -34
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/command-palette.js +190 -4
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/desktop.js +17 -3
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/notifications-panel.js +73 -30
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/session-hud-controller.js +122 -10
- agentwire_dev-1.65.0/agentwire/static/js/session-hud-notices.js +107 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/session-hud.js +190 -20
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/sidebar/scheduler-section.js +6 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/topology-render.js +116 -19
- agentwire_dev-1.65.0/agentwire/static/js/utils/rich-text.js +40 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/worktree.py +16 -5
- agentwire_dev-1.65.0/docs/design/session-card-fields.md +99 -0
- agentwire_dev-1.65.0/docs/design/session-card-recommendation.md +177 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/architecture.md +10 -7
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/communication/channels.md +3 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/communication/handoff.md +2 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/concepts.md +3 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/council.md +3 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/deployment/remote-access.md +5 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/deployment/remote-machines.md +36 -31
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/glossary.md +6 -6
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/integrations/gws-google-workspace-cli.md +1 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/internals/damage-control.md +29 -11
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/internals/portal.md +4 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/internals/session-topology.md +1 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/internals/shell-escaping.md +2 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/internals/troubleshooting.md +2 -12
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/internals/window-collage.md +1 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/research/orchestration-transport-alternatives.md +1 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/scheduling/scheduled-workloads.md +4 -4
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/security/damage-control-hardening.md +7 -4
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/security/remote-access-hardening.md +30 -27
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/security/secrets.md +4 -5
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/sessions/claude-code-auto-mode.md +3 -7
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/sessions/prompt-routing.md +0 -1
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/voice/shim-contract.md +2 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/voice/stt-self-hosted.md +28 -18
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/integration/test_scheduler_board.py +22 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/integration/test_worktree_cmd.py +24 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_cli_commands.py +14 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_cli_smoke.py +17 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_council_minutes.py +11 -11
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_damage_control_hooks.py +29 -12
- agentwire_dev-1.65.0/tests/unit/test_doctor_scheduler_staleness.py +109 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_mcp_tools_args.py +18 -2
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_portal_api.py +65 -0
- agentwire_dev-1.65.0/tests/unit/test_projects_registry.py +274 -0
- agentwire_dev-1.65.0/tests/unit/test_rich_text_js.py +61 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_roles.py +95 -7
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_routes_snapshot.py +3 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_scheduler.py +83 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_worktree.py +27 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.agentwire.yml.example +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.claude/commands/handoff.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.claude/skills/wiki/SKILL.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.github/FUNDING.yml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.github/workflows/pytest.yml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.github/workflows/ruff.yml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.github/workflows/security.yml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.github/workflows/tts-smoke.yml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/.gitignore +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/AGENTS.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/CODE_OF_CONDUCT.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/CONTRIBUTING.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/Dockerfile.local +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/LICENSE +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/README.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/RELEASING.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/SECURITY.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/SPONSORS.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/__main__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/agents/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/agents/base.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/agents/tmux.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/cached_status.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/channels/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/channels/base.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/channels/email.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/channels/push.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/channels/quo.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/channels_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/chrome_tabs.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/completion.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/config_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/council/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/council/inbox.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/council/minutes.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/council/state.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/council/view.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/devices.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/diff_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/doctor_voice.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/ensure_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/fetch.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/handoff/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/handoff/git_state.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/handoff/instructions.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/handoff/parser.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/handoff/renderer.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/handoff/schema.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/handoff_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/history.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/history_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/agentwire-permission.sh +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/audit_logger.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/control-plane.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/outbound.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/publish.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/idle-handler.sh +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks/queue-processor.sh +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/hooks_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/inbox.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/limits_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/listen.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/locking.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/machine_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_channels.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_chrome.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_core.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_handoff.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_history.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_listen.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_lock.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_machine.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_msg.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_pane.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_projects.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_scratchpad.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_server.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_services.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_status.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_task.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_tunnels.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_voice.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/mcp_wiki.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/msg_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/network.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/onboarding.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/palette_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/pane_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/pane_manager.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/portal_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/project_config.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/prompt_router.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/prompts_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/push_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/push_store.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/repo_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/research.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/agentwire.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/anchor.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/chatbot.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/contributor.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/correspondent.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/council-brain.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/council-conscience.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/council-critic.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/council-devils-advocate.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/council-gut.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/council-historian.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/council-member.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/council-orchestrator.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/init.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/notifications.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/orchestrator.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/soul.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/task-runner.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/voice.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/worker-worktree.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/roles/worker.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/artifacts.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/config.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/council.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/history.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/machines.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/notify.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/palette.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/permission.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/push.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/safety.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/scheduler.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/scratchpad.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/sessions.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/sessions_admin.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/routes/voice.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/safety/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/safety_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/safety_commands.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scheduler/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scheduler/dispatch.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scheduler/loop.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scheduler/schedule.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scheduler/zombie.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/scratchpad.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/security.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/send_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/services.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/session_context.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/session_ready.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/ssh.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/announcements.json +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/apple-touch-icon.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/css/mobile.css +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/favicon-32.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/favicon-64.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/bear.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/cat.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/crown.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/custom/agentwire-portal.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/custom/agentwire-tts.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/custom/agentwire.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/deer.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/drone.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/eagle.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/fox.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/hawk.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/horse.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/lion.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/rabbit.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/robot.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/tiger.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/icons/sessions/wolf.webp +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/img/icon-192.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/img/icon-512.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/.gitkeep +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/announcement-modal.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/api.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/artifact-window.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/card-terminal.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/collage.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/council-window.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/dead-key-suppressor.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/desktop-manager.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/help-modal.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/icon-manager.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/lineage.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/mobile.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/notification-prefs.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/ptt.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/push-client.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/review-window.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/safety-shared.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/safety-window.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/scratchpad.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/service-classification.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/session-hud-spawn.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/session-id.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/session-window.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/shortcuts.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/sidebar/config-section.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/sidebar/council-section.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/sidebar/services-section.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/sidebar/sessions-section.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/sidebar.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/spawn-ghost.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/terminal-pane.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/tile-manager.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/toast.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/token-modal.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/utils/ansi.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/utils/swipe.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/voice/autosend-prefs.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/voice/browser-stt.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/voice/browser-tts.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/voice/jargon.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/voice/prompt.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/js/workspace-window.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/manifest.webmanifest +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/service-worker.js +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/static/topology-harness.html +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/stt/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/stt/base.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/stt/cloud.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/stt/engine.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/stt/local.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/stt/server_backend.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/stt/stt_server.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/system_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tabs_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tasks.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tasks_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templates/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templates/base.html +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templates/council/minutes.html.j2 +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templates/desktop.html +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templates/email_notification.html +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templates/mobile.html +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templates/pair.html +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templates/tmux.conf +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/templating.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tooldefs/aws.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tooldefs/docker.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tooldefs/gcp.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tooldefs/gh.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tooldefs/git.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tooldefs/gws.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tooldefs/kubectl.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tooldefs/npm.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tooldefs/terraform.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tooldefs/uv.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts/audio.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts/base.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts/engines/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts/engines/chatterbox.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts/engines/kokoro.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts/engines/zonos.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts/kokoro_server.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts/local.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts/registry.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tts_server.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tunnels.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/tunnels_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/usage_limit.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/utils/__init__.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/utils/chunker.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/utils/event_log.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/utils/file_io.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/utils/paths.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/utils/speech.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/utils/subprocess.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/validation.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/voice_status.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/wiki.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/wiki_audit.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/wiki_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/agentwire/worktree_registry.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/decisions/obsidian-second-brain.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/logo.png +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/INDEX.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/briefing-mode.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/communication/hammerspoon.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/internals/parallel-refactor.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/quickstart.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/research/briefing-mode-feasibility.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/security/pip-audit.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/services.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/sessions/messaging.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/sessions/window-sizing.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/sessions/worktree-sessions.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/usage-limit-recovery.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/voice/stt-cloud.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/docs/wiki/voice/tts-self-hosted.md +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/pyproject.toml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/conftest.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/e2e/test_portal_ui.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/fixtures/sample_agentwire.yml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/fixtures/sample_config.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/fixtures/sample_scheduler.yaml +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/integration/test_council_portal.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/integration/test_send_verified_tmux.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/integration/test_server_websockets.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_announcements.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_build_agent_command.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_channels.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_chrome_tabs.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_cli_output.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_config.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_config_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_control_plane_protection.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_core_created_by_rooting.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_council_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_council_inbox.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_council_state.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_council_view.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_damage_control_bypass.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_damage_control_sync.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_dangling_worktrees.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_devices.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_diff_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_doctor_task_migration.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_doctor_voice.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_event_log.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_file_io.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_guarded_launch_command.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_handoff_git_state.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_handoff_instructions.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_handoff_parser.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_handoff_renderer.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_history.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_hooks_install.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_idle_handler.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_idle_nag.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_inbox.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_init_command.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_install_parity.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_limits_tick_isolation.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_locking.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_mcp_server.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_msg_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_notify_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_onboarding_reinit.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_palette_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_pip_environment.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_posture_default.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_project_config.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_prompt_router.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_push.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_rebuild_guard.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_repo_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_safety_commands.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_safety_disabled_rules.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_safety_escape_hatch.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_safety_heal.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_safety_kill_switch.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_scheduler_parsing.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_scheduler_zombie.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_scratchpad.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_security.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_server_async.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_server_pure.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_services.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_session_context.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_session_created_by_env.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_session_ready.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_shared_dir_guard.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_shim_selfheal.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_skill_install.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_speech_tags.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_ssh.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_stt_backend.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_stt_cloud.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_stt_engine.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_task_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_tasks.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_tasks_cli.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_templating.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_terminal_resize.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_tmux_template.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_tts_engine_resolution.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_tts_local.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_tunnels_probe.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_unattended_env_isolation.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_usage_limit.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_validation.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_voice_status.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_wiki.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_wiki_audit.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_window_cycling_binding.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_worktree_branch_cleanup.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_worktree_layout.py +0 -0
- {agentwire_dev-1.63.0 → agentwire_dev-1.65.0}/tests/unit/test_worktree_registry.py +0 -0
|
@@ -13,6 +13,14 @@ from typing import Optional
|
|
|
13
13
|
|
|
14
14
|
import yaml
|
|
15
15
|
|
|
16
|
+
# Gitignored files a fresh git worktree needs seeded — a worktree can't load
|
|
17
|
+
# its session/task config without them. Single source of truth: referenced
|
|
18
|
+
# by WorktreesConfig's default below, the config-loading fallback further
|
|
19
|
+
# down, AND worktree.py's mandatory (never-omittable) seed set (#803) — a
|
|
20
|
+
# stale `copy_files:` in a user's config.yaml that predates one of these
|
|
21
|
+
# being added here must not silently drop it from every fresh worktree.
|
|
22
|
+
DEFAULT_WORKTREE_COPY_FILES = [".env", ".agentwire.yml", ".agentwire.tasks.yml"]
|
|
23
|
+
|
|
16
24
|
|
|
17
25
|
def _get_default_agent_command() -> str:
|
|
18
26
|
"""Get the default agent command.
|
|
@@ -105,7 +113,7 @@ class WorktreesConfig:
|
|
|
105
113
|
# tasks can't load their session/task config without them when the project
|
|
106
114
|
# gitignores them (the latter is the protected, host-authored task-exec file —
|
|
107
115
|
# #720).
|
|
108
|
-
copy_files: list = field(default_factory=lambda:
|
|
116
|
+
copy_files: list = field(default_factory=lambda: list(DEFAULT_WORKTREE_COPY_FILES))
|
|
109
117
|
|
|
110
118
|
|
|
111
119
|
@dataclass
|
|
@@ -114,7 +122,6 @@ class ProjectsConfig:
|
|
|
114
122
|
|
|
115
123
|
dir: Path = field(default_factory=lambda: Path.home() / "projects")
|
|
116
124
|
worktrees: WorktreesConfig = field(default_factory=WorktreesConfig)
|
|
117
|
-
extra: list = field(default_factory=list)
|
|
118
125
|
|
|
119
126
|
def __post_init__(self):
|
|
120
127
|
self.dir = _expand_path(self.dir) or Path.home() / "projects"
|
|
@@ -623,12 +630,11 @@ def _dict_to_config(data: dict) -> Config:
|
|
|
623
630
|
enabled=worktrees_data.get("enabled", True),
|
|
624
631
|
suffix=worktrees_data.get("suffix", "-worktrees"),
|
|
625
632
|
auto_create_branch=worktrees_data.get("auto_create_branch", True),
|
|
626
|
-
copy_files=worktrees_data.get("copy_files",
|
|
633
|
+
copy_files=worktrees_data.get("copy_files", list(DEFAULT_WORKTREE_COPY_FILES)),
|
|
627
634
|
)
|
|
628
635
|
projects = ProjectsConfig(
|
|
629
636
|
dir=projects_data.get("dir", "~/projects"),
|
|
630
637
|
worktrees=worktrees,
|
|
631
|
-
extra=projects_data.get("extra", []),
|
|
632
638
|
)
|
|
633
639
|
|
|
634
640
|
# Worktree-session orchestration (`worktree:` key).
|
|
@@ -741,7 +741,7 @@ def _record_session_creator(session_name: str, created_by: str | None, via: str)
|
|
|
741
741
|
|
|
742
742
|
|
|
743
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).
|
|
744
|
+
"""Record the session's ROLE axis (orchestrator/worker/reviewer) to disk (merge-preserving).
|
|
745
745
|
|
|
746
746
|
Distinct from the etiquette/persona ``roles:`` list in ``.agentwire.yml`` —
|
|
747
747
|
this is the fundamental authority axis derived at creation time (``kind``
|
|
@@ -164,11 +164,14 @@ def current_session() -> str | None:
|
|
|
164
164
|
return pane_manager.get_current_session()
|
|
165
165
|
|
|
166
166
|
|
|
167
|
-
def
|
|
168
|
-
"""Best-effort:
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
167
|
+
def notify_artifact(url: str, title: str) -> bool:
|
|
168
|
+
"""Best-effort: announce a rendered artifact via a portal notification.
|
|
169
|
+
|
|
170
|
+
Posts a click-to-open notice (toast + HUD entry, #817) rather than
|
|
171
|
+
force-opening a window — a background render must never steal focus from
|
|
172
|
+
whatever the human is working in. Returns True only when the portal
|
|
173
|
+
accepted the notification; a down or erroring portal returns False — the
|
|
174
|
+
artifact file exists on disk either way.
|
|
172
175
|
"""
|
|
173
176
|
import os
|
|
174
177
|
|
|
@@ -184,8 +187,8 @@ def open_artifact_window(url: str, title: str) -> bool:
|
|
|
184
187
|
try:
|
|
185
188
|
resp = core.portal_request(
|
|
186
189
|
"POST",
|
|
187
|
-
f"{portal}/api/desktop/
|
|
188
|
-
json={"
|
|
190
|
+
f"{portal}/api/desktop/notification",
|
|
191
|
+
json={"artifact": {"url": url, "title": title}},
|
|
189
192
|
timeout=5,
|
|
190
193
|
)
|
|
191
194
|
return resp.status_code == 200 and bool(resp.json().get("success"))
|
|
@@ -372,20 +375,20 @@ def _synthesis_text(value: str | None) -> str:
|
|
|
372
375
|
def _render_minutes(
|
|
373
376
|
name: str, prompt_ids: list[int] | None = None, synthesis: str = ""
|
|
374
377
|
) -> tuple[str | None, bool | None]:
|
|
375
|
-
"""Write the minutes artifact and best-effort
|
|
378
|
+
"""Write the minutes artifact and best-effort announce it in the portal.
|
|
376
379
|
|
|
377
|
-
Returns ``(path,
|
|
378
|
-
prompt history (nothing rendered, nothing
|
|
380
|
+
Returns ``(path, notified)`` — both None when the sitting has no matching
|
|
381
|
+
prompt history (nothing rendered, nothing announced).
|
|
379
382
|
"""
|
|
380
383
|
from agentwire.council import minutes
|
|
381
384
|
|
|
382
385
|
path = minutes.write_minutes(name, prompt_ids, synthesis=synthesis)
|
|
383
386
|
if path is None:
|
|
384
387
|
return None, None
|
|
385
|
-
|
|
388
|
+
notified = notify_artifact(
|
|
386
389
|
minutes.artifact_url(name), f"Council minutes — {name}"
|
|
387
390
|
)
|
|
388
|
-
return str(path),
|
|
391
|
+
return str(path), notified
|
|
389
392
|
|
|
390
393
|
|
|
391
394
|
def cmd_council_stop(args) -> int:
|
|
@@ -399,9 +402,9 @@ def cmd_council_stop(args) -> int:
|
|
|
399
402
|
# Minutes before teardown (#708): tri-state --minutes/--no-minutes,
|
|
400
403
|
# default (None) renders exactly when any prompt history exists.
|
|
401
404
|
minutes_path: str | None = None
|
|
402
|
-
|
|
405
|
+
minutes_notified: bool | None = None
|
|
403
406
|
if getattr(args, "minutes", None) is not False:
|
|
404
|
-
minutes_path,
|
|
407
|
+
minutes_path, minutes_notified = _render_minutes(
|
|
405
408
|
name, synthesis=_synthesis_text(getattr(args, "synthesis", None))
|
|
406
409
|
)
|
|
407
410
|
|
|
@@ -420,7 +423,7 @@ def cmd_council_stop(args) -> int:
|
|
|
420
423
|
"killed": killed,
|
|
421
424
|
"not_running": not_running,
|
|
422
425
|
"minutes": minutes_path,
|
|
423
|
-
"
|
|
426
|
+
"minutes_notified": minutes_notified,
|
|
424
427
|
}
|
|
425
428
|
human = (
|
|
426
429
|
f"Council '{name}' stopped ({len(killed)} sessions killed). "
|
|
@@ -456,14 +459,14 @@ def cmd_council_minutes(args) -> int:
|
|
|
456
459
|
f"(available: {', '.join(map(str, available))})",
|
|
457
460
|
)
|
|
458
461
|
|
|
459
|
-
path,
|
|
462
|
+
path, notified = _render_minutes(
|
|
460
463
|
name, prompt_ids, synthesis=_synthesis_text(getattr(args, "synthesis", None))
|
|
461
464
|
)
|
|
462
465
|
|
|
463
|
-
payload = {"success": True, "path": path, "
|
|
466
|
+
payload = {"success": True, "path": path, "notified": notified}
|
|
464
467
|
human = f"Minutes: {path}"
|
|
465
|
-
if
|
|
466
|
-
human += "\
|
|
468
|
+
if notified:
|
|
469
|
+
human += "\nAnnounced in the portal — click the notification to open."
|
|
467
470
|
return _emit(args, payload, human, council=name)
|
|
468
471
|
|
|
469
472
|
|
|
@@ -19,6 +19,7 @@ import shutil
|
|
|
19
19
|
import socket
|
|
20
20
|
import subprocess
|
|
21
21
|
import sys
|
|
22
|
+
import time
|
|
22
23
|
from pathlib import Path
|
|
23
24
|
|
|
24
25
|
from .core import (
|
|
@@ -475,6 +476,75 @@ def _render_shim_liveness_section() -> int:
|
|
|
475
476
|
return len(dead)
|
|
476
477
|
|
|
477
478
|
|
|
479
|
+
def _scheduler_daemon_started_at() -> float | None:
|
|
480
|
+
"""Epoch seconds the scheduler daemon process started, or ``None`` if not running.
|
|
481
|
+
|
|
482
|
+
Reads the daemon's own self-reported ``started_at`` from the live-state
|
|
483
|
+
file it already writes every loop tick (``scheduler/loop.py`` ->
|
|
484
|
+
``_write_live_state`` -> ``read_live_state()``) rather than reimplementing
|
|
485
|
+
process-start-time discovery via ``ps``/``pgrep`` PID matching, which is
|
|
486
|
+
both platform-fragile (``ps`` elapsed-time output format varies) and
|
|
487
|
+
ambiguous if a stray/duplicate daemon process happens to be running.
|
|
488
|
+
``tmux_session_exists`` confirms the daemon is actually alive, so a
|
|
489
|
+
leftover live-state file from a since-stopped daemon doesn't produce a
|
|
490
|
+
false "stale" reading.
|
|
491
|
+
"""
|
|
492
|
+
from .scheduler import SCHEDULER_SESSION, read_live_state
|
|
493
|
+
|
|
494
|
+
if not tmux_session_exists(SCHEDULER_SESSION):
|
|
495
|
+
return None
|
|
496
|
+
state = read_live_state()
|
|
497
|
+
if not state:
|
|
498
|
+
return None
|
|
499
|
+
started_at = state.get("started_at")
|
|
500
|
+
if not started_at:
|
|
501
|
+
return None
|
|
502
|
+
try:
|
|
503
|
+
from datetime import datetime
|
|
504
|
+
return datetime.fromisoformat(started_at).timestamp()
|
|
505
|
+
except (ValueError, TypeError):
|
|
506
|
+
return None
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
def _newest_installed_source_mtime(pkg_dir: Path | None = None) -> float:
|
|
510
|
+
"""Newest mtime among the installed ``agentwire`` package's ``.py`` files."""
|
|
511
|
+
if pkg_dir is None:
|
|
512
|
+
pkg_dir = Path(__file__).resolve().parent
|
|
513
|
+
try:
|
|
514
|
+
return max((f.stat().st_mtime for f in pkg_dir.rglob("*.py")), default=0.0)
|
|
515
|
+
except Exception:
|
|
516
|
+
return 0.0
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
def _render_scheduler_staleness_section() -> int:
|
|
520
|
+
"""Doctor section: flag a scheduler daemon older than the installed code (#803).
|
|
521
|
+
|
|
522
|
+
``agentwire scheduler serve`` is a long-running Python process — like the
|
|
523
|
+
MCP server, it imports its modules once at start and never re-reads them.
|
|
524
|
+
``agentwire rebuild`` updates the on-disk package but can't touch an
|
|
525
|
+
already-running interpreter's loaded bytecode, so a daemon that has been
|
|
526
|
+
up since before the last rebuild is silently executing stale dispatch
|
|
527
|
+
logic: any bug fixed since then stays live in production until the
|
|
528
|
+
daemon is restarted.
|
|
529
|
+
"""
|
|
530
|
+
started_at = _scheduler_daemon_started_at()
|
|
531
|
+
if started_at is None:
|
|
532
|
+
print(" [..] Scheduler daemon not running — skipping staleness check")
|
|
533
|
+
return 0
|
|
534
|
+
|
|
535
|
+
newest_src = _newest_installed_source_mtime()
|
|
536
|
+
if not newest_src or newest_src <= started_at:
|
|
537
|
+
print(" [ok] Scheduler daemon is current with the installed package")
|
|
538
|
+
return 0
|
|
539
|
+
|
|
540
|
+
age_days = (time.time() - started_at) / 86400
|
|
541
|
+
print(f" [!!] Scheduler daemon has been running {age_days:.1f}d — "
|
|
542
|
+
"predates the most recent `agentwire rebuild`")
|
|
543
|
+
print(" Any dispatch bug fixed since then is still live in the running daemon.")
|
|
544
|
+
print(" Fix: agentwire scheduler stop && agentwire scheduler start")
|
|
545
|
+
return 1
|
|
546
|
+
|
|
547
|
+
|
|
478
548
|
def cmd_doctor(args) -> int:
|
|
479
549
|
"""Auto-diagnose and fix common issues."""
|
|
480
550
|
from .hooks_cli import _managed_file_state, _managed_hook_files, get_hooks_source
|
|
@@ -653,6 +723,14 @@ def cmd_doctor(args) -> int:
|
|
|
653
723
|
else:
|
|
654
724
|
print(" [ok] Local main up to date with origin/main")
|
|
655
725
|
|
|
726
|
+
# 4d. Scheduler daemon staleness — the daemon is a long-running process
|
|
727
|
+
# that never re-imports its code, so it can silently run a dispatch bug
|
|
728
|
+
# that's since been fixed on disk (#803). Distinct from the git-drift
|
|
729
|
+
# check above: that flags an out-of-date CHECKOUT, this flags a
|
|
730
|
+
# currently-running PROCESS that predates the last install.
|
|
731
|
+
print("\nChecking scheduler daemon freshness...")
|
|
732
|
+
issues_found += _render_scheduler_staleness_section()
|
|
733
|
+
|
|
656
734
|
# Check custom services (registry-driven: built-in notifications bridge
|
|
657
735
|
# + user-defined services from services.custom)
|
|
658
736
|
print("\nChecking custom services...")
|
|
@@ -613,8 +613,8 @@ def load_config(
|
|
|
613
613
|
# dispatch by the scheduler), the hook resolves ``ask`` by FAILING CLOSED:
|
|
614
614
|
# block + notify the owner, UNLESS the matched rule's stable ID is on the
|
|
615
615
|
# allowlist. The allowlist is the union of:
|
|
616
|
-
# 1. ``DEFAULT_UNATTENDED_ALLOW`` below (
|
|
617
|
-
# irreversible or outward-facing),
|
|
616
|
+
# 1. ``DEFAULT_UNATTENDED_ALLOW`` below (work + open a PR + notify the owner
|
|
617
|
+
# by email — nothing else irreversible or outward-facing),
|
|
618
618
|
# 2. ``safety.unattended_allow`` from global / project config,
|
|
619
619
|
# 3. ``AGENTWIRE_UNATTENDED_ALLOW`` (comma-separated) — the per-task
|
|
620
620
|
# extension the scheduler stamps from a task's ``unattended_allow``.
|
|
@@ -629,6 +629,7 @@ DEFAULT_UNATTENDED_ALLOW = {
|
|
|
629
629
|
"git.commit", # commit
|
|
630
630
|
"git.push", # push (force/delete are SEPARATE hard-block/ask rules)
|
|
631
631
|
"gh.pr-create", # open a PR — the human-reviewed gate
|
|
632
|
+
"outbound.agentwire-email", # blanket allow, any recipient (#804)
|
|
632
633
|
}
|
|
633
634
|
|
|
634
635
|
|
|
@@ -609,8 +609,8 @@ def load_config(
|
|
|
609
609
|
# dispatch by the scheduler), the hook resolves ``ask`` by FAILING CLOSED:
|
|
610
610
|
# block + notify the owner, UNLESS the matched rule's stable ID is on the
|
|
611
611
|
# allowlist. The allowlist is the union of:
|
|
612
|
-
# 1. ``DEFAULT_UNATTENDED_ALLOW`` below (
|
|
613
|
-
# irreversible or outward-facing),
|
|
612
|
+
# 1. ``DEFAULT_UNATTENDED_ALLOW`` below (work + open a PR + notify the owner
|
|
613
|
+
# by email — nothing else irreversible or outward-facing),
|
|
614
614
|
# 2. ``safety.unattended_allow`` from global / project config,
|
|
615
615
|
# 3. ``AGENTWIRE_UNATTENDED_ALLOW`` (comma-separated) — the per-task
|
|
616
616
|
# extension the scheduler stamps from a task's ``unattended_allow``.
|
|
@@ -625,6 +625,7 @@ DEFAULT_UNATTENDED_ALLOW = {
|
|
|
625
625
|
"git.commit", # commit
|
|
626
626
|
"git.push", # push (force/delete are SEPARATE hard-block/ask rules)
|
|
627
627
|
"gh.pr-create", # open a PR — the human-reviewed gate
|
|
628
|
+
"outbound.agentwire-email", # blanket allow, any recipient (#804)
|
|
628
629
|
}
|
|
629
630
|
|
|
630
631
|
|
|
@@ -621,8 +621,8 @@ def load_config(
|
|
|
621
621
|
# dispatch by the scheduler), the hook resolves ``ask`` by FAILING CLOSED:
|
|
622
622
|
# block + notify the owner, UNLESS the matched rule's stable ID is on the
|
|
623
623
|
# allowlist. The allowlist is the union of:
|
|
624
|
-
# 1. ``DEFAULT_UNATTENDED_ALLOW`` below (
|
|
625
|
-
# irreversible or outward-facing),
|
|
624
|
+
# 1. ``DEFAULT_UNATTENDED_ALLOW`` below (work + open a PR + notify the owner
|
|
625
|
+
# by email — nothing else irreversible or outward-facing),
|
|
626
626
|
# 2. ``safety.unattended_allow`` from global / project config,
|
|
627
627
|
# 3. ``AGENTWIRE_UNATTENDED_ALLOW`` (comma-separated) — the per-task
|
|
628
628
|
# extension the scheduler stamps from a task's ``unattended_allow``.
|
|
@@ -637,6 +637,7 @@ DEFAULT_UNATTENDED_ALLOW = {
|
|
|
637
637
|
"git.commit", # commit
|
|
638
638
|
"git.push", # push (force/delete are SEPARATE hard-block/ask rules)
|
|
639
639
|
"gh.pr-create", # open a PR — the human-reviewed gate
|
|
640
|
+
"outbound.agentwire-email", # blanket allow, any recipient (#804)
|
|
640
641
|
}
|
|
641
642
|
|
|
642
643
|
|
|
@@ -615,8 +615,8 @@ def load_config(
|
|
|
615
615
|
# dispatch by the scheduler), the hook resolves ``ask`` by FAILING CLOSED:
|
|
616
616
|
# block + notify the owner, UNLESS the matched rule's stable ID is on the
|
|
617
617
|
# allowlist. The allowlist is the union of:
|
|
618
|
-
# 1. ``DEFAULT_UNATTENDED_ALLOW`` below (
|
|
619
|
-
# irreversible or outward-facing),
|
|
618
|
+
# 1. ``DEFAULT_UNATTENDED_ALLOW`` below (work + open a PR + notify the owner
|
|
619
|
+
# by email — nothing else irreversible or outward-facing),
|
|
620
620
|
# 2. ``safety.unattended_allow`` from global / project config,
|
|
621
621
|
# 3. ``AGENTWIRE_UNATTENDED_ALLOW`` (comma-separated) — the per-task
|
|
622
622
|
# extension the scheduler stamps from a task's ``unattended_allow``.
|
|
@@ -631,6 +631,7 @@ DEFAULT_UNATTENDED_ALLOW = {
|
|
|
631
631
|
"git.commit", # commit
|
|
632
632
|
"git.push", # push (force/delete are SEPARATE hard-block/ask rules)
|
|
633
633
|
"gh.pr-create", # open a PR — the human-reviewed gate
|
|
634
|
+
"outbound.agentwire-email", # blanket allow, any recipient (#804)
|
|
634
635
|
}
|
|
635
636
|
|
|
636
637
|
|
|
@@ -608,8 +608,8 @@ def load_config(
|
|
|
608
608
|
# dispatch by the scheduler), the hook resolves ``ask`` by FAILING CLOSED:
|
|
609
609
|
# block + notify the owner, UNLESS the matched rule's stable ID is on the
|
|
610
610
|
# allowlist. The allowlist is the union of:
|
|
611
|
-
# 1. ``DEFAULT_UNATTENDED_ALLOW`` below (
|
|
612
|
-
# irreversible or outward-facing),
|
|
611
|
+
# 1. ``DEFAULT_UNATTENDED_ALLOW`` below (work + open a PR + notify the owner
|
|
612
|
+
# by email — nothing else irreversible or outward-facing),
|
|
613
613
|
# 2. ``safety.unattended_allow`` from global / project config,
|
|
614
614
|
# 3. ``AGENTWIRE_UNATTENDED_ALLOW`` (comma-separated) — the per-task
|
|
615
615
|
# extension the scheduler stamps from a task's ``unattended_allow``.
|
|
@@ -624,6 +624,7 @@ DEFAULT_UNATTENDED_ALLOW = {
|
|
|
624
624
|
"git.commit", # commit
|
|
625
625
|
"git.push", # push (force/delete are SEPARATE hard-block/ask rules)
|
|
626
626
|
"gh.pr-create", # open a PR — the human-reviewed gate
|
|
627
|
+
"outbound.agentwire-email", # blanket allow, any recipient (#804)
|
|
627
628
|
}
|
|
628
629
|
|
|
629
630
|
|
|
@@ -212,9 +212,10 @@ def council_minutes(name: str = "", prompt: str = "", synthesis: str = "") -> st
|
|
|
212
212
|
Deterministically renders the sitting's persisted prompt history
|
|
213
213
|
(question + attributed take/ack/pass replies) plus your optional
|
|
214
214
|
synthesis into a self-contained HTML artifact at
|
|
215
|
-
``~/.agentwire/artifacts/council-<name>-minutes/index.html``, and
|
|
216
|
-
it as a portal
|
|
217
|
-
|
|
215
|
+
``~/.agentwire/artifacts/council-<name>-minutes/index.html``, and
|
|
216
|
+
announces it as a click-to-open portal notification when the portal is
|
|
217
|
+
up (#817 — never steals focus). Works for live and dismissed sittings
|
|
218
|
+
alike — prompt history survives ``council_stop``.
|
|
218
219
|
|
|
219
220
|
Args:
|
|
220
221
|
prompt: Prompt id to render, or 'all' (empty = all)
|
|
@@ -222,7 +223,7 @@ def council_minutes(name: str = "", prompt: str = "", synthesis: str = "") -> st
|
|
|
222
223
|
name: Sitting name (empty = cwd-repo-slug / sole live sitting)
|
|
223
224
|
|
|
224
225
|
Returns:
|
|
225
|
-
The rendered artifact's path, and whether
|
|
226
|
+
The rendered artifact's path, and whether the portal was notified.
|
|
226
227
|
"""
|
|
227
228
|
args = ["council", "minutes"]
|
|
228
229
|
if name:
|
|
@@ -235,6 +236,6 @@ def council_minutes(name: str = "", prompt: str = "", synthesis: str = "") -> st
|
|
|
235
236
|
if not data.get("success"):
|
|
236
237
|
return f"Failed to render minutes: {data.get('error') or data}"
|
|
237
238
|
out = f"{_council_tag(data)}Minutes: {data.get('path')}"
|
|
238
|
-
if data.get("
|
|
239
|
-
out += "\
|
|
239
|
+
if data.get("notified"):
|
|
240
|
+
out += "\nAnnounced in the portal — the human clicks the notification to open."
|
|
240
241
|
return out
|
|
@@ -106,9 +106,23 @@ def desktop_open_panel(panel_type: str) -> str:
|
|
|
106
106
|
return f"Failed to open panel: {data.get('error', 'Unknown error')}"
|
|
107
107
|
|
|
108
108
|
|
|
109
|
+
def _announce_artifact(url: str, title: str, artifact_id: str | None) -> dict:
|
|
110
|
+
"""POST the click-to-open artifact notification (#817) — the single
|
|
111
|
+
portal-side path for surfacing an artifact; there is no force-open."""
|
|
112
|
+
artifact = {"url": url, "title": title}
|
|
113
|
+
if artifact_id:
|
|
114
|
+
artifact["artifact_id"] = artifact_id
|
|
115
|
+
return _portal_request("POST", "/api/desktop/notification", {"artifact": artifact})
|
|
116
|
+
|
|
117
|
+
|
|
109
118
|
@mcp.tool()
|
|
110
119
|
def desktop_open_artifact(url: str, title: str = "Artifact", artifact_id: str | None = None) -> str:
|
|
111
|
-
"""
|
|
120
|
+
"""Announce a URL or local artifact file on the portal desktop (click-to-open).
|
|
121
|
+
|
|
122
|
+
Posts a notification (toast + Session HUD entry) carrying the artifact
|
|
123
|
+
target instead of force-opening a window (#817) — a background-produced
|
|
124
|
+
artifact must never steal focus. The human clicks the notice to open the
|
|
125
|
+
artifact window, focused.
|
|
112
126
|
|
|
113
127
|
For local files, use a filename from ~/.agentwire/artifacts/ (e.g., "dashboard.html").
|
|
114
128
|
For external sites, use a full URL (e.g., "https://example.com").
|
|
@@ -119,21 +133,12 @@ def desktop_open_artifact(url: str, title: str = "Artifact", artifact_id: str |
|
|
|
119
133
|
artifact_id: Optional unique window ID. If omitted, derived from URL.
|
|
120
134
|
|
|
121
135
|
Returns:
|
|
122
|
-
|
|
136
|
+
Notification ID or error description.
|
|
123
137
|
"""
|
|
124
|
-
|
|
125
|
-
"type": "artifact",
|
|
126
|
-
"url": url,
|
|
127
|
-
"title": title,
|
|
128
|
-
}
|
|
129
|
-
if artifact_id:
|
|
130
|
-
body["artifact_id"] = artifact_id
|
|
131
|
-
|
|
132
|
-
data = _portal_request("POST", "/api/desktop/window/open", body)
|
|
138
|
+
data = _announce_artifact(url, title, artifact_id)
|
|
133
139
|
if data.get("success"):
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
return f"Failed to open artifact window: {data.get('error', 'Unknown error')}"
|
|
140
|
+
return f"Artifact '{title}' announced (notification id: {data.get('id', 'unknown')}) — the human clicks to open."
|
|
141
|
+
return f"Failed to announce artifact: {data.get('error', 'Unknown error')}"
|
|
137
142
|
|
|
138
143
|
|
|
139
144
|
@mcp.tool()
|
|
@@ -143,11 +148,12 @@ def desktop_write_artifact(
|
|
|
143
148
|
title: str = "Artifact",
|
|
144
149
|
artifact_id: str | None = None,
|
|
145
150
|
) -> str:
|
|
146
|
-
"""Write HTML content to a file and
|
|
151
|
+
"""Write HTML content to a file and announce it as a click-to-open artifact.
|
|
147
152
|
|
|
148
|
-
Atomically writes content to ~/.agentwire/artifacts/<filename>, then
|
|
149
|
-
|
|
150
|
-
|
|
153
|
+
Atomically writes content to ~/.agentwire/artifacts/<filename>, then posts
|
|
154
|
+
a click-to-open notification (toast + Session HUD entry, #817) — the human
|
|
155
|
+
clicks to open the artifact window; it never steals focus. Use this to
|
|
156
|
+
deliver dashboards, diagrams, reports, or any HTML content.
|
|
151
157
|
|
|
152
158
|
Args:
|
|
153
159
|
filename: Output filename (must end in .html, e.g., "dashboard.html")
|
|
@@ -156,9 +162,8 @@ def desktop_write_artifact(
|
|
|
156
162
|
artifact_id: Optional unique window ID. If omitted, derived from filename.
|
|
157
163
|
|
|
158
164
|
Returns:
|
|
159
|
-
|
|
165
|
+
Notification ID or error description.
|
|
160
166
|
"""
|
|
161
|
-
# Step 1: Upload the file
|
|
162
167
|
upload_data = _portal_request("POST", "/api/artifacts/upload", {
|
|
163
168
|
"filename": filename,
|
|
164
169
|
"content": html_content,
|
|
@@ -166,20 +171,10 @@ def desktop_write_artifact(
|
|
|
166
171
|
if not upload_data.get("success"):
|
|
167
172
|
return f"Failed to write artifact: {upload_data.get('error', 'Unknown error')}"
|
|
168
173
|
|
|
169
|
-
|
|
170
|
-
body = {
|
|
171
|
-
"type": "artifact",
|
|
172
|
-
"url": filename,
|
|
173
|
-
"title": title,
|
|
174
|
-
}
|
|
175
|
-
if artifact_id:
|
|
176
|
-
body["artifact_id"] = artifact_id
|
|
177
|
-
|
|
178
|
-
open_data = _portal_request("POST", "/api/desktop/window/open", body)
|
|
174
|
+
open_data = _announce_artifact(filename, title, artifact_id)
|
|
179
175
|
if open_data.get("success"):
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
return f"File written but failed to open window: {open_data.get('error', 'Unknown error')}"
|
|
176
|
+
return f"Artifact '{filename}' written and announced (notification id: {open_data.get('id', 'unknown')})."
|
|
177
|
+
return f"File written but failed to announce it: {open_data.get('error', 'Unknown error')}"
|
|
183
178
|
|
|
184
179
|
|
|
185
180
|
@mcp.tool()
|
|
@@ -65,7 +65,8 @@ def notify_event(event: str, session: str | None = None) -> str:
|
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
@mcp.tool()
|
|
68
|
-
def notify_user(text: str, session: str | None = None, priority: str = "normal"
|
|
68
|
+
def notify_user(text: str, session: str | None = None, priority: str = "normal",
|
|
69
|
+
artifact_url: str | None = None, artifact_title: str | None = None) -> str:
|
|
69
70
|
"""Show the HUMAN a desktop toast on the portal (persistent, visual).
|
|
70
71
|
|
|
71
72
|
The human-screen channel — the asymmetric text partner to `say` (audio).
|
|
@@ -74,11 +75,18 @@ def notify_user(text: str, session: str | None = None, priority: str = "normal")
|
|
|
74
75
|
(portal lifecycle). Clicking the toast opens the session that generated the
|
|
75
76
|
notification (the `session` below); a toast with no session is non-clickable.
|
|
76
77
|
|
|
78
|
+
With `artifact_url` set, the toast instead becomes a click-to-open artifact
|
|
79
|
+
notice (#817): it sticks until dismissed, also appears in the Session HUD,
|
|
80
|
+
and clicking it opens that artifact window — use this to hand the human a
|
|
81
|
+
rendered deliverable without stealing focus.
|
|
82
|
+
|
|
77
83
|
Args:
|
|
78
84
|
text: Notification text. Bold (**x**), line breaks, and [links](https://…)
|
|
79
85
|
render; everything else is escaped.
|
|
80
86
|
session: Session this relates to (shown as a badge).
|
|
81
87
|
priority: 'normal' or 'high' (high gets an accent border).
|
|
88
|
+
artifact_url: URL or ~/.agentwire/artifacts/ filename to open on click.
|
|
89
|
+
artifact_title: Window title for the artifact (default: "Artifact").
|
|
82
90
|
|
|
83
91
|
Returns:
|
|
84
92
|
Notification ID or error description.
|
|
@@ -86,6 +94,8 @@ def notify_user(text: str, session: str | None = None, priority: str = "normal")
|
|
|
86
94
|
body = {"text": text, "priority": priority}
|
|
87
95
|
if session:
|
|
88
96
|
body["session"] = session
|
|
97
|
+
if artifact_url:
|
|
98
|
+
body["artifact"] = {"url": artifact_url, "title": artifact_title or "Artifact"}
|
|
89
99
|
data = _portal_request("POST", "/api/desktop/notification", body)
|
|
90
100
|
if not data.get("success"):
|
|
91
101
|
return f"Failed to post notification: {data.get('error', 'Unknown error')}"
|
|
@@ -258,7 +258,7 @@ def scheduler_report(since: str = "8h", artifact: bool = False) -> str:
|
|
|
258
258
|
|
|
259
259
|
Args:
|
|
260
260
|
since: Time window to cover (e.g. '8h', '12h', '1d') default: '8h'
|
|
261
|
-
artifact: If True,
|
|
261
|
+
artifact: If True, announce the report as a click-to-open portal notification
|
|
262
262
|
|
|
263
263
|
Returns:
|
|
264
264
|
Path to generated HTML report and summary statistics.
|
|
@@ -151,12 +151,16 @@ def session_create(
|
|
|
151
151
|
spawns already auto-root (#715), so this is mainly for a
|
|
152
152
|
same-project session you want detached, or to force standalone
|
|
153
153
|
explicitly. Ignored when `created_by` is set (that wins).
|
|
154
|
-
kind: Session role — "worker" or "
|
|
155
|
-
branch) already defaults to orchestrator; a
|
|
156
|
-
defaults to worker (safety-railed:
|
|
157
|
-
notify). Pass "orchestrator" to
|
|
158
|
-
project/branch name — e.g. a durable
|
|
159
|
-
window.
|
|
154
|
+
kind: Session role — "worker", "orchestrator", or "reviewer". A flat
|
|
155
|
+
name (no branch) already defaults to orchestrator; a
|
|
156
|
+
project/branch name defaults to worker (safety-railed:
|
|
157
|
+
isolation/verify/draft-PR/notify). Pass "orchestrator" to
|
|
158
|
+
override that default for a project/branch name — e.g. a durable
|
|
159
|
+
branch-pinned project window. Pass "reviewer" for a PR-review
|
|
160
|
+
station that adversarially reviews a sibling session's PR and
|
|
161
|
+
never opens/merges one of its own (safety-railed the other way —
|
|
162
|
+
non-overridable, parented rooting like worker, not rooted like
|
|
163
|
+
orchestrator). Leave empty for the derived default.
|
|
160
164
|
|
|
161
165
|
Returns:
|
|
162
166
|
Success message or error description.
|
|
@@ -33,9 +33,10 @@ def worktree_create(
|
|
|
33
33
|
Args:
|
|
34
34
|
name: Worktree/branch name (becomes the branch + session suffix).
|
|
35
35
|
project_dir: Path to the git repo (default: server cwd).
|
|
36
|
-
roles: Comma-separated roles STACKED on the intrinsic worker
|
|
37
|
-
(e.g. "correspondent"). Never replaces the safety rail
|
|
38
|
-
for kind="orchestrator" these
|
|
36
|
+
roles: Comma-separated roles STACKED on the intrinsic worker/reviewer
|
|
37
|
+
etiquette (e.g. "correspondent"). Never replaces the safety rail
|
|
38
|
+
(kind=worker or kind=reviewer; for kind="orchestrator" these
|
|
39
|
+
REPLACE the default persona instead).
|
|
39
40
|
base: Base branch to fork from (default: the repo's origin/HEAD).
|
|
40
41
|
prompt: Optional first message — delivered once the agent is booted and
|
|
41
42
|
ready (verified paste). Lets you spawn AND seed the task in one call
|
|
@@ -50,9 +51,13 @@ def worktree_create(
|
|
|
50
51
|
roots by default (a durable orchestrator shouldn't inherit
|
|
51
52
|
whoever spawned it).
|
|
52
53
|
kind: Session role — "worker" (default: safety-railed, isolation/
|
|
53
|
-
verify/draft-PR/notify, non-overridable)
|
|
54
|
+
verify/draft-PR/notify, non-overridable), "orchestrator" (a
|
|
54
55
|
durable, replaceable-persona project window instead of a
|
|
55
|
-
subordinate)
|
|
56
|
+
subordinate), or "reviewer" (safety-railed the other way:
|
|
57
|
+
adversarially reviews a sibling session's PR, never opens or
|
|
58
|
+
merges one of its own; stays parented like worker, not rooted
|
|
59
|
+
like orchestrator — for anyone who needs a local checkout to e2e
|
|
60
|
+
a sibling's branch). Leave empty for the default.
|
|
56
61
|
|
|
57
62
|
Returns:
|
|
58
63
|
Success message with the session name + worktree path, or an error.
|