agentwire-dev 1.35.1__tar.gz → 1.36.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 (385) hide show
  1. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/PKG-INFO +3 -2
  2. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/README.md +2 -1
  3. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/__init__.py +1 -1
  4. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/__main__.py +201 -41
  5. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/channels/email.py +11 -7
  6. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/channels/quo.py +12 -7
  7. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/config.py +67 -14
  8. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/agentwire-permission.sh +20 -2
  9. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/idle-handler.sh +21 -3
  10. agentwire_dev-1.36.0/agentwire/hooks/queue-processor.sh +105 -0
  11. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/limits_cli.py +27 -11
  12. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/project_config.py +52 -0
  13. agentwire_dev-1.36.0/agentwire/prompt_router.py +721 -0
  14. agentwire_dev-1.36.0/agentwire/prompts_cli.py +126 -0
  15. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/__init__.py +41 -0
  16. agentwire_dev-1.36.0/agentwire/roles/worktree-mission.md +29 -0
  17. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/security.py +2 -2
  18. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/server.py +150 -55
  19. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/css/desktop.css +20 -0
  20. agentwire_dev-1.36.0/agentwire/static/css/mobile.css +558 -0
  21. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/command-palette.js +1 -1
  22. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/desktop.js +4 -3
  23. agentwire_dev-1.36.0/agentwire/static/js/mobile.js +575 -0
  24. agentwire_dev-1.36.0/agentwire/static/js/service-classification.js +43 -0
  25. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/session-window.js +3 -2
  26. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/sidebar/services-section.js +2 -1
  27. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/sidebar/sessions-section.js +2 -24
  28. agentwire_dev-1.36.0/agentwire/stt/__init__.py +67 -0
  29. agentwire_dev-1.36.0/agentwire/stt/cloud.py +107 -0
  30. agentwire_dev-1.36.0/agentwire/stt/engine.py +171 -0
  31. agentwire_dev-1.36.0/agentwire/stt/stt_server.py +136 -0
  32. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/templates/desktop.html +1 -0
  33. agentwire_dev-1.36.0/agentwire/templates/mobile.html +52 -0
  34. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/usage_limit.py +5 -1
  35. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/validation.py +7 -3
  36. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/INDEX.md +11 -3
  37. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/architecture.md +2 -0
  38. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/communication/channels.md +11 -7
  39. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/glossary.md +1 -1
  40. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/missions.md +2 -0
  41. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/quickstart.md +11 -5
  42. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/scheduling/scheduled-workloads.md +1 -1
  43. agentwire_dev-1.36.0/docs/wiki/security/secrets.md +90 -0
  44. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/sessions/pi.md +17 -9
  45. agentwire_dev-1.36.0/docs/wiki/sessions/prompt-routing.md +125 -0
  46. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/usage-limit-recovery.md +5 -0
  47. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/voice/shim-contract.md +16 -14
  48. agentwire_dev-1.36.0/docs/wiki/voice/stt-cloud.md +69 -0
  49. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/voice/stt-self-hosted.md +7 -1
  50. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_build_agent_command.py +36 -6
  51. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_channels.py +37 -15
  52. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_config.py +27 -5
  53. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_portal_api.py +250 -1
  54. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_project_config.py +51 -0
  55. agentwire_dev-1.36.0/tests/unit/test_prompt_router.py +844 -0
  56. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_roles.py +98 -0
  57. agentwire_dev-1.36.0/tests/unit/test_stt_cloud.py +149 -0
  58. agentwire_dev-1.36.0/tests/unit/test_stt_engine.py +98 -0
  59. agentwire_dev-1.36.0/tests/unit/test_task_cli.py +70 -0
  60. agentwire_dev-1.36.0/tests/unit/test_validation.py +40 -0
  61. agentwire_dev-1.35.1/agentwire/hooks/queue-processor.sh +0 -78
  62. agentwire_dev-1.35.1/agentwire/stt/__init__.py +0 -36
  63. agentwire_dev-1.35.1/agentwire/stt/stt_server.py +0 -246
  64. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/.github/FUNDING.yml +0 -0
  65. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  66. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  67. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  68. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  69. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/.github/workflows/tts-smoke.yml +0 -0
  70. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/.gitignore +0 -0
  71. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/CHANGELOG.md +0 -0
  72. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/CLA.md +0 -0
  73. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/CODE_OF_CONDUCT.md +0 -0
  74. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/CONTRIBUTING.md +0 -0
  75. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/Dockerfile.local +0 -0
  76. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/Dockerfile.runpod +0 -0
  77. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/LICENSE +0 -0
  78. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/RELEASING.md +0 -0
  79. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/SECURITY.md +0 -0
  80. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/SPONSORS.md +0 -0
  81. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/agents/__init__.py +0 -0
  82. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/agents/base.py +0 -0
  83. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/agents/tmux.py +0 -0
  84. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/cached_status.py +0 -0
  85. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/channels/__init__.py +0 -0
  86. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/channels/base.py +0 -0
  87. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/cli_safety.py +0 -0
  88. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/completion.py +0 -0
  89. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/council/__init__.py +0 -0
  90. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/council/cli.py +0 -0
  91. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/council/inbox.py +0 -0
  92. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/council/state.py +0 -0
  93. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/fetch.py +0 -0
  94. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/handoff/__init__.py +0 -0
  95. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/handoff/git_state.py +0 -0
  96. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/handoff/instructions.py +0 -0
  97. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/handoff/parser.py +0 -0
  98. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/handoff/renderer.py +0 -0
  99. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/handoff/schema.py +0 -0
  100. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/history.py +0 -0
  101. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/__init__.py +0 -0
  102. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/__init__.py +0 -0
  103. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/audit_logger.py +0 -0
  104. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
  105. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
  106. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
  107. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
  108. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
  109. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
  110. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
  111. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
  112. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
  113. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
  114. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
  115. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
  116. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
  117. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
  118. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
  119. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/listen.py +0 -0
  120. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/locking.py +0 -0
  121. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/mcp_server.py +0 -0
  122. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/missions/__init__.py +0 -0
  123. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/missions/cli.py +0 -0
  124. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/missions/config.py +0 -0
  125. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/missions/dispatcher.py +0 -0
  126. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/missions/eligibility.py +0 -0
  127. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/missions/feedback_router.py +0 -0
  128. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/missions/gc.py +0 -0
  129. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/missions/github.py +0 -0
  130. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/missions/naming.py +0 -0
  131. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/missions/state.py +0 -0
  132. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/network.py +0 -0
  133. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/onboarding.py +0 -0
  134. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/overnight.py +0 -0
  135. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/pane_manager.py +0 -0
  136. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/projects.py +0 -0
  137. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/prompts/__init__.py +0 -0
  138. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/prompts/init.md +0 -0
  139. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/agentwire.md +0 -0
  140. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/chatbot.md +0 -0
  141. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/council-brain.md +0 -0
  142. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/council-conscience.md +0 -0
  143. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/council-critic.md +0 -0
  144. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/council-devils-advocate.md +0 -0
  145. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/council-gut.md +0 -0
  146. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/council-historian.md +0 -0
  147. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/council-member.md +0 -0
  148. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/council-orchestrator.md +0 -0
  149. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/init.md +0 -0
  150. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/notifications.md +0 -0
  151. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/orchestrator.md +0 -0
  152. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/soul.md +0 -0
  153. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/task-runner.md +0 -0
  154. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/voice.md +0 -0
  155. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/roles/worker.md +0 -0
  156. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/safety/__init__.py +0 -0
  157. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/safety/_core.py +0 -0
  158. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/scheduler.py +0 -0
  159. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/scratchpad.py +0 -0
  160. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/services.py +0 -0
  161. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/session_ready.py +0 -0
  162. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-Echo--black.png +0 -0
  163. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-Echo--transparent.png +0 -0
  164. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-Echo.png +0 -0
  165. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-email-banner.png +0 -0
  166. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
  167. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
  168. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
  169. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers--full--transparent-top.png +0 -0
  170. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers--full-black.png +0 -0
  171. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers--telephone-fg.png +0 -0
  172. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
  173. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers--transparent-top.png +0 -0
  174. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers--transparent.png +0 -0
  175. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
  176. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/agentwire-splash-logo-layers.png +0 -0
  177. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/announcements.json +0 -0
  178. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/favicon.png +0 -0
  179. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/android.jpeg +0 -0
  180. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/automaton.jpeg +0 -0
  181. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/bot.jpeg +0 -0
  182. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/cyborg.jpeg +0 -0
  183. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/droid.jpeg +0 -0
  184. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/drone.jpeg +0 -0
  185. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/guardian.jpeg +0 -0
  186. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/mech.jpeg +0 -0
  187. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/probe.jpeg +0 -0
  188. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/robot.jpeg +0 -0
  189. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/sentinel.jpeg +0 -0
  190. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/machines/unit.jpeg +0 -0
  191. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/blob.jpeg +0 -0
  192. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/cloud.jpeg +0 -0
  193. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/crystal.jpeg +0 -0
  194. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/cyclops.jpeg +0 -0
  195. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/flame.jpeg +0 -0
  196. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/fuzzy.jpeg +0 -0
  197. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/horned.jpeg +0 -0
  198. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/moon.jpeg +0 -0
  199. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/slime.jpeg +0 -0
  200. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/star.jpeg +0 -0
  201. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/tentacle.jpeg +0 -0
  202. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/projects/winged.jpeg +0 -0
  203. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/bear.jpeg +0 -0
  204. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/cat.jpeg +0 -0
  205. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/crown.jpeg +0 -0
  206. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/custom/agentwire-portal.png +0 -0
  207. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/custom/agentwire-tts.png +0 -0
  208. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/custom/agentwire.png +0 -0
  209. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/deer.jpeg +0 -0
  210. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/drone.jpeg +0 -0
  211. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/eagle.jpeg +0 -0
  212. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/fox.jpeg +0 -0
  213. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/hawk.jpeg +0 -0
  214. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/horse.jpeg +0 -0
  215. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/lion.jpeg +0 -0
  216. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/rabbit.jpeg +0 -0
  217. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/robot.jpeg +0 -0
  218. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/tiger.jpeg +0 -0
  219. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/icons/sessions/wolf.jpeg +0 -0
  220. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/.gitkeep +0 -0
  221. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/announcement-modal.js +0 -0
  222. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/api.js +0 -0
  223. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/artifact-window.js +0 -0
  224. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/collage.js +0 -0
  225. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/components/icon-picker.js +0 -0
  226. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/components/list-card.js +0 -0
  227. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/components/type-tag.js +0 -0
  228. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/dead-key-suppressor.js +0 -0
  229. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/desktop-manager.js +0 -0
  230. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/icon-manager.js +0 -0
  231. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/notification-prefs.js +0 -0
  232. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/notifications-panel.js +0 -0
  233. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/safety-shared.js +0 -0
  234. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/safety-window.js +0 -0
  235. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/scratchpad.js +0 -0
  236. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/session-id.js +0 -0
  237. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
  238. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/sidebar/config-section.js +0 -0
  239. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
  240. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/sidebar/missions-section.js +0 -0
  241. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
  242. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
  243. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
  244. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/sidebar.js +0 -0
  245. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
  246. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/tile-manager.js +0 -0
  247. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/token-modal.js +0 -0
  248. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/utils/ansi.js +0 -0
  249. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/utils/auto-refresh.js +0 -0
  250. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/voice/browser-stt.js +0 -0
  251. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/voice/browser-tts.js +0 -0
  252. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/voice/jargon.js +0 -0
  253. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/voice/prompt.js +0 -0
  254. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
  255. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/stt/base.py +0 -0
  256. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/stt/server_backend.py +0 -0
  257. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tasks.py +0 -0
  258. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/templates/__init__.py +0 -0
  259. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/templates/base.html +0 -0
  260. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/templates/email_notification.html +0 -0
  261. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
  262. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
  263. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/templates/tmux.conf +0 -0
  264. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/templating.py +0 -0
  265. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tooldefs/aws.yaml +0 -0
  266. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tooldefs/docker.yaml +0 -0
  267. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tooldefs/gcp.yaml +0 -0
  268. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tooldefs/gh.yaml +0 -0
  269. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tooldefs/git.yaml +0 -0
  270. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tooldefs/gws.yaml +0 -0
  271. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tooldefs/kubectl.yaml +0 -0
  272. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tooldefs/npm.yaml +0 -0
  273. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tooldefs/terraform.yaml +0 -0
  274. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tooldefs/uv.yaml +0 -0
  275. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/__init__.py +0 -0
  276. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/audio.py +0 -0
  277. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/base.py +0 -0
  278. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/engines/__init__.py +0 -0
  279. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/engines/chatterbox.py +0 -0
  280. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/engines/kokoro.py +0 -0
  281. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/engines/qwen_base.py +0 -0
  282. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/engines/qwen_custom.py +0 -0
  283. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/engines/qwen_design.py +0 -0
  284. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/engines/zonos.py +0 -0
  285. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/local.py +0 -0
  286. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts/registry.py +0 -0
  287. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tts_server.py +0 -0
  288. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/tunnels.py +0 -0
  289. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/utils/__init__.py +0 -0
  290. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/utils/chunker.py +0 -0
  291. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/utils/file_io.py +0 -0
  292. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/utils/paths.py +0 -0
  293. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/utils/speech.py +0 -0
  294. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/utils/subprocess.py +0 -0
  295. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/voiceclone.py +0 -0
  296. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/voices/darren.wav +0 -0
  297. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/voices/default.wav +0 -0
  298. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/voices/jessica.wav +0 -0
  299. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/voices/lisa.wav +0 -0
  300. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/voices/may.wav +0 -0
  301. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/agentwire/worktree.py +0 -0
  302. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/decisions/obsidian-second-brain.md +0 -0
  303. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/logo.png +0 -0
  304. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/communication/hammerspoon.md +0 -0
  305. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/communication/handoff.md +0 -0
  306. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/concepts.md +0 -0
  307. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/council.md +0 -0
  308. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/deployment/remote-access.md +0 -0
  309. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/deployment/remote-machines.md +0 -0
  310. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
  311. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/internals/damage-control.md +0 -0
  312. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/internals/portal.md +0 -0
  313. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/internals/shell-escaping.md +0 -0
  314. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/internals/troubleshooting.md +0 -0
  315. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/internals/window-collage.md +0 -0
  316. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/services.md +0 -0
  317. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
  318. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/sessions/window-sizing.md +0 -0
  319. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/docs/wiki/voice/tts-self-hosted.md +0 -0
  320. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/pyproject.toml +0 -0
  321. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/requirements-tts.txt +0 -0
  322. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/templates/launchd/dev.agentwire.mission-dispatcher.plist +0 -0
  323. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/templates/launchd/dev.agentwire.mission-feedback-router.plist +0 -0
  324. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/templates/launchd/dev.agentwire.mission-janitor.plist +0 -0
  325. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/conftest.py +0 -0
  326. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/e2e/test_portal_ui.py +0 -0
  327. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/fixtures/sample_agentwire.yml +0 -0
  328. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/fixtures/sample_config.yaml +0 -0
  329. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/fixtures/sample_scheduler.yaml +0 -0
  330. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/integration/test_missions_concurrency.py +0 -0
  331. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/integration/test_missions_lifecycle.py +0 -0
  332. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/integration/test_scheduler_board.py +0 -0
  333. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/integration/test_server_websockets.py +0 -0
  334. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_announcements.py +0 -0
  335. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_cli_commands.py +0 -0
  336. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_cli_output.py +0 -0
  337. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_cli_safety.py +0 -0
  338. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_council_cli.py +0 -0
  339. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_council_inbox.py +0 -0
  340. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_council_state.py +0 -0
  341. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_damage_control_hooks.py +0 -0
  342. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_damage_control_sync.py +0 -0
  343. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_file_io.py +0 -0
  344. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_handoff_git_state.py +0 -0
  345. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_handoff_instructions.py +0 -0
  346. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_handoff_parser.py +0 -0
  347. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_handoff_renderer.py +0 -0
  348. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_history.py +0 -0
  349. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_hooks_install.py +0 -0
  350. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_idle_handler.py +0 -0
  351. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_locking.py +0 -0
  352. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_mcp_server.py +0 -0
  353. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_mcp_tools_args.py +0 -0
  354. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_missions_cli.py +0 -0
  355. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_missions_config.py +0 -0
  356. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_missions_dispatcher.py +0 -0
  357. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_missions_eligibility.py +0 -0
  358. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_missions_feedback_router.py +0 -0
  359. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_missions_gc.py +0 -0
  360. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_missions_github.py +0 -0
  361. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_missions_naming.py +0 -0
  362. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_missions_state.py +0 -0
  363. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_overnight_resume_flags.py +0 -0
  364. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_safety_disabled_rules.py +0 -0
  365. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_safety_escape_hatch.py +0 -0
  366. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_safety_kill_switch.py +0 -0
  367. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_safety_mission_worker.py +0 -0
  368. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_scheduler.py +0 -0
  369. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_scheduler_parsing.py +0 -0
  370. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_scratchpad.py +0 -0
  371. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_security.py +0 -0
  372. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_server_async.py +0 -0
  373. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_server_pure.py +0 -0
  374. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_services.py +0 -0
  375. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_session_ready.py +0 -0
  376. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_speech_tags.py +0 -0
  377. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_stt_backend.py +0 -0
  378. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_tasks.py +0 -0
  379. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_templating.py +0 -0
  380. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_terminal_resize.py +0 -0
  381. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_tmux_template.py +0 -0
  382. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_tts_engine_resolution.py +0 -0
  383. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_tts_local.py +0 -0
  384. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_usage_limit.py +0 -0
  385. {agentwire_dev-1.35.1 → agentwire_dev-1.36.0}/tests/unit/test_worktree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentwire-dev
3
- Version: 1.35.1
3
+ Version: 1.36.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
@@ -849,7 +849,8 @@ Agent responses are spoken back — Kokoro neural voice out of the box, or any T
849
849
  AgentWire supports orchestrator/worker patterns for complex tasks:
850
850
 
851
851
  ```yaml
852
- # .agentwire.yml in your project
852
+ # .agentwire.yml in your project (keep it gitignored — it's personal config,
853
+ # and tracked copies break worktree dispatch; agentwire adds it to .gitignore for you)
853
854
  type: claude-bypass
854
855
  roles:
855
856
  - agentwire
@@ -128,7 +128,8 @@ Agent responses are spoken back — Kokoro neural voice out of the box, or any T
128
128
  AgentWire supports orchestrator/worker patterns for complex tasks:
129
129
 
130
130
  ```yaml
131
- # .agentwire.yml in your project
131
+ # .agentwire.yml in your project (keep it gitignored — it's personal config,
132
+ # and tracked copies break worktree dispatch; agentwire adds it to .gitignore for you)
132
133
  type: claude-bypass
133
134
  roles:
134
135
  - agentwire
@@ -1,3 +1,3 @@
1
1
  """AgentWire - Multi-session voice web interface for AI coding agents."""
2
2
 
3
- __version__ = "1.35.1"
3
+ __version__ = "1.36.0"
@@ -36,7 +36,15 @@ from .project_config import (
36
36
  normalize_session_type,
37
37
  save_project_config,
38
38
  )
39
- from .roles import RoleConfig, inject_soul, load_roles, merge_roles
39
+ from .roles import (
40
+ WORKTREE_MISSION_ROLE,
41
+ RoleConfig,
42
+ inject_soul,
43
+ inject_worktree_mission,
44
+ load_roles,
45
+ merge_roles,
46
+ render_mission_placeholders,
47
+ )
40
48
  from .worktree import ensure_worktree, parse_session_name, remove_worktree
41
49
 
42
50
  # Default config directory
@@ -193,10 +201,20 @@ def build_agent_command(session_type: str, roles: list[RoleConfig] | None = None
193
201
  raise ValueError(
194
202
  f"No config for pi provider '{provider}'. "
195
203
  f"Add pi.providers.{provider} to ~/.agentwire/config.yaml "
196
- f"with at least env_var, api_key, and default_model."
204
+ f"with at least env_var and default_model, and put the key "
205
+ f"itself in ~/.agentwire/.env (docs/wiki/security/secrets.md)."
197
206
  )
198
207
  env_var = provider_cfg.get("env_var", f"{provider.upper().replace('-', '_')}_API_KEY")
199
- api_key = provider_cfg.get("api_key", "")
208
+ if provider_cfg.get("api_key"):
209
+ print(
210
+ f"Warning: pi.providers.{provider}.api_key in config.yaml is "
211
+ f"ignored — put {env_var}=... in ~/.agentwire/.env instead "
212
+ f"(docs/wiki/security/secrets.md)",
213
+ file=sys.stderr,
214
+ )
215
+ # The key comes from the process environment — ~/.agentwire/.env is
216
+ # loaded on every entry point, so one line there is all it takes.
217
+ api_key = os.environ.get(env_var, "")
200
218
  default_model = provider_cfg.get("default_model", "")
201
219
 
202
220
  # Merge provider key + any global pi extra_env
@@ -2418,32 +2436,38 @@ def cmd_notify_parent(args) -> int:
2418
2436
  if parent:
2419
2437
  target_session = parent
2420
2438
 
2421
- # Build notification message
2422
- source = current_session or "unknown"
2423
- if current_pane is not None and current_pane > 0:
2424
- notification = f"[NOTIFY from {source} pane {current_pane}] {text}"
2439
+ # Build notification message (--raw sends verbatim — queued messages
2440
+ # already carry their own [WORKER SUMMARY ...] / [PROMPT ...] headers)
2441
+ if getattr(args, 'raw', False):
2442
+ notification = text
2425
2443
  else:
2426
- notification = f"[NOTIFY from {source}] {text}"
2427
-
2428
- try:
2429
- if target_session:
2430
- if target_session == current_session and current_pane == 0:
2431
- print("Cannot notify own pane", file=sys.stderr)
2432
- return 1
2433
- pane_manager.send_to_pane(target_session, 0, notification)
2434
- if not getattr(args, 'quiet', False):
2435
- print(f"Notified {target_session}")
2436
- elif current_pane is not None and current_pane > 0 and current_session:
2437
- pane_manager.send_to_pane(current_session, 0, notification)
2438
- if not getattr(args, 'quiet', False):
2439
- print(f"Notified {current_session} pane 0")
2444
+ source = current_session or "unknown"
2445
+ if current_pane is not None and current_pane > 0:
2446
+ notification = f"[NOTIFY from {source} pane {current_pane}] {text}"
2440
2447
  else:
2441
- print("No target session (set 'parent' in .agentwire.yml or use --to)", file=sys.stderr)
2448
+ notification = f"[NOTIFY from {source}] {text}"
2449
+
2450
+ if target_session:
2451
+ if target_session == current_session and current_pane == 0:
2452
+ print("Cannot notify own pane", file=sys.stderr)
2442
2453
  return 1
2443
- except Exception as e:
2444
- print(f"Failed to send notification: {e}", file=sys.stderr)
2454
+ elif current_pane is not None and current_pane > 0 and current_session:
2455
+ target_session = current_session
2456
+ else:
2457
+ print("No target session (set 'parent' in .agentwire.yml or use --to)", file=sys.stderr)
2445
2458
  return 1
2446
2459
 
2460
+ # safe_deliver refuses targets where a paste could do damage (live
2461
+ # dialog on screen, bare shell, parked session) and verifies the paste
2462
+ # actually landed. Callers (queue processor) retry on failure.
2463
+ from agentwire import prompt_router
2464
+
2465
+ delivered, reason = prompt_router.safe_deliver(target_session, 0, notification)
2466
+ if not delivered:
2467
+ print(f"Notification not delivered to {target_session}: {reason}", file=sys.stderr)
2468
+ return 1
2469
+ if not getattr(args, 'quiet', False):
2470
+ print(f"Notified {target_session}")
2447
2471
  return 0
2448
2472
 
2449
2473
 
@@ -2843,6 +2867,23 @@ def store_session_metadata(session_name: str, metadata: dict) -> None:
2843
2867
  pass
2844
2868
 
2845
2869
 
2870
+ def _record_session_creator(session_name: str, created_by: str | None, via: str) -> None:
2871
+ """Record which session created this one (merge-preserving).
2872
+
2873
+ The creator becomes the session's parent for prompt routing
2874
+ (prompt_router.resolve_parent), winning over .agentwire.yml `parent:`.
2875
+ """
2876
+ if not created_by or created_by == session_name.split("@")[0]:
2877
+ return
2878
+ metadata = load_session_metadata(session_name)
2879
+ metadata.update({
2880
+ "created_by": created_by,
2881
+ "created_at": datetime.datetime.now(datetime.timezone.utc).isoformat(),
2882
+ "created_via": via,
2883
+ })
2884
+ store_session_metadata(session_name, metadata)
2885
+
2886
+
2846
2887
  def cmd_notify(args) -> int:
2847
2888
  """Send a notification to the portal about session/pane state changes.
2848
2889
 
@@ -3272,6 +3313,13 @@ def cmd_new(args) -> int:
3272
3313
  default_role = config.get("session", {}).get("default_role", "agentwire")
3273
3314
  role_names = [default_role] if default_role else []
3274
3315
 
3316
+ # Standing mission briefing for worktree dispatches: cmd_worktree passes
3317
+ # mission_context (branch/cwd/base/creator values) which both opts the
3318
+ # session into the worktree-mission role and templates its placeholders.
3319
+ mission_context = getattr(args, 'mission_context', None)
3320
+ if mission_context:
3321
+ role_names = inject_worktree_mission(role_names)
3322
+
3275
3323
  # Always-inject the soul personality role (rides last for recency weight)
3276
3324
  role_names = inject_soul(role_names, load_config(), no_soul=getattr(args, 'no_soul', False))
3277
3325
 
@@ -3284,6 +3332,11 @@ def cmd_new(args) -> int:
3284
3332
  if missing:
3285
3333
  return _output_result(False, json_mode, f"Roles not found: {', '.join(missing)}")
3286
3334
 
3335
+ if mission_context:
3336
+ for role in roles:
3337
+ if role.name == WORKTREE_MISSION_ROLE:
3338
+ role.instructions = render_mission_placeholders(role.instructions, mission_context)
3339
+
3287
3340
  # Parse session name: project, branch, machine
3288
3341
  project, branch, machine_id = parse_session_name(name)
3289
3342
 
@@ -3657,6 +3710,13 @@ def cmd_new(args) -> int:
3657
3710
  if not first_message_delivered and not json_mode:
3658
3711
  print(f"Warning: first message not delivered to '{session_name}' — paste it manually", file=sys.stderr)
3659
3712
 
3713
+ # Record the creating session as parent for prompt routing. --created-by
3714
+ # overrides; empty string opts out; default = the calling tmux session.
3715
+ created_by = getattr(args, 'created_by', None)
3716
+ if created_by is None:
3717
+ created_by = pane_manager.get_current_session()
3718
+ _record_session_creator(session_name, created_by, via="new")
3719
+
3660
3720
  if json_mode:
3661
3721
  result = {
3662
3722
  "success": True,
@@ -4066,6 +4126,15 @@ def cmd_kill(args) -> int:
4066
4126
  if not json_mode:
4067
4127
  print(f"Killed session '{session}'")
4068
4128
 
4129
+ # Drop session metadata (creator record) so a future unrelated session
4130
+ # reusing this name doesn't inherit a stale parent.
4131
+ metadata_file = CONFIG_DIR / "sessions" / session.split("@")[0] / "metadata.json"
4132
+ if metadata_file.exists():
4133
+ try:
4134
+ metadata_file.unlink()
4135
+ except OSError:
4136
+ pass
4137
+
4069
4138
  _notify_portal_sessions_changed()
4070
4139
 
4071
4140
  if json_mode:
@@ -4435,6 +4504,10 @@ def cmd_send_keys(args) -> int:
4435
4504
  # Parse session@machine format
4436
4505
  session, machine_id = _parse_session_target(session_full)
4437
4506
 
4507
+ # Optional pane targeting (worker panes); None targets the session.
4508
+ pane = getattr(args, 'pane', None)
4509
+ target = f"{session}.{pane}" if pane is not None else session
4510
+
4438
4511
  if machine_id:
4439
4512
  # Remote: SSH and run tmux commands
4440
4513
  machine = _get_machine_config(machine_id)
@@ -4443,10 +4516,10 @@ def cmd_send_keys(args) -> int:
4443
4516
  return 1
4444
4517
 
4445
4518
  # Build remote command with pauses between keys
4446
- quoted_session = shlex.quote(session)
4519
+ quoted_target = shlex.quote(target)
4447
4520
  cmd_parts = []
4448
4521
  for i, key in enumerate(keys):
4449
- cmd_parts.append(f"tmux send-keys -t {quoted_session} {shlex.quote(key)}")
4522
+ cmd_parts.append(f"tmux send-keys -t {quoted_target} {shlex.quote(key)}")
4450
4523
  if i < len(keys) - 1:
4451
4524
  cmd_parts.append("sleep 0.1")
4452
4525
 
@@ -4473,14 +4546,14 @@ def cmd_send_keys(args) -> int:
4473
4546
  # Send each key group with a pause between
4474
4547
  for i, key in enumerate(keys):
4475
4548
  subprocess.run(
4476
- ["tmux", "send-keys", "-t", session, key],
4549
+ ["tmux", "send-keys", "-t", target, key],
4477
4550
  check=True
4478
4551
  )
4479
4552
  # Brief pause between key groups (not after last one)
4480
4553
  if i < len(keys) - 1:
4481
4554
  time.sleep(0.1)
4482
4555
 
4483
- print(f"Sent keys to {session}")
4556
+ print(f"Sent keys to {target}")
4484
4557
  return 0
4485
4558
 
4486
4559
 
@@ -4726,6 +4799,12 @@ def cmd_worktree(args) -> int:
4726
4799
  - --ref: detached at a ref. `agentwire worktree review-v2 --ref v2.0.0`
4727
4800
 
4728
4801
  If the worktree already exists, reattaches to the existing session.
4802
+
4803
+ Default/--existing dispatches auto-inject the bundled worktree-mission
4804
+ briefing role (isolation, no live-tool mutation, in-worktree
4805
+ verification, draft-PR + notify-back contract) with branch/cwd/base/
4806
+ creator templated in — opt out with --no-mission. --ref dispatches skip
4807
+ it (detached checkout, nothing to push).
4729
4808
  """
4730
4809
  json_mode = getattr(args, 'json', False)
4731
4810
  name = args.name
@@ -4751,13 +4830,42 @@ def cmd_worktree(args) -> int:
4751
4830
  session_name = f"{project_name}-{name}"
4752
4831
  worktree_path = worktree_dir / session_name
4753
4832
 
4754
- def _launch_session():
4833
+ default_base = getattr(args, 'base', None) or wt_config.get("default_base", "main")
4834
+ no_mission = getattr(args, 'no_mission', False)
4835
+
4836
+ def _mission_context(base_branch: str) -> dict | None:
4837
+ """Values templated into the worktree-mission briefing role.
4838
+
4839
+ None (no briefing) when --no-mission is passed, or for --ref
4840
+ dispatches — a detached review checkout has no branch to push, so
4841
+ the finishing contract doesn't apply.
4842
+ """
4843
+ if no_mission or ref:
4844
+ return None
4845
+ creator = pane_manager.get_current_session()
4846
+ notify_back = (
4847
+ f'agentwire notify-parent --to {creator} "{session_name}: <one-liner + PR URL>"'
4848
+ if creator else
4849
+ f'agentwire notify-parent "{session_name}: <one-liner + PR URL>"'
4850
+ )
4851
+ return {
4852
+ "session": session_name,
4853
+ "branch": name,
4854
+ "worktree_path": str(worktree_path),
4855
+ "main_checkout": str(project_path),
4856
+ "base_branch": base_branch,
4857
+ "creator": creator or "your creator session",
4858
+ "notify_back": notify_back,
4859
+ }
4860
+
4861
+ def _launch_session(mission_context: dict | None = None):
4755
4862
  return cmd_new(type('Args', (), {
4756
4863
  'session': session_name, 'path': str(worktree_path), 'json': json_mode,
4757
4864
  'force': False, 'bare': False, 'restricted': False, 'prompted': False,
4758
4865
  'type': getattr(args, 'type', None), 'roles': getattr(args, 'roles', None),
4759
4866
  'instructions': None, 'persist': False,
4760
4867
  'env': getattr(args, 'env', None),
4868
+ 'mission_context': mission_context,
4761
4869
  })())
4762
4870
 
4763
4871
  # If worktree already exists, reattach
@@ -4769,10 +4877,11 @@ def cmd_worktree(args) -> int:
4769
4877
  if tmux_session_exists(session_name):
4770
4878
  subprocess.run(["tmux", "attach-session", "-t", session_name])
4771
4879
  else:
4772
- return _launch_session()
4880
+ return _launch_session(_mission_context(default_base))
4773
4881
  return 0
4774
4882
 
4775
4883
  # Resolve the git ref to create the worktree from
4884
+ pr_base = default_base
4776
4885
  if ref:
4777
4886
  # --ref mode: detached at a specific ref (tag, commit, branch)
4778
4887
  git_ref = ref
@@ -4794,7 +4903,8 @@ def cmd_worktree(args) -> int:
4794
4903
  return _output_result(False, json_mode, f"Failed to detect current branch in {project_path}")
4795
4904
  base_branch = result.stdout.strip()
4796
4905
  else:
4797
- base_branch = getattr(args, 'base', None) or wt_config.get("default_base", "main")
4906
+ base_branch = default_base
4907
+ pr_base = base_branch
4798
4908
  git_ref = f"origin/{base_branch}"
4799
4909
  new_branch = name
4800
4910
  mode_label = f"new branch {name} from {git_ref}"
@@ -4841,7 +4951,7 @@ def cmd_worktree(args) -> int:
4841
4951
  print(f"Created worktree: {worktree_path}")
4842
4952
  print(f"Mode: {mode_label}")
4843
4953
 
4844
- return _launch_session()
4954
+ return _launch_session(_mission_context(pr_base))
4845
4955
 
4846
4956
 
4847
4957
  def cmd_fork(args) -> int:
@@ -6737,6 +6847,45 @@ def cmd_doctor(args) -> int:
6737
6847
  print(" Fix: agentwire stt start")
6738
6848
  print(" If it won't boot: uv pip install --python .venv/bin/python -e '.[stt]'")
6739
6849
  issues_found += 1
6850
+ elif getattr(stt_cfg, "backend", "default") == "cloud":
6851
+ cloud_cfg = getattr(stt_cfg, "cloud", None) or {}
6852
+ key_env = cloud_cfg.get("api_key_env", "OPENAI_API_KEY")
6853
+ if os.environ.get(key_env):
6854
+ print(f" [ok] Stt: cloud tier ({key_env} is set)")
6855
+ else:
6856
+ print(f" [!!] Stt: cloud tier but {key_env} is not set")
6857
+ print(" The portal will refuse to start until the key is in its environment.")
6858
+ print(" Fix: add the key to ~/.agentwire/.env (docs/wiki/security/secrets.md)")
6859
+ issues_found += 1
6860
+
6861
+ # 8c. Secrets — for each configured feature that needs a key, report
6862
+ # whether its env var is present. Names only, never values. Keys live in
6863
+ # ~/.agentwire/.env (docs/wiki/security/secrets.md), loaded on every
6864
+ # entry point, so os.environ is the authoritative view here.
6865
+ raw_cfg = load_config()
6866
+ expected_keys: list[tuple[str, list[str]]] = []
6867
+ channels_cfg = raw_cfg.get("channels", {}) or {}
6868
+ if channels_cfg.get("email"):
6869
+ expected_keys.append(("channels.email (Resend)", ["RESEND_API_KEY"]))
6870
+ if channels_cfg.get("quo"):
6871
+ expected_keys.append(
6872
+ ("channels.quo (OpenPhone)", ["QUO_API_KEY", "OPENPHONE_API_KEY"])
6873
+ )
6874
+ for pname, pcfg in (raw_cfg.get("pi", {}).get("providers", {}) or {}).items():
6875
+ p_env_var = (pcfg or {}).get(
6876
+ "env_var", f"{pname.upper().replace('-', '_')}_API_KEY"
6877
+ )
6878
+ expected_keys.append((f"pi.providers.{pname}", [p_env_var]))
6879
+ if expected_keys:
6880
+ print("\nChecking secrets (~/.agentwire/.env)...")
6881
+ for feature, candidates in expected_keys:
6882
+ found = next((v for v in candidates if os.environ.get(v)), None)
6883
+ if found:
6884
+ print(f" [ok] {feature}: {found} is set")
6885
+ else:
6886
+ print(f" [!!] {feature}: {' / '.join(candidates)} not set")
6887
+ print(f" Fix: add {candidates[0]}=... to ~/.agentwire/.env")
6888
+ issues_found += 1
6740
6889
 
6741
6890
  # 9. Validate remote machines
6742
6891
  print("\nChecking remote machines...")
@@ -7465,7 +7614,7 @@ _VALID_PROJECT_NAME = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._-]*$")
7465
7614
  def cmd_projects_create(args) -> int:
7466
7615
  """Create a new local project: make the directory, optionally git-init or clone, and write .agentwire.yml."""
7467
7616
  from .config import get_config
7468
- from .project_config import ProjectConfig, SessionType, save_project_config
7617
+ from .project_config import ProjectConfig, SessionType, ensure_gitignored, save_project_config
7469
7618
 
7470
7619
  name = (args.name or "").strip()
7471
7620
  clone_url = (getattr(args, "from_url", None) or "").strip() or None
@@ -7518,6 +7667,7 @@ def cmd_projects_create(args) -> int:
7518
7667
  except OSError as e:
7519
7668
  return _fail(f"Failed to create directory: {e}")
7520
7669
 
7670
+ gitignore_updated = ensure_gitignored(project_path)
7521
7671
  config = ProjectConfig(type=SessionType.from_str("claude-bypass"), roles=[], voice=None)
7522
7672
  if not save_project_config(config, project_path):
7523
7673
  return _fail("Created project directory but failed to write .agentwire.yml")
@@ -7538,6 +7688,8 @@ def cmd_projects_create(args) -> int:
7538
7688
  print(f" Cloned from: {clone_url}")
7539
7689
  elif do_git_init:
7540
7690
  print(" Initialized empty git repository")
7691
+ if gitignore_updated:
7692
+ print(" Added .agentwire.yml to .gitignore (personal config — keep it untracked)")
7541
7693
  return 0
7542
7694
 
7543
7695
 
@@ -8444,8 +8596,6 @@ def cmd_ensure(args) -> int:
8444
8596
  print(f" {preview_template(cmd, ctx)}")
8445
8597
  print()
8446
8598
 
8447
- if task.output.notify:
8448
- print(f"Notification: {task.output.notify}")
8449
8599
  if task.output.save:
8450
8600
  print(f"Save output to: {preview_template(task.output.save, ctx)}")
8451
8601
 
@@ -9016,7 +9166,7 @@ def cmd_task_show(args) -> int:
9016
9166
  "pre": [{"name": p.name, "cmd": p.cmd, "required": p.required, "validate": p.validate, "timeout": p.timeout} for p in task.pre],
9017
9167
  "on_task_end": task.on_task_end,
9018
9168
  "post": task.post,
9019
- "output": {"capture": task.output.capture, "save": task.output.save, "notify": task.output.notify},
9169
+ "output": {"capture": task.output.capture, "save": task.output.save},
9020
9170
  "validation_issues": issues,
9021
9171
  })
9022
9172
  return 0
@@ -9055,12 +9205,9 @@ def cmd_task_show(args) -> int:
9055
9205
  print(f" {cmd}")
9056
9206
  print()
9057
9207
 
9058
- if task.output.notify or task.output.save:
9208
+ if task.output.save:
9059
9209
  print("Output:")
9060
- if task.output.save:
9061
- print(f" Save to: {task.output.save}")
9062
- if task.output.notify:
9063
- print(f" Notify: {task.output.notify}")
9210
+ print(f" Save to: {task.output.save}")
9064
9211
 
9065
9212
  if issues:
9066
9213
  print(f"\nValidation issues: {', '.join(issues)}")
@@ -10540,6 +10687,8 @@ def main() -> int:
10540
10687
  notify_cmd_parser.add_argument("text", nargs="*", help="Notification message")
10541
10688
  notify_cmd_parser.add_argument("--to", type=str, metavar="SESSION", help="Target session (default: parent from .agentwire.yml)")
10542
10689
  notify_cmd_parser.add_argument("-q", "--quiet", action="store_true", help="Suppress output")
10690
+ notify_cmd_parser.add_argument("--raw", action="store_true",
10691
+ help="Send the message verbatim (no [NOTIFY from ...] prefix)")
10543
10692
  notify_cmd_parser.set_defaults(func=cmd_notify_parent)
10544
10693
 
10545
10694
  # === open command (artifact windows) ===
@@ -10617,6 +10766,8 @@ def main() -> int:
10617
10766
  "send-keys", help="Send raw keys to a session (with pause between groups)"
10618
10767
  )
10619
10768
  send_keys_parser.add_argument("-s", "--session", required=True, help="Target session (supports session@machine)")
10769
+ send_keys_parser.add_argument("--pane", type=int, default=None,
10770
+ help="Target a specific pane index (default: the session's active pane)")
10620
10771
  send_keys_parser.add_argument("keys", nargs="*", help="Key groups to send (e.g., 'hello world' Enter)")
10621
10772
  send_keys_parser.set_defaults(func=cmd_send_keys)
10622
10773
 
@@ -10649,6 +10800,9 @@ def main() -> int:
10649
10800
  new_parser.add_argument("--no-pull-first", dest="pull_first", action="store_false", help="Skip the fetch — branch from the local copy of <base> as-is")
10650
10801
  new_parser.add_argument("--first-message", dest="first_message",
10651
10802
  help="After the agent boots, deliver this as its first message (verified; local sessions only)")
10803
+ new_parser.add_argument("--created-by", dest="created_by",
10804
+ help="Record this session as the creator/parent for prompt routing "
10805
+ "(default: the calling tmux session; pass '' to opt out)")
10652
10806
  new_parser.add_argument("--json", action="store_true", help="Output as JSON")
10653
10807
  new_parser.set_defaults(func=cmd_new)
10654
10808
 
@@ -10746,6 +10900,8 @@ def main() -> int:
10746
10900
  wt_parser.add_argument("--project", "-p", help="Path to git repo (default: from config or cwd)")
10747
10901
  wt_parser.add_argument("--type", help="Session type override")
10748
10902
  wt_parser.add_argument("--roles", help="Comma-separated role names")
10903
+ wt_parser.add_argument("--no-mission", dest="no_mission", action="store_true",
10904
+ help="Skip the auto-injected worktree-mission briefing role")
10749
10905
  wt_parser.add_argument("--env", action="append", metavar="KEY=VAL", help="Inject env var via `tmux set-environment` (repeatable)")
10750
10906
  wt_parser.add_argument("--json", action="store_true", help="Output as JSON")
10751
10907
  wt_parser.set_defaults(func=cmd_worktree)
@@ -11488,6 +11644,10 @@ def main() -> int:
11488
11644
  )
11489
11645
  l_uninstall.set_defaults(func=limits_cli.cmd_limits_uninstall)
11490
11646
 
11647
+ # === prompts command group (prompt routing, rides the limits watchdog) ===
11648
+ from . import prompts_cli
11649
+ prompts_cli.register_prompts_parser(subparsers)
11650
+
11491
11651
  # === council command group ===
11492
11652
  council_parser = subparsers.add_parser(
11493
11653
  "council",
@@ -9,7 +9,7 @@ import os
9
9
  import random
10
10
  import re
11
11
  import sys
12
- from dataclasses import dataclass
12
+ from dataclasses import dataclass, field
13
13
  from pathlib import Path
14
14
  from typing import Optional
15
15
 
@@ -34,19 +34,23 @@ class EmailConfigError(NotificationError):
34
34
 
35
35
  @dataclass
36
36
  class EmailConfig:
37
- """Email notification configuration (Resend)."""
37
+ """Email notification configuration (Resend).
38
+
39
+ The API key is env-only: RESEND_API_KEY, normally a line in
40
+ ~/.agentwire/.env (docs/wiki/security/secrets.md). It is never read
41
+ from config.yaml.
42
+ """
38
43
 
39
- api_key: str = ""
40
44
  from_address: str = ""
41
45
  default_to: str = ""
42
46
  banner_image_url: str = ""
43
47
  echo_image_url: str = ""
44
48
  echo_small_url: str = ""
45
49
  logo_image_url: str = ""
50
+ api_key: str = field(init=False, default="")
46
51
 
47
52
  def __post_init__(self):
48
- if not self.api_key:
49
- self.api_key = os.environ.get("RESEND_API_KEY", "")
53
+ self.api_key = os.environ.get("RESEND_API_KEY", "")
50
54
 
51
55
 
52
56
  # Playful greetings from Echo
@@ -225,8 +229,8 @@ def send_email(
225
229
  if not email_config.api_key:
226
230
  raise EmailConfigError(
227
231
  "Email API key not configured. "
228
- "Set RESEND_API_KEY in ~/.agentwire/.env "
229
- "or set channels.email.api_key in ~/.agentwire/config.yaml"
232
+ "Add RESEND_API_KEY=re_... to ~/.agentwire/.env "
233
+ "(see docs/wiki/security/secrets.md)"
230
234
  )
231
235
 
232
236
  # Determine recipients (list form — Resend's `to` field accepts an array)
@@ -9,7 +9,7 @@ import os
9
9
  import sys
10
10
  import urllib.error
11
11
  import urllib.request
12
- from dataclasses import dataclass
12
+ from dataclasses import dataclass, field
13
13
  from typing import Optional
14
14
 
15
15
  from .base import (
@@ -28,15 +28,19 @@ class QuoConfigError(NotificationError):
28
28
 
29
29
  @dataclass
30
30
  class QuoConfig:
31
- """Quo (OpenPhone) SMS configuration."""
31
+ """Quo (OpenPhone) SMS configuration.
32
+
33
+ The API key is env-only: QUO_API_KEY (or legacy OPENPHONE_API_KEY),
34
+ normally a line in ~/.agentwire/.env (docs/wiki/security/secrets.md).
35
+ It is never read from config.yaml.
36
+ """
32
37
 
33
- api_key: str = ""
34
38
  from_number: str = "" # E.164 format (+1...) or phone number ID (PNxxx)
35
39
  default_to: str = ""
40
+ api_key: str = field(init=False, default="")
36
41
 
37
42
  def __post_init__(self):
38
- if not self.api_key:
39
- self.api_key = os.environ.get("QUO_API_KEY", "") or os.environ.get("OPENPHONE_API_KEY", "")
43
+ self.api_key = os.environ.get("QUO_API_KEY", "") or os.environ.get("OPENPHONE_API_KEY", "")
40
44
 
41
45
 
42
46
  API_URL = "https://api.openphone.com/v1/messages"
@@ -72,8 +76,9 @@ def send_quo_sms(
72
76
 
73
77
  if not quo_config.api_key:
74
78
  raise QuoConfigError(
75
- "Quo API key not configured. Set QUO_API_KEY env var "
76
- "or channels.quo.api_key in ~/.agentwire/config.yaml"
79
+ "Quo API key not configured. "
80
+ "Add QUO_API_KEY=... to ~/.agentwire/.env "
81
+ "(see docs/wiki/security/secrets.md)"
77
82
  )
78
83
 
79
84
  recipient = to or quo_config.default_to