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.
Files changed (452) hide show
  1. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/PKG-INFO +1 -1
  2. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/__init__.py +1 -1
  3. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/announcements.json +17 -0
  4. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/css/desktop.css +139 -0
  5. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/command-palette.js +5 -0
  6. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/desktop.js +9 -2
  7. agentwire_dev-1.49.0/agentwire/static/js/help-modal.js +133 -0
  8. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/service-classification.js +1 -0
  9. agentwire_dev-1.49.0/agentwire/static/js/shortcuts.js +91 -0
  10. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/desktop.html +3 -0
  11. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.claude/commands/handoff.md +0 -0
  12. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.claude/skills/wiki/SKILL.md +0 -0
  13. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/FUNDING.yml +0 -0
  14. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  16. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  17. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  18. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/workflows/pytest.yml +0 -0
  19. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/workflows/ruff.yml +0 -0
  20. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/workflows/security.yml +0 -0
  21. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.github/workflows/tts-smoke.yml +0 -0
  22. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/.gitignore +0 -0
  23. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/AGENTS.md +0 -0
  24. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/CODE_OF_CONDUCT.md +0 -0
  25. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/CONTRIBUTING.md +0 -0
  26. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/Dockerfile.local +0 -0
  27. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/LICENSE +0 -0
  28. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/README.md +0 -0
  29. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/RELEASING.md +0 -0
  30. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/SECURITY.md +0 -0
  31. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/SPONSORS.md +0 -0
  32. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/__main__.py +0 -0
  33. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/agents/__init__.py +0 -0
  34. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/agents/base.py +0 -0
  35. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/agents/tmux.py +0 -0
  36. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/cached_status.py +0 -0
  37. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels/__init__.py +0 -0
  38. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels/base.py +0 -0
  39. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels/email.py +0 -0
  40. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels/push.py +0 -0
  41. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels/quo.py +0 -0
  42. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/channels_cli.py +0 -0
  43. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/completion.py +0 -0
  44. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/config.py +0 -0
  45. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/core.py +0 -0
  46. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/council/__init__.py +0 -0
  47. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/council/cli.py +0 -0
  48. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/council/inbox.py +0 -0
  49. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/council/state.py +0 -0
  50. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/council/view.py +0 -0
  51. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/devices.py +0 -0
  52. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/diff_cli.py +0 -0
  53. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/doctor_cli.py +0 -0
  54. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/doctor_voice.py +0 -0
  55. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/ensure_cli.py +0 -0
  56. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/fetch.py +0 -0
  57. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/__init__.py +0 -0
  58. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/git_state.py +0 -0
  59. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/instructions.py +0 -0
  60. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/parser.py +0 -0
  61. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/renderer.py +0 -0
  62. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff/schema.py +0 -0
  63. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/handoff_cli.py +0 -0
  64. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/history.py +0 -0
  65. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/history_cli.py +0 -0
  66. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/__init__.py +0 -0
  67. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/agentwire-permission.sh +0 -0
  68. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/__init__.py +0 -0
  69. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/audit_logger.py +0 -0
  70. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
  71. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
  72. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/mcp-tool-damage-control.py +0 -0
  73. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/read-tool-damage-control.py +0 -0
  74. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
  75. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
  76. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
  77. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
  78. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/control-plane.yaml +0 -0
  79. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
  80. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
  81. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
  82. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
  83. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
  84. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
  85. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
  86. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/outbound.yaml +0 -0
  87. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/publish.yaml +0 -0
  88. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
  89. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
  90. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/idle-handler.sh +0 -0
  91. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks/queue-processor.sh +0 -0
  92. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/hooks_cli.py +0 -0
  93. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/inbox.py +0 -0
  94. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/limits_cli.py +0 -0
  95. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/listen.py +0 -0
  96. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/locking.py +0 -0
  97. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/machine_cli.py +0 -0
  98. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_channels.py +0 -0
  99. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_cli.py +0 -0
  100. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_core.py +0 -0
  101. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_council.py +0 -0
  102. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_desktop.py +0 -0
  103. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_handoff.py +0 -0
  104. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_history.py +0 -0
  105. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_listen.py +0 -0
  106. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_lock.py +0 -0
  107. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_machine.py +0 -0
  108. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_msg.py +0 -0
  109. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_notify.py +0 -0
  110. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_pane.py +0 -0
  111. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_projects.py +0 -0
  112. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_scheduler.py +0 -0
  113. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_scratchpad.py +0 -0
  114. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_server.py +0 -0
  115. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_services.py +0 -0
  116. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_session.py +0 -0
  117. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_status.py +0 -0
  118. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_task.py +0 -0
  119. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_tunnels.py +0 -0
  120. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_voice.py +0 -0
  121. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_voiceclone.py +0 -0
  122. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_wiki.py +0 -0
  123. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/mcp_worktree.py +0 -0
  124. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/msg_cli.py +0 -0
  125. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/network.py +0 -0
  126. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/notify_cli.py +0 -0
  127. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/onboarding.py +0 -0
  128. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/pane_cli.py +0 -0
  129. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/pane_manager.py +0 -0
  130. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/portal_cli.py +0 -0
  131. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/project_config.py +0 -0
  132. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/projects.py +0 -0
  133. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/prompt_router.py +0 -0
  134. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/prompts_cli.py +0 -0
  135. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/push_cli.py +0 -0
  136. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/push_store.py +0 -0
  137. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/repo_cli.py +0 -0
  138. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/research.py +0 -0
  139. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/__init__.py +0 -0
  140. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/agentwire.md +0 -0
  141. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/anchor.md +0 -0
  142. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/chatbot.md +0 -0
  143. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/correspondent.md +0 -0
  144. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-brain.md +0 -0
  145. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-conscience.md +0 -0
  146. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-critic.md +0 -0
  147. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-devils-advocate.md +0 -0
  148. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-gut.md +0 -0
  149. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-historian.md +0 -0
  150. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-member.md +0 -0
  151. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/council-orchestrator.md +0 -0
  152. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/init.md +0 -0
  153. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/notifications.md +0 -0
  154. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/orchestrator.md +0 -0
  155. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/soul.md +0 -0
  156. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/task-runner.md +0 -0
  157. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/voice.md +0 -0
  158. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/worker.md +0 -0
  159. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles/worktree-session.md +0 -0
  160. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/roles_cli.py +0 -0
  161. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/__init__.py +0 -0
  162. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/artifacts.py +0 -0
  163. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/config.py +0 -0
  164. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/council.py +0 -0
  165. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/desktop.py +0 -0
  166. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/history.py +0 -0
  167. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/machines.py +0 -0
  168. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/notify.py +0 -0
  169. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/permission.py +0 -0
  170. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/projects.py +0 -0
  171. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/push.py +0 -0
  172. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/safety.py +0 -0
  173. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/scheduler.py +0 -0
  174. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/scratchpad.py +0 -0
  175. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/sessions.py +0 -0
  176. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/sessions_admin.py +0 -0
  177. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/routes/voice.py +0 -0
  178. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/safety/__init__.py +0 -0
  179. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/safety/_core.py +0 -0
  180. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/safety_cli.py +0 -0
  181. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/safety_commands.py +0 -0
  182. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/scheduler.py +0 -0
  183. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/scheduler_cli.py +0 -0
  184. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/scratchpad.py +0 -0
  185. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/security.py +0 -0
  186. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/send_cli.py +0 -0
  187. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/server.py +0 -0
  188. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/services.py +0 -0
  189. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/session_cli.py +0 -0
  190. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/session_context.py +0 -0
  191. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/session_ready.py +0 -0
  192. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/ssh.py +0 -0
  193. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
  194. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
  195. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
  196. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
  197. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
  198. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/css/mobile.css +0 -0
  199. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/favicon.png +0 -0
  200. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/bear.webp +0 -0
  201. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/cat.webp +0 -0
  202. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/crown.webp +0 -0
  203. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/custom/agentwire-portal.webp +0 -0
  204. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/custom/agentwire-tts.webp +0 -0
  205. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/custom/agentwire.webp +0 -0
  206. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/deer.webp +0 -0
  207. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/drone.webp +0 -0
  208. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/eagle.webp +0 -0
  209. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/fox.webp +0 -0
  210. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/hawk.webp +0 -0
  211. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/horse.webp +0 -0
  212. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/lion.webp +0 -0
  213. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/rabbit.webp +0 -0
  214. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/robot.webp +0 -0
  215. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/tiger.webp +0 -0
  216. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/icons/sessions/wolf.webp +0 -0
  217. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/img/icon-192.png +0 -0
  218. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/img/icon-512.png +0 -0
  219. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/.gitkeep +0 -0
  220. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/announcement-modal.js +0 -0
  221. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/api.js +0 -0
  222. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/artifact-window.js +0 -0
  223. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/collage.js +0 -0
  224. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/council-window.js +0 -0
  225. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/dead-key-suppressor.js +0 -0
  226. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/desktop-manager.js +0 -0
  227. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/icon-manager.js +0 -0
  228. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/mobile.js +0 -0
  229. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/notification-prefs.js +0 -0
  230. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/notifications-panel.js +0 -0
  231. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/push-client.js +0 -0
  232. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/review-window.js +0 -0
  233. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/safety-shared.js +0 -0
  234. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/safety-window.js +0 -0
  235. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/scratchpad.js +0 -0
  236. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/session-id.js +0 -0
  237. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/session-window.js +0 -0
  238. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
  239. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/config-section.js +0 -0
  240. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/council-section.js +0 -0
  241. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
  242. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
  243. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
  244. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
  245. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/services-section.js +0 -0
  246. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar/sessions-section.js +0 -0
  247. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/sidebar.js +0 -0
  248. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
  249. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/tile-manager.js +0 -0
  250. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/toast.js +0 -0
  251. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/token-modal.js +0 -0
  252. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/utils/ansi.js +0 -0
  253. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/utils/swipe.js +0 -0
  254. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/voice/autosend-prefs.js +0 -0
  255. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/voice/browser-stt.js +0 -0
  256. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/voice/browser-tts.js +0 -0
  257. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/voice/jargon.js +0 -0
  258. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/voice/prompt.js +0 -0
  259. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
  260. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/manifest.webmanifest +0 -0
  261. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/static/service-worker.js +0 -0
  262. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/__init__.py +0 -0
  263. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/base.py +0 -0
  264. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/cloud.py +0 -0
  265. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/engine.py +0 -0
  266. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/local.py +0 -0
  267. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/server_backend.py +0 -0
  268. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/stt/stt_server.py +0 -0
  269. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/system_cli.py +0 -0
  270. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tasks.py +0 -0
  271. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/__init__.py +0 -0
  272. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/base.html +0 -0
  273. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/email_notification.html +0 -0
  274. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
  275. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
  276. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/mobile.html +0 -0
  277. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/pair.html +0 -0
  278. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templates/tmux.conf +0 -0
  279. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/templating.py +0 -0
  280. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/aws.yaml +0 -0
  281. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/docker.yaml +0 -0
  282. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/gcp.yaml +0 -0
  283. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/gh.yaml +0 -0
  284. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/git.yaml +0 -0
  285. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/gws.yaml +0 -0
  286. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/kubectl.yaml +0 -0
  287. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/npm.yaml +0 -0
  288. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/terraform.yaml +0 -0
  289. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tooldefs/uv.yaml +0 -0
  290. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/__init__.py +0 -0
  291. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/audio.py +0 -0
  292. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/base.py +0 -0
  293. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/engines/__init__.py +0 -0
  294. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/engines/chatterbox.py +0 -0
  295. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/engines/kokoro.py +0 -0
  296. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/engines/zonos.py +0 -0
  297. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/kokoro_server.py +0 -0
  298. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/local.py +0 -0
  299. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts/registry.py +0 -0
  300. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts_cli.py +0 -0
  301. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tts_server.py +0 -0
  302. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tunnels.py +0 -0
  303. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/tunnels_cli.py +0 -0
  304. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/usage_limit.py +0 -0
  305. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/__init__.py +0 -0
  306. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/chunker.py +0 -0
  307. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/event_log.py +0 -0
  308. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/file_io.py +0 -0
  309. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/paths.py +0 -0
  310. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/speech.py +0 -0
  311. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/utils/subprocess.py +0 -0
  312. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/validation.py +0 -0
  313. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voice_status.py +0 -0
  314. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voiceclone.py +0 -0
  315. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voices/darren.wav +0 -0
  316. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voices/default.wav +0 -0
  317. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voices/jessica.wav +0 -0
  318. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voices/lisa.wav +0 -0
  319. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/voices/may.wav +0 -0
  320. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/wiki.py +0 -0
  321. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/wiki_audit.py +0 -0
  322. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/wiki_cli.py +0 -0
  323. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/worktree.py +0 -0
  324. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/agentwire/worktree_registry.py +0 -0
  325. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/decisions/obsidian-second-brain.md +0 -0
  326. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/logo.png +0 -0
  327. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/INDEX.md +0 -0
  328. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/architecture.md +0 -0
  329. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/briefing-mode.md +0 -0
  330. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/communication/channels.md +0 -0
  331. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/communication/hammerspoon.md +0 -0
  332. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/communication/handoff.md +0 -0
  333. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/concepts.md +0 -0
  334. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/council.md +0 -0
  335. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/deployment/remote-access.md +0 -0
  336. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/deployment/remote-machines.md +0 -0
  337. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/glossary.md +0 -0
  338. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
  339. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/damage-control.md +0 -0
  340. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/parallel-refactor.md +0 -0
  341. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/portal.md +0 -0
  342. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/shell-escaping.md +0 -0
  343. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/troubleshooting.md +0 -0
  344. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/internals/window-collage.md +0 -0
  345. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/quickstart.md +0 -0
  346. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/research/briefing-mode-feasibility.md +0 -0
  347. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/research/orchestration-transport-alternatives.md +0 -0
  348. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
  349. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/security/damage-control-hardening.md +0 -0
  350. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/security/pip-audit.md +0 -0
  351. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/security/remote-access-hardening.md +0 -0
  352. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/security/secrets.md +0 -0
  353. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/services.md +0 -0
  354. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
  355. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/messaging.md +0 -0
  356. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/pi.md +0 -0
  357. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/prompt-routing.md +0 -0
  358. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/window-sizing.md +0 -0
  359. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/sessions/worktree-sessions.md +0 -0
  360. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/usage-limit-recovery.md +0 -0
  361. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/voice/shim-contract.md +0 -0
  362. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/voice/stt-cloud.md +0 -0
  363. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/voice/stt-self-hosted.md +0 -0
  364. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/docs/wiki/voice/tts-self-hosted.md +0 -0
  365. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/pyproject.toml +0 -0
  366. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/conftest.py +0 -0
  367. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/e2e/test_portal_ui.py +0 -0
  368. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/fixtures/sample_agentwire.yml +0 -0
  369. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/fixtures/sample_config.yaml +0 -0
  370. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/fixtures/sample_scheduler.yaml +0 -0
  371. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/integration/test_council_portal.py +0 -0
  372. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/integration/test_scheduler_board.py +0 -0
  373. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/integration/test_server_websockets.py +0 -0
  374. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/integration/test_worktree_cmd.py +0 -0
  375. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_announcements.py +0 -0
  376. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_build_agent_command.py +0 -0
  377. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_channels.py +0 -0
  378. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_cli_commands.py +0 -0
  379. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_cli_output.py +0 -0
  380. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_cli_smoke.py +0 -0
  381. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_config.py +0 -0
  382. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_control_plane_protection.py +0 -0
  383. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_council_cli.py +0 -0
  384. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_council_inbox.py +0 -0
  385. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_council_state.py +0 -0
  386. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_council_view.py +0 -0
  387. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_damage_control_bypass.py +0 -0
  388. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_damage_control_hooks.py +0 -0
  389. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_damage_control_sync.py +0 -0
  390. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_devices.py +0 -0
  391. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_diff_cli.py +0 -0
  392. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_doctor_voice.py +0 -0
  393. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_event_log.py +0 -0
  394. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_file_io.py +0 -0
  395. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_handoff_git_state.py +0 -0
  396. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_handoff_instructions.py +0 -0
  397. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_handoff_parser.py +0 -0
  398. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_handoff_renderer.py +0 -0
  399. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_history.py +0 -0
  400. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_hooks_install.py +0 -0
  401. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_idle_handler.py +0 -0
  402. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_idle_nag.py +0 -0
  403. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_inbox.py +0 -0
  404. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_init_command.py +0 -0
  405. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_limits_tick_isolation.py +0 -0
  406. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_locking.py +0 -0
  407. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_mcp_server.py +0 -0
  408. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_mcp_tools_args.py +0 -0
  409. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_msg_cli.py +0 -0
  410. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_portal_api.py +0 -0
  411. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_project_config.py +0 -0
  412. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_prompt_router.py +0 -0
  413. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_push.py +0 -0
  414. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_rebuild_guard.py +0 -0
  415. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_repo_cli.py +0 -0
  416. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_roles.py +0 -0
  417. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_routes_snapshot.py +0 -0
  418. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_safety_commands.py +0 -0
  419. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_safety_disabled_rules.py +0 -0
  420. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_safety_escape_hatch.py +0 -0
  421. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_safety_heal.py +0 -0
  422. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_safety_kill_switch.py +0 -0
  423. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_scheduler.py +0 -0
  424. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_scheduler_parsing.py +0 -0
  425. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_scratchpad.py +0 -0
  426. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_security.py +0 -0
  427. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_server_async.py +0 -0
  428. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_server_pure.py +0 -0
  429. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_services.py +0 -0
  430. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_session_context.py +0 -0
  431. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_session_ready.py +0 -0
  432. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_skill_install.py +0 -0
  433. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_speech_tags.py +0 -0
  434. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_ssh.py +0 -0
  435. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_stt_backend.py +0 -0
  436. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_stt_cloud.py +0 -0
  437. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_stt_engine.py +0 -0
  438. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_task_cli.py +0 -0
  439. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_tasks.py +0 -0
  440. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_templating.py +0 -0
  441. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_terminal_resize.py +0 -0
  442. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_tmux_template.py +0 -0
  443. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_tts_engine_resolution.py +0 -0
  444. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_tts_local.py +0 -0
  445. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_tunnels_probe.py +0 -0
  446. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_usage_limit.py +0 -0
  447. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_validation.py +0 -0
  448. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_voice_status.py +0 -0
  449. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_wiki.py +0 -0
  450. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_wiki_audit.py +0 -0
  451. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_worktree.py +0 -0
  452. {agentwire_dev-1.48.0 → agentwire_dev-1.49.0}/tests/unit/test_worktree_registry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentwire-dev
3
- Version: 1.48.0
3
+ Version: 1.49.0
4
4
  Summary: Multi-session voice web interface for AI coding agents
5
5
  Project-URL: Homepage, https://agentwire.dev
6
6
  Project-URL: Repository, https://github.com/dotdevdotdev/agentwire-dev
@@ -1,3 +1,3 @@
1
1
  """AgentWire - Multi-session voice web interface for AI coding agents."""
2
2
 
3
- __version__ = "1.48.0"
3
+ __version__ = "1.49.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
+ { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[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 &amp; 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
+ }
@@ -11,6 +11,7 @@ const SERVICE_SESSIONS = new Set([
11
11
  'agentwire-portal',
12
12
  'agentwire-tts',
13
13
  'agentwire-stt',
14
+ 'agentwire-kokoro', // default-tier Kokoro TTS shim subprocess (:8102)
14
15
  'agentwire-scheduler',
15
16
  'agentwire-notifications',
16
17
  ]);
@@ -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 &amp; 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