agentwire-dev 1.48.0__tar.gz → 1.49.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.48.0 → agentwire_dev-1.49.0}/PKG-INFO +1 -1
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/__init__.py +1 -1
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/announcements.json +17 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/css/desktop.css +139 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/command-palette.js +5 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/desktop.js +9 -2
- agentwire_dev-1.49.0/agentwire/static/js/help-modal.js +133 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/service-classification.js +1 -0
- agentwire_dev-1.49.0/agentwire/static/js/shortcuts.js +91 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/desktop.html +3 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.claude/commands/handoff.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.claude/skills/wiki/SKILL.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/FUNDING.yml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/workflows/pytest.yml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/workflows/ruff.yml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/workflows/security.yml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/workflows/tts-smoke.yml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.gitignore +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/AGENTS.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/CODE_OF_CONDUCT.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/CONTRIBUTING.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/Dockerfile.local +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/LICENSE +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/README.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/RELEASING.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/SECURITY.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/SPONSORS.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/__main__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/agents/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/agents/base.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/agents/tmux.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/cached_status.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels/base.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels/email.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels/push.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels/quo.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/completion.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/config.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/core.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/council/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/council/cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/council/inbox.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/council/state.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/council/view.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/devices.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/diff_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/doctor_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/doctor_voice.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/ensure_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/fetch.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/git_state.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/instructions.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/parser.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/renderer.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/schema.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/history.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/history_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/agentwire-permission.sh +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/audit_logger.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/mcp-tool-damage-control.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/read-tool-damage-control.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/control-plane.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/outbound.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/publish.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/idle-handler.sh +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/queue-processor.sh +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/inbox.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/limits_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/listen.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/locking.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/machine_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_channels.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_core.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_council.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_desktop.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_handoff.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_history.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_listen.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_lock.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_machine.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_msg.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_notify.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_pane.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_projects.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_scheduler.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_scratchpad.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_server.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_services.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_session.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_status.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_task.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_tunnels.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_voice.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_voiceclone.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_wiki.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_worktree.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/msg_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/network.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/notify_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/onboarding.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/pane_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/pane_manager.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/portal_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/project_config.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/projects.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/prompt_router.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/prompts_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/push_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/push_store.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/repo_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/research.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/agentwire.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/anchor.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/chatbot.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/correspondent.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-brain.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-conscience.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-critic.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-devils-advocate.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-gut.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-historian.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-member.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-orchestrator.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/init.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/notifications.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/orchestrator.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/soul.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/task-runner.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/voice.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/worker.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/worktree-session.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/artifacts.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/config.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/council.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/desktop.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/history.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/machines.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/notify.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/permission.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/projects.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/push.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/safety.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/scheduler.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/scratchpad.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/sessions.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/sessions_admin.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/voice.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/safety/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/safety/_core.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/safety_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/safety_commands.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/scheduler.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/scheduler_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/scratchpad.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/security.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/send_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/server.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/services.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/session_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/session_context.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/session_ready.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/ssh.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/css/mobile.css +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/favicon.png +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/bear.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/cat.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/crown.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/custom/agentwire-portal.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/custom/agentwire-tts.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/custom/agentwire.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/deer.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/drone.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/eagle.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/fox.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/hawk.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/horse.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/lion.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/rabbit.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/robot.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/tiger.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/wolf.webp +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/img/icon-192.png +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/img/icon-512.png +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/.gitkeep +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/announcement-modal.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/api.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/artifact-window.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/collage.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/council-window.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/dead-key-suppressor.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/desktop-manager.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/icon-manager.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/mobile.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/notification-prefs.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/notifications-panel.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/push-client.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/review-window.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/safety-shared.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/safety-window.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/scratchpad.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/session-id.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/session-window.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/config-section.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/council-section.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/services-section.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/sessions-section.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/tile-manager.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/toast.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/token-modal.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/utils/ansi.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/utils/swipe.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/voice/autosend-prefs.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/voice/browser-stt.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/voice/browser-tts.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/voice/jargon.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/voice/prompt.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/manifest.webmanifest +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/service-worker.js +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/base.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/cloud.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/engine.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/local.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/server_backend.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/stt_server.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/system_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tasks.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/base.html +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/email_notification.html +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/mobile.html +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/pair.html +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/tmux.conf +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templating.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/aws.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/docker.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/gcp.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/gh.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/git.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/gws.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/kubectl.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/npm.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/terraform.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/uv.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/audio.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/base.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/engines/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/engines/chatterbox.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/engines/kokoro.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/engines/zonos.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/kokoro_server.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/local.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/registry.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts_server.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tunnels.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tunnels_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/usage_limit.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/__init__.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/chunker.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/event_log.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/file_io.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/paths.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/speech.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/subprocess.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/validation.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voice_status.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voiceclone.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voices/darren.wav +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voices/default.wav +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voices/jessica.wav +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voices/lisa.wav +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voices/may.wav +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/wiki.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/wiki_audit.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/wiki_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/worktree.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/worktree_registry.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/decisions/obsidian-second-brain.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/logo.png +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/INDEX.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/architecture.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/briefing-mode.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/communication/channels.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/communication/hammerspoon.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/communication/handoff.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/concepts.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/council.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/deployment/remote-access.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/deployment/remote-machines.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/glossary.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/damage-control.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/parallel-refactor.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/portal.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/shell-escaping.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/troubleshooting.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/window-collage.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/quickstart.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/research/briefing-mode-feasibility.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/research/orchestration-transport-alternatives.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/security/damage-control-hardening.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/security/pip-audit.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/security/remote-access-hardening.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/security/secrets.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/services.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/messaging.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/pi.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/prompt-routing.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/window-sizing.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/worktree-sessions.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/usage-limit-recovery.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/voice/shim-contract.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/voice/stt-cloud.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/voice/stt-self-hosted.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/voice/tts-self-hosted.md +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/pyproject.toml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/conftest.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/e2e/test_portal_ui.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/fixtures/sample_agentwire.yml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/fixtures/sample_config.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/fixtures/sample_scheduler.yaml +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/integration/test_council_portal.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/integration/test_scheduler_board.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/integration/test_server_websockets.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/integration/test_worktree_cmd.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_announcements.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_build_agent_command.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_channels.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_cli_commands.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_cli_output.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_cli_smoke.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_config.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_control_plane_protection.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_council_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_council_inbox.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_council_state.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_council_view.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_damage_control_bypass.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_damage_control_hooks.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_damage_control_sync.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_devices.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_diff_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_doctor_voice.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_event_log.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_file_io.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_handoff_git_state.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_handoff_instructions.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_handoff_parser.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_handoff_renderer.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_history.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_hooks_install.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_idle_handler.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_idle_nag.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_inbox.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_init_command.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_limits_tick_isolation.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_locking.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_mcp_server.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_mcp_tools_args.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_msg_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_portal_api.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_project_config.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_prompt_router.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_push.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_rebuild_guard.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_repo_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_roles.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_routes_snapshot.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_safety_commands.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_safety_disabled_rules.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_safety_escape_hatch.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_safety_heal.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_safety_kill_switch.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_scheduler.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_scheduler_parsing.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_scratchpad.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_security.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_server_async.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_server_pure.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_services.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_session_context.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_session_ready.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_skill_install.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_speech_tags.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_ssh.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_stt_backend.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_stt_cloud.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_stt_engine.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_task_cli.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_tasks.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_templating.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_terminal_resize.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_tmux_template.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_tts_engine_resolution.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_tts_local.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_tunnels_probe.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_usage_limit.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_validation.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_voice_status.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_wiki.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_wiki_audit.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_worktree.py +0 -0
- {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_worktree_registry.py +0 -0
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"announcements": [
|
|
3
|
+
{
|
|
4
|
+
"id": "2026-06-help-modal",
|
|
5
|
+
"placement": "modal",
|
|
6
|
+
"emoji": "⌨️",
|
|
7
|
+
"title": "Press F1 — there's more than you think",
|
|
8
|
+
"date": "2026-06-29",
|
|
9
|
+
"body": "AgentWire has a pile of keyboard shortcuts and features that were easy to miss. Now there's one place to see them all: press F1 (or ?) anytime for a cheat sheet of every shortcut, plus a quick tour of features worth knowing — council, push-to-talk, window collage, worktrees, scratchpad, and more. There's also a ? button in the sidebar header if you'd rather click.",
|
|
10
|
+
"highlights": [
|
|
11
|
+
"F1 or ? — keyboard shortcut cheat sheet, from anywhere",
|
|
12
|
+
"Doubles as a feature tour: discover what you're not using yet",
|
|
13
|
+
"Also in the sidebar header (?) and the command palette"
|
|
14
|
+
],
|
|
15
|
+
"cta": {
|
|
16
|
+
"label": "Press F1 to try it",
|
|
17
|
+
"url": "https://github.com/dotdevdotdev/agentwire-dev/releases/tag/v1.49.0"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
3
20
|
{
|
|
4
21
|
"id": "2026-06-worktree-sessions",
|
|
5
22
|
"placement": "modal",
|
|
@@ -1209,6 +1209,145 @@ body {
|
|
|
1209
1209
|
border-radius: 4px;
|
|
1210
1210
|
}
|
|
1211
1211
|
|
|
1212
|
+
/* ── Help modal (F1 / "?") ─────────────────────────────────────────────── */
|
|
1213
|
+
.help-overlay {
|
|
1214
|
+
z-index: 9500; /* above the sidebar (9001) so the cheat sheet is never clipped */
|
|
1215
|
+
animation: announcement-fade 180ms ease-out;
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
.help-overlay .help-modal {
|
|
1219
|
+
width: 760px;
|
|
1220
|
+
max-width: 94vw;
|
|
1221
|
+
max-height: 86vh;
|
|
1222
|
+
display: flex;
|
|
1223
|
+
flex-direction: column;
|
|
1224
|
+
padding: 24px 26px 16px;
|
|
1225
|
+
border: 1px solid color-mix(in srgb, var(--accent) 28%, var(--chrome-border));
|
|
1226
|
+
border-radius: 12px;
|
|
1227
|
+
animation: announcement-rise 200ms cubic-bezier(0.2, 0.8, 0.2, 1);
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
.help-dismiss {
|
|
1231
|
+
position: absolute;
|
|
1232
|
+
top: 12px;
|
|
1233
|
+
right: 12px;
|
|
1234
|
+
background: transparent;
|
|
1235
|
+
border: none;
|
|
1236
|
+
color: var(--text-muted);
|
|
1237
|
+
font-size: 15px;
|
|
1238
|
+
cursor: pointer;
|
|
1239
|
+
line-height: 1;
|
|
1240
|
+
padding: 4px 6px;
|
|
1241
|
+
border-radius: 4px;
|
|
1242
|
+
}
|
|
1243
|
+
.help-dismiss:hover { color: var(--text); background: var(--chrome-border); }
|
|
1244
|
+
|
|
1245
|
+
.help-title {
|
|
1246
|
+
margin: 0 0 16px;
|
|
1247
|
+
font-size: 17px;
|
|
1248
|
+
font-weight: 600;
|
|
1249
|
+
color: var(--accent);
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
.help-content {
|
|
1253
|
+
display: grid;
|
|
1254
|
+
grid-template-columns: 1.1fr 1fr;
|
|
1255
|
+
gap: 24px;
|
|
1256
|
+
overflow-y: auto;
|
|
1257
|
+
padding-right: 4px;
|
|
1258
|
+
}
|
|
1259
|
+
@media (max-width: 640px) {
|
|
1260
|
+
.help-content { grid-template-columns: 1fr; }
|
|
1261
|
+
}
|
|
1262
|
+
|
|
1263
|
+
.help-group { margin-bottom: 16px; }
|
|
1264
|
+
|
|
1265
|
+
.help-group-title {
|
|
1266
|
+
margin: 0 0 8px;
|
|
1267
|
+
font-size: 11px;
|
|
1268
|
+
font-weight: 700;
|
|
1269
|
+
text-transform: uppercase;
|
|
1270
|
+
letter-spacing: 0.06em;
|
|
1271
|
+
color: var(--text-muted);
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
.help-row {
|
|
1275
|
+
display: flex;
|
|
1276
|
+
align-items: baseline;
|
|
1277
|
+
gap: 12px;
|
|
1278
|
+
padding: 4px 0;
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1281
|
+
.help-keys {
|
|
1282
|
+
flex: 0 0 132px;
|
|
1283
|
+
display: flex;
|
|
1284
|
+
flex-wrap: wrap;
|
|
1285
|
+
align-items: center;
|
|
1286
|
+
gap: 3px;
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
.help-desc { font-size: 13px; color: var(--text); line-height: 1.4; }
|
|
1290
|
+
|
|
1291
|
+
.help-modal kbd,
|
|
1292
|
+
.help-footer kbd {
|
|
1293
|
+
display: inline-block;
|
|
1294
|
+
min-width: 16px;
|
|
1295
|
+
padding: 1px 6px;
|
|
1296
|
+
font-family: inherit;
|
|
1297
|
+
font-size: 11px;
|
|
1298
|
+
font-weight: 600;
|
|
1299
|
+
text-align: center;
|
|
1300
|
+
color: var(--text);
|
|
1301
|
+
background: var(--background);
|
|
1302
|
+
border: 1px solid var(--chrome-border);
|
|
1303
|
+
border-bottom-width: 2px;
|
|
1304
|
+
border-radius: 4px;
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
.help-or, .help-hold {
|
|
1308
|
+
font-size: 10px;
|
|
1309
|
+
color: var(--text-muted);
|
|
1310
|
+
margin: 0 2px;
|
|
1311
|
+
}
|
|
1312
|
+
.help-hold { font-style: italic; }
|
|
1313
|
+
|
|
1314
|
+
.help-feature {
|
|
1315
|
+
display: flex;
|
|
1316
|
+
gap: 10px;
|
|
1317
|
+
padding: 6px 0;
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
.help-feature-icon { font-size: 16px; line-height: 1.3; flex: 0 0 auto; }
|
|
1321
|
+
|
|
1322
|
+
.help-feature-text { display: flex; flex-direction: column; gap: 1px; }
|
|
1323
|
+
|
|
1324
|
+
.help-feature-name { font-size: 13px; font-weight: 600; color: var(--text); }
|
|
1325
|
+
|
|
1326
|
+
.help-feature-desc { font-size: 12px; color: var(--text-muted); line-height: 1.4; }
|
|
1327
|
+
|
|
1328
|
+
.help-footer {
|
|
1329
|
+
margin-top: 14px;
|
|
1330
|
+
padding-top: 12px;
|
|
1331
|
+
border-top: 1px solid var(--chrome-border);
|
|
1332
|
+
font-size: 11px;
|
|
1333
|
+
color: var(--text-muted);
|
|
1334
|
+
text-align: center;
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
/* Sidebar header "?" help button — mirrors .sidebar-quicktask */
|
|
1338
|
+
.sidebar-help {
|
|
1339
|
+
background: transparent;
|
|
1340
|
+
border: none;
|
|
1341
|
+
color: var(--text-muted);
|
|
1342
|
+
cursor: pointer;
|
|
1343
|
+
padding: 4px 7px;
|
|
1344
|
+
border-radius: 4px;
|
|
1345
|
+
font-size: 14px;
|
|
1346
|
+
font-weight: 700;
|
|
1347
|
+
line-height: 1;
|
|
1348
|
+
}
|
|
1349
|
+
.sidebar-help:hover { color: var(--accent); background: var(--chrome-border); }
|
|
1350
|
+
|
|
1212
1351
|
.announcement-dismiss:hover {
|
|
1213
1352
|
color: var(--text);
|
|
1214
1353
|
background: var(--background);
|
|
@@ -44,6 +44,11 @@ const COMMANDS = [
|
|
|
44
44
|
const { collage } = await import('./collage.js');
|
|
45
45
|
collage.enter();
|
|
46
46
|
} },
|
|
47
|
+
{ id: 'help', icon: '⌨', label: 'Keyboard shortcuts & help', keywords: 'help shortcuts keys keyboard cheat sheet f1 bindings features guide', run: async () => {
|
|
48
|
+
closeCommandPalette();
|
|
49
|
+
const { openHelp } = await import('./help-modal.js');
|
|
50
|
+
openHelp();
|
|
51
|
+
} },
|
|
47
52
|
];
|
|
48
53
|
|
|
49
54
|
// ---------------------------------------------------------------------------
|
|
@@ -32,6 +32,7 @@ import { notificationsPanel } from './notifications-panel.js';
|
|
|
32
32
|
import { scratchpad } from './scratchpad.js';
|
|
33
33
|
import { armDeadKeySuppressor, disarmDeadKeySuppressor } from './dead-key-suppressor.js';
|
|
34
34
|
import { openCommandPalette, isCommandPaletteOpen } from './command-palette.js';
|
|
35
|
+
import { setupHelp, openHelp, isHelpOpen } from './help-modal.js';
|
|
35
36
|
import * as browserStt from './voice/browser-stt.js';
|
|
36
37
|
import { voicePromptWrap } from './voice/prompt.js';
|
|
37
38
|
import { isAutoSend } from './voice/autosend-prefs.js';
|
|
@@ -83,6 +84,11 @@ async function init() {
|
|
|
83
84
|
sidebar.close();
|
|
84
85
|
openCommandPalette({ view: 'new-idea' });
|
|
85
86
|
});
|
|
87
|
+
document.getElementById('sidebarHelp')?.addEventListener('click', (e) => {
|
|
88
|
+
e.stopPropagation();
|
|
89
|
+
sidebar.close();
|
|
90
|
+
openHelp();
|
|
91
|
+
});
|
|
86
92
|
sidebar.addSection('sessions', sessionsSection);
|
|
87
93
|
sidebar.addSection('services', servicesSection);
|
|
88
94
|
sidebar.addSection('machines', machinesSection);
|
|
@@ -98,6 +104,7 @@ async function init() {
|
|
|
98
104
|
setupWindowCycling();
|
|
99
105
|
setupWindowSwipeCycling();
|
|
100
106
|
setupCollage();
|
|
107
|
+
setupHelp();
|
|
101
108
|
|
|
102
109
|
// Set up event listeners BEFORE fetching data
|
|
103
110
|
desktop.on('disconnect', () => updateConnectionStatus(false));
|
|
@@ -449,7 +456,7 @@ function setupCollage() {
|
|
|
449
456
|
const isF3 = e.code === 'F3';
|
|
450
457
|
const isAltBacktick = e.altKey && !e.metaKey && !e.ctrlKey && e.code === 'Backquote';
|
|
451
458
|
if (!isF3 && !isAltBacktick) return;
|
|
452
|
-
if (isCommandPaletteOpen()) return;
|
|
459
|
+
if (isCommandPaletteOpen() || isHelpOpen()) return;
|
|
453
460
|
e.preventDefault();
|
|
454
461
|
e.stopPropagation();
|
|
455
462
|
if (e.repeat) return; // ignore auto-repeat while the key is held
|
|
@@ -1009,7 +1016,7 @@ function setupGlobalPtt() {
|
|
|
1009
1016
|
// always intercepted.
|
|
1010
1017
|
if ((e.ctrlKey || e.metaKey) && (e.key === 'k' || e.key === 'K')) {
|
|
1011
1018
|
e.preventDefault();
|
|
1012
|
-
if (!isCommandPaletteOpen()) openCommandPalette();
|
|
1019
|
+
if (!isCommandPaletteOpen() && !isHelpOpen()) openCommandPalette();
|
|
1013
1020
|
}
|
|
1014
1021
|
});
|
|
1015
1022
|
document.addEventListener('keyup', (e) => {
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Help modal — the F1 / "?" keyboard-shortcut cheat sheet and feature tour.
|
|
3
|
+
*
|
|
4
|
+
* Renders from the shortcuts.js registry (the single source of truth), mirrors
|
|
5
|
+
* the .modal-overlay > .modal pattern from announcement-modal.js, and wires the
|
|
6
|
+
* global triggers (F1, ?). The visible "?" button in the sidebar header and a
|
|
7
|
+
* command-palette entry call openHelp() directly.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { SHORTCUT_GROUPS, FEATURE_TOUR, comboKeys } from './shortcuts.js';
|
|
11
|
+
|
|
12
|
+
let modalEl = null;
|
|
13
|
+
let escHandler = null;
|
|
14
|
+
|
|
15
|
+
function escapeHtml(s) {
|
|
16
|
+
return String(s).replace(/[&<>"']/g, (c) => (
|
|
17
|
+
{ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]
|
|
18
|
+
));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function isHelpOpen() {
|
|
22
|
+
return modalEl !== null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** One combo → "<kbd>⌘</kbd><kbd>K</kbd>". */
|
|
26
|
+
function renderCombo(combo) {
|
|
27
|
+
return comboKeys(combo).map((k) => `<kbd>${escapeHtml(k)}</kbd>`).join('');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** A shortcut row: primary combo, optional "or" alt combo, optional (hold), desc. */
|
|
31
|
+
function renderShortcutRow(item) {
|
|
32
|
+
const primary = renderCombo(item.combo);
|
|
33
|
+
const alt = item.alt ? `<span class="help-or">or</span>${renderCombo(item.alt)}` : '';
|
|
34
|
+
const hold = item.hold ? '<span class="help-hold">hold</span>' : '';
|
|
35
|
+
return `<div class="help-row">
|
|
36
|
+
<div class="help-keys">${primary}${alt}${hold}</div>
|
|
37
|
+
<div class="help-desc">${escapeHtml(item.desc)}</div>
|
|
38
|
+
</div>`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function renderShortcutGroup(group) {
|
|
42
|
+
return `<div class="help-group">
|
|
43
|
+
<h3 class="help-group-title">${escapeHtml(group.title)}</h3>
|
|
44
|
+
${group.items.map(renderShortcutRow).join('')}
|
|
45
|
+
</div>`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function renderFeature(f) {
|
|
49
|
+
return `<div class="help-feature">
|
|
50
|
+
<span class="help-feature-icon">${escapeHtml(f.icon)}</span>
|
|
51
|
+
<div class="help-feature-text">
|
|
52
|
+
<span class="help-feature-name">${escapeHtml(f.name)}</span>
|
|
53
|
+
<span class="help-feature-desc">${escapeHtml(f.desc)}</span>
|
|
54
|
+
</div>
|
|
55
|
+
</div>`;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function renderModal() {
|
|
59
|
+
return `<div class="modal-overlay help-overlay" id="helpOverlay">
|
|
60
|
+
<div class="modal help-modal" role="dialog" aria-label="Keyboard shortcuts and features" aria-modal="true">
|
|
61
|
+
<button class="help-dismiss" data-action="dismiss" title="Close (Esc)" aria-label="Close help">✕</button>
|
|
62
|
+
<h2 class="help-title">Keyboard shortcuts & features</h2>
|
|
63
|
+
<div class="help-content">
|
|
64
|
+
<div class="help-shortcuts">
|
|
65
|
+
${SHORTCUT_GROUPS.map(renderShortcutGroup).join('')}
|
|
66
|
+
</div>
|
|
67
|
+
<div class="help-features">
|
|
68
|
+
<h3 class="help-group-title">Features worth knowing</h3>
|
|
69
|
+
${FEATURE_TOUR.map(renderFeature).join('')}
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
<div class="help-footer">
|
|
73
|
+
Press <kbd>F1</kbd> or <kbd>?</kbd> anytime · <kbd>Esc</kbd> to close
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function closeHelp() {
|
|
80
|
+
if (escHandler) { document.removeEventListener('keydown', escHandler, true); escHandler = null; }
|
|
81
|
+
modalEl?.remove();
|
|
82
|
+
modalEl = null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function openHelp() {
|
|
86
|
+
if (modalEl) return;
|
|
87
|
+
const wrapper = document.createElement('div');
|
|
88
|
+
wrapper.innerHTML = renderModal();
|
|
89
|
+
modalEl = wrapper.firstElementChild;
|
|
90
|
+
document.body.appendChild(modalEl);
|
|
91
|
+
|
|
92
|
+
modalEl.addEventListener('click', (e) => {
|
|
93
|
+
if (e.target === modalEl || e.target.closest('[data-action="dismiss"]')) {
|
|
94
|
+
closeHelp();
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
// Capture phase so Esc closes the help before xterm / other handlers see it.
|
|
98
|
+
escHandler = (e) => {
|
|
99
|
+
if (e.key === 'Escape') { e.preventDefault(); e.stopPropagation(); closeHelp(); }
|
|
100
|
+
};
|
|
101
|
+
document.addEventListener('keydown', escHandler, true);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function toggleHelp() {
|
|
105
|
+
if (modalEl) closeHelp(); else openHelp();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** True when the event target is a text-editing surface (so "?" types normally). */
|
|
109
|
+
function isEditableTarget(t) {
|
|
110
|
+
if (!t) return false;
|
|
111
|
+
const tag = t.tagName;
|
|
112
|
+
return tag === 'INPUT' || tag === 'TEXTAREA' || t.isContentEditable;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Wire the global F1 / "?" triggers. Capture phase + preventDefault so F1 never
|
|
117
|
+
* opens the browser's own help, and so the keystroke beats xterm. "?" is
|
|
118
|
+
* ignored while typing in an input/textarea/terminal so it can still be typed.
|
|
119
|
+
*/
|
|
120
|
+
export function setupHelp() {
|
|
121
|
+
window.addEventListener('keydown', (e) => {
|
|
122
|
+
const isF1 = e.code === 'F1';
|
|
123
|
+
// "?" is Shift+/ — accept the produced character, no modifiers beyond Shift.
|
|
124
|
+
const isQuestion = e.key === '?' && !e.metaKey && !e.ctrlKey && !e.altKey;
|
|
125
|
+
if (!isF1 && !isQuestion) return;
|
|
126
|
+
// Let people actually type "?" into inputs and terminals.
|
|
127
|
+
if (isQuestion && isEditableTarget(e.target)) return;
|
|
128
|
+
e.preventDefault();
|
|
129
|
+
e.stopPropagation();
|
|
130
|
+
if (e.repeat) return;
|
|
131
|
+
toggleHelp();
|
|
132
|
+
}, true);
|
|
133
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyboard-shortcut + feature registry — the single source of truth for the
|
|
3
|
+
* F1 help modal (help-modal.js), the command-palette "help" entry, and the
|
|
4
|
+
* `title=` hints we show on buttons.
|
|
5
|
+
*
|
|
6
|
+
* This module holds the *catalogue*, not the bindings. Each component still
|
|
7
|
+
* registers its own capture-phase keydown listener (there is no central
|
|
8
|
+
* dispatcher — see desktop.js setupCollage / setupGlobalPtt etc.). When you
|
|
9
|
+
* add or change a real binding, update its row here too: the `where` field
|
|
10
|
+
* names the handler so the two stay findable together.
|
|
11
|
+
*
|
|
12
|
+
* Combos are token arrays. `Mod` renders ⌘ on macOS, Ctrl elsewhere; `Alt`
|
|
13
|
+
* renders ⌥ on macOS, Alt elsewhere. Plain strings render verbatim.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const IS_MAC = typeof navigator !== 'undefined'
|
|
17
|
+
&& /mac|iphone|ipad|ipod/i.test(navigator.platform || navigator.userAgent || '');
|
|
18
|
+
|
|
19
|
+
/** Render one combo token for display. */
|
|
20
|
+
function renderToken(tok) {
|
|
21
|
+
if (tok === 'Mod') return IS_MAC ? '⌘' : 'Ctrl';
|
|
22
|
+
if (tok === 'Alt') return IS_MAC ? '⌥' : 'Alt';
|
|
23
|
+
return tok;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** A combo (array of tokens) → array of display strings, for <kbd> rendering. */
|
|
27
|
+
export function comboKeys(combo) {
|
|
28
|
+
return combo.map(renderToken);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Shortcut catalogue — grouped for the help modal.
|
|
33
|
+
// where: the file:function that owns the real binding (keep in sync on change).
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
export const SHORTCUT_GROUPS = [
|
|
37
|
+
{
|
|
38
|
+
title: 'Global',
|
|
39
|
+
items: [
|
|
40
|
+
{ combo: ['Mod', 'K'], desc: 'Open the command palette', where: 'desktop.js setupCommandPalette' },
|
|
41
|
+
{ combo: ['F1'], alt: ['?'], desc: 'Show this help', where: 'help-modal.js setupHelp' },
|
|
42
|
+
{ combo: ['Mod', '`'], desc: 'Toggle the sidebar', where: 'sidebar.js' },
|
|
43
|
+
{ combo: ['Esc'], desc: 'Close the open modal, palette, collage, or sidebar', where: 'various' },
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
title: 'Voice',
|
|
48
|
+
items: [
|
|
49
|
+
{ combo: ['Mod', 'Space'], hold: true, desc: 'Push-to-talk — hold to speak to AgentWire (or the focused session)', where: 'desktop.js setupGlobalPtt / session-window.js' },
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
title: 'Windows',
|
|
54
|
+
items: [
|
|
55
|
+
{ combo: ['Tab'], alt: ['Shift', 'Tab'], desc: 'Cycle to the next / previous window', where: 'desktop.js setupWindowCycling' },
|
|
56
|
+
{ combo: ['F3'], alt: ['Alt', '`'], desc: 'Window collage — Mission-Control grid of all windows', where: 'desktop.js setupCollage' },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
title: 'Panels',
|
|
61
|
+
items: [
|
|
62
|
+
{ combo: ['Alt', 'N'], desc: 'Toggle the scratchpad drawer', where: 'scratchpad.js' },
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
title: 'Command palette (while open)',
|
|
67
|
+
items: [
|
|
68
|
+
{ combo: ['↑'], alt: ['↓'], desc: 'Move through the list', where: 'command-palette.js' },
|
|
69
|
+
{ combo: ['Enter'], desc: 'Run the selected item', where: 'command-palette.js' },
|
|
70
|
+
{ combo: ['Esc'], desc: 'Go back, or close the palette', where: 'command-palette.js' },
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Feature tour — the "you may not know this exists" half. Each row teaches a
|
|
77
|
+
// capability and (where relevant) how to reach it.
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
|
|
80
|
+
export const FEATURE_TOUR = [
|
|
81
|
+
{ icon: '🏛', name: 'Council', desc: 'Ask one question, get six lenses (brain, conscience, …) deliberating in parallel. Command palette → Ask council.' },
|
|
82
|
+
{ icon: '🎙', name: 'Push-to-talk', desc: 'Hold Ctrl/⌘+Space to talk to a session. Or open /mobile to push-to-talk from your phone.' },
|
|
83
|
+
{ icon: '▦', name: 'Window collage', desc: 'F3 fans every window into a grid — click one to dive in. Great for juggling many sessions.' },
|
|
84
|
+
{ icon: '💡', name: 'New idea', desc: 'Capture a thought and AgentWire spins up a project with an agent already working on it.' },
|
|
85
|
+
{ icon: '⎇', name: 'Worktrees', desc: 'Branch a session into an isolated git worktree for parallel work, from the palette or the Sessions panel.' },
|
|
86
|
+
{ icon: '📋', name: 'Scratchpad', desc: 'Alt+N opens a quick notes drawer that travels with you across sessions.' },
|
|
87
|
+
{ icon: '⏰', name: 'Scheduler', desc: 'Run recurring tasks on a cron — see and trigger them from the Scheduler panel.' },
|
|
88
|
+
{ icon: '🧩', name: 'Artifacts', desc: 'Agents can render live HTML into artifact windows — dashboards, handoffs, reports.' },
|
|
89
|
+
{ icon: '🛡', name: 'Safety', desc: 'Damage-control rules block dangerous commands. Review and tune them in the Safety panel.' },
|
|
90
|
+
{ icon: '📡', name: 'Machines', desc: 'Attach remote machines and tunnels — run sessions on a GPU box or another host.' },
|
|
91
|
+
];
|
|
@@ -21,6 +21,9 @@
|
|
|
21
21
|
<button class="sidebar-quicktask" id="sidebarQuicktask" title="Command palette (Cmd/Ctrl+K)" aria-label="Command palette">
|
|
22
22
|
<span class="sidebar-quicktask-icon">⚡</span>
|
|
23
23
|
</button>
|
|
24
|
+
<button class="sidebar-help" id="sidebarHelp" title="Keyboard shortcuts & help (F1)" aria-label="Keyboard shortcuts and help">
|
|
25
|
+
<span class="sidebar-help-icon">?</span>
|
|
26
|
+
</button>
|
|
24
27
|
<button class="sidebar-pin" id="sidebarPin" title="Pin sidebar open" aria-label="Pin sidebar">
|
|
25
28
|
<span class="sidebar-pin-icon">📌</span>
|
|
26
29
|
</button>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/audit_logger.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|