agentwire-dev 1.29.3__tar.gz → 1.29.5__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 (312) hide show
  1. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/PKG-INFO +3 -1
  2. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/__init__.py +1 -1
  3. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/__main__.py +17 -0
  4. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/session-window.js +161 -0
  5. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/stt/__init__.py +12 -1
  6. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/tts/stt-self-hosted.md +54 -0
  7. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/pyproject.toml +6 -1
  8. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/.github/FUNDING.yml +0 -0
  9. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  10. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  11. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/.github/ISSUE_TEMPLATE/question.md +0 -0
  12. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  13. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/.gitignore +0 -0
  14. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/CHANGELOG.md +0 -0
  15. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/CLA.md +0 -0
  16. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/CODE_OF_CONDUCT.md +0 -0
  17. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/CONTRIBUTING.md +0 -0
  18. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/Dockerfile.local +0 -0
  19. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/Dockerfile.runpod +0 -0
  20. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/LICENSE +0 -0
  21. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/README.md +0 -0
  22. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/RELEASING.md +0 -0
  23. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/SECURITY.md +0 -0
  24. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/SPONSORS.md +0 -0
  25. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/agents/__init__.py +0 -0
  26. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/agents/base.py +0 -0
  27. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/agents/tmux.py +0 -0
  28. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/cached_status.py +0 -0
  29. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/channels/__init__.py +0 -0
  30. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/channels/base.py +0 -0
  31. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/channels/email.py +0 -0
  32. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/channels/quo.py +0 -0
  33. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/cli_safety.py +0 -0
  34. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/completion.py +0 -0
  35. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/config.py +0 -0
  36. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/fetch.py +0 -0
  37. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/handoff/__init__.py +0 -0
  38. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/handoff/git_state.py +0 -0
  39. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/handoff/instructions.py +0 -0
  40. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/handoff/parser.py +0 -0
  41. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/handoff/renderer.py +0 -0
  42. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/handoff/schema.py +0 -0
  43. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/history.py +0 -0
  44. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/__init__.py +0 -0
  45. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/agentwire-permission.sh +0 -0
  46. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/__init__.py +0 -0
  47. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/audit_logger.py +0 -0
  48. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
  49. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
  50. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
  51. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
  52. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
  53. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
  54. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
  55. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
  56. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
  57. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
  58. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
  59. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
  60. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
  61. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
  62. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
  63. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/hooks/idle-handler.sh +0 -0
  64. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/listen.py +0 -0
  65. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/locking.py +0 -0
  66. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/mcp_server.py +0 -0
  67. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/missions/__init__.py +0 -0
  68. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/missions/cli.py +0 -0
  69. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/missions/config.py +0 -0
  70. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/missions/dispatcher.py +0 -0
  71. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/missions/eligibility.py +0 -0
  72. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/missions/feedback_router.py +0 -0
  73. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/missions/gc.py +0 -0
  74. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/missions/github.py +0 -0
  75. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/missions/naming.py +0 -0
  76. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/missions/state.py +0 -0
  77. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/network.py +0 -0
  78. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/onboarding.py +0 -0
  79. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/overnight.py +0 -0
  80. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/pane_manager.py +0 -0
  81. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/project_config.py +0 -0
  82. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/projects.py +0 -0
  83. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/prompts/__init__.py +0 -0
  84. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/prompts/init.md +0 -0
  85. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/roles/__init__.py +0 -0
  86. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/roles/agentwire.md +0 -0
  87. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/roles/chatbot.md +0 -0
  88. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/roles/init.md +0 -0
  89. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/roles/notifications.md +0 -0
  90. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/roles/orchestrator.md +0 -0
  91. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/roles/task-runner.md +0 -0
  92. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/roles/voice.md +0 -0
  93. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/roles/worker.md +0 -0
  94. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/safety/__init__.py +0 -0
  95. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/safety/_core.py +0 -0
  96. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/scheduler.py +0 -0
  97. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/search.py +0 -0
  98. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/server.py +0 -0
  99. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-Echo--black.png +0 -0
  100. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-Echo--transparent.png +0 -0
  101. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-Echo.png +0 -0
  102. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-email-banner.png +0 -0
  103. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
  104. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
  105. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
  106. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers--full--transparent-top.png +0 -0
  107. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers--full-black.png +0 -0
  108. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers--telephone-fg.png +0 -0
  109. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
  110. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers--transparent-top.png +0 -0
  111. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers--transparent.png +0 -0
  112. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
  113. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/agentwire-splash-logo-layers.png +0 -0
  114. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/css/desktop.css +0 -0
  115. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/favicon.png +0 -0
  116. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/android.jpeg +0 -0
  117. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/automaton.jpeg +0 -0
  118. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/bot.jpeg +0 -0
  119. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/cyborg.jpeg +0 -0
  120. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/droid.jpeg +0 -0
  121. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/drone.jpeg +0 -0
  122. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/guardian.jpeg +0 -0
  123. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/mech.jpeg +0 -0
  124. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/probe.jpeg +0 -0
  125. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/robot.jpeg +0 -0
  126. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/sentinel.jpeg +0 -0
  127. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/machines/unit.jpeg +0 -0
  128. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/blob.jpeg +0 -0
  129. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/cloud.jpeg +0 -0
  130. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/crystal.jpeg +0 -0
  131. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/cyclops.jpeg +0 -0
  132. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/flame.jpeg +0 -0
  133. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/fuzzy.jpeg +0 -0
  134. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/horned.jpeg +0 -0
  135. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/moon.jpeg +0 -0
  136. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/slime.jpeg +0 -0
  137. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/star.jpeg +0 -0
  138. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/tentacle.jpeg +0 -0
  139. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/projects/winged.jpeg +0 -0
  140. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/bear.jpeg +0 -0
  141. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/cat.jpeg +0 -0
  142. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/crown.jpeg +0 -0
  143. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/custom/agentwire-portal.png +0 -0
  144. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/custom/agentwire-tts.png +0 -0
  145. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/custom/agentwire.png +0 -0
  146. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/deer.jpeg +0 -0
  147. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/drone.jpeg +0 -0
  148. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/eagle.jpeg +0 -0
  149. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/fox.jpeg +0 -0
  150. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/hawk.jpeg +0 -0
  151. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/horse.jpeg +0 -0
  152. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/lion.jpeg +0 -0
  153. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/rabbit.jpeg +0 -0
  154. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/robot.jpeg +0 -0
  155. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/tiger.jpeg +0 -0
  156. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/icons/sessions/wolf.jpeg +0 -0
  157. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/.gitkeep +0 -0
  158. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/artifact-window.js +0 -0
  159. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/command-palette.js +0 -0
  160. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/components/icon-picker.js +0 -0
  161. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/components/list-card.js +0 -0
  162. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/components/type-tag.js +0 -0
  163. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/desktop-manager.js +0 -0
  164. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/desktop.js +0 -0
  165. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/icon-manager.js +0 -0
  166. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/new-project-modal.js +0 -0
  167. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/notifications-panel.js +0 -0
  168. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/safety-shared.js +0 -0
  169. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/safety-window.js +0 -0
  170. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/session-id.js +0 -0
  171. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
  172. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/sidebar/config-section.js +0 -0
  173. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/sidebar/machines-section.js +0 -0
  174. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/sidebar/missions-section.js +0 -0
  175. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/sidebar/projects-section.js +0 -0
  176. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/sidebar/safety-section.js +0 -0
  177. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
  178. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/sidebar/services-section.js +0 -0
  179. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/sidebar/sessions-section.js +0 -0
  180. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/sidebar.js +0 -0
  181. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/terminal-font-prefs.js +0 -0
  182. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/tile-manager.js +0 -0
  183. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/utils/auto-refresh.js +0 -0
  184. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/winbox.bundle.min.js +0 -0
  185. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/static/js/windows/chat-window.js +0 -0
  186. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/stt/base.py +0 -0
  187. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/stt/server_backend.py +0 -0
  188. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/stt/stt_server.py +0 -0
  189. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/stt/whisperkit.py +0 -0
  190. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tasks.py +0 -0
  191. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/templates/__init__.py +0 -0
  192. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/templates/base.html +0 -0
  193. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/templates/desktop.html +0 -0
  194. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/templates/email_notification.html +0 -0
  195. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
  196. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/templates/handoff/theme.css.j2 +0 -0
  197. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/templates/tmux.conf +0 -0
  198. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/templating.py +0 -0
  199. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tooldefs/aws.yaml +0 -0
  200. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tooldefs/docker.yaml +0 -0
  201. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tooldefs/gcp.yaml +0 -0
  202. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tooldefs/gh.yaml +0 -0
  203. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tooldefs/git.yaml +0 -0
  204. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tooldefs/gws.yaml +0 -0
  205. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tooldefs/kubectl.yaml +0 -0
  206. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tooldefs/npm.yaml +0 -0
  207. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tooldefs/terraform.yaml +0 -0
  208. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tooldefs/uv.yaml +0 -0
  209. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/__init__.py +0 -0
  210. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/base.py +0 -0
  211. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/engines/__init__.py +0 -0
  212. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/engines/chatterbox.py +0 -0
  213. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/engines/kokoro.py +0 -0
  214. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/engines/qwen_base.py +0 -0
  215. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/engines/qwen_custom.py +0 -0
  216. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/engines/qwen_design.py +0 -0
  217. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/engines/zonos.py +0 -0
  218. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/registry.py +0 -0
  219. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts/runpod_handler.py +0 -0
  220. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tts_server.py +0 -0
  221. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/tunnels.py +0 -0
  222. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/utils/__init__.py +0 -0
  223. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/utils/chunker.py +0 -0
  224. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/utils/file_io.py +0 -0
  225. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/utils/paths.py +0 -0
  226. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/utils/subprocess.py +0 -0
  227. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/validation.py +0 -0
  228. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/voiceclone.py +0 -0
  229. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/voices/darren.wav +0 -0
  230. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/voices/default.wav +0 -0
  231. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/voices/jessica.wav +0 -0
  232. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/voices/lisa.wav +0 -0
  233. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/voices/may.wav +0 -0
  234. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/agentwire/worktree.py +0 -0
  235. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/decisions/obsidian-second-brain.md +0 -0
  236. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/logo.png +0 -0
  237. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/INDEX.md +0 -0
  238. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/architecture.md +0 -0
  239. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/communication/channels.md +0 -0
  240. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/communication/hammerspoon.md +0 -0
  241. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/communication/handoff.md +0 -0
  242. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/concepts.md +0 -0
  243. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/deployment/remote-access.md +0 -0
  244. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/deployment/remote-machines.md +0 -0
  245. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/glossary.md +0 -0
  246. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
  247. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/internals/damage-control.md +0 -0
  248. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/internals/portal.md +0 -0
  249. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/internals/shell-escaping.md +0 -0
  250. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/internals/troubleshooting.md +0 -0
  251. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/missions.md +0 -0
  252. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/quickstart.md +0 -0
  253. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
  254. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
  255. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/sessions/pi.md +0 -0
  256. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/tts/runpod-tts.md +0 -0
  257. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/docs/wiki/tts/tts-self-hosted.md +0 -0
  258. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/requirements-tts.txt +0 -0
  259. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/templates/launchd/dev.agentwire.mission-dispatcher.plist +0 -0
  260. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/templates/launchd/dev.agentwire.mission-feedback-router.plist +0 -0
  261. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/templates/launchd/dev.agentwire.mission-janitor.plist +0 -0
  262. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/conftest.py +0 -0
  263. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/e2e/test_portal_ui.py +0 -0
  264. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/fixtures/sample_agentwire.yml +0 -0
  265. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/fixtures/sample_config.yaml +0 -0
  266. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/fixtures/sample_scheduler.yaml +0 -0
  267. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/integration/test_missions_concurrency.py +0 -0
  268. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/integration/test_missions_lifecycle.py +0 -0
  269. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/integration/test_scheduler_board.py +0 -0
  270. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/integration/test_server_websockets.py +0 -0
  271. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_build_agent_command.py +0 -0
  272. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_channels.py +0 -0
  273. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_cli_commands.py +0 -0
  274. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_cli_output.py +0 -0
  275. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_cli_safety.py +0 -0
  276. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_config.py +0 -0
  277. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_damage_control_hooks.py +0 -0
  278. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_damage_control_sync.py +0 -0
  279. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_file_io.py +0 -0
  280. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_handoff_git_state.py +0 -0
  281. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_handoff_instructions.py +0 -0
  282. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_handoff_parser.py +0 -0
  283. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_handoff_renderer.py +0 -0
  284. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_history.py +0 -0
  285. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_locking.py +0 -0
  286. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_mcp_server.py +0 -0
  287. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_mcp_tools_args.py +0 -0
  288. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_missions_cli.py +0 -0
  289. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_missions_config.py +0 -0
  290. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_missions_dispatcher.py +0 -0
  291. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_missions_eligibility.py +0 -0
  292. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_missions_feedback_router.py +0 -0
  293. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_missions_gc.py +0 -0
  294. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_missions_github.py +0 -0
  295. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_missions_naming.py +0 -0
  296. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_missions_state.py +0 -0
  297. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_overnight_resume_flags.py +0 -0
  298. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_portal_api.py +0 -0
  299. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_project_config.py +0 -0
  300. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_roles.py +0 -0
  301. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_safety_disabled_rules.py +0 -0
  302. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_safety_escape_hatch.py +0 -0
  303. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_safety_kill_switch.py +0 -0
  304. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_safety_mission_worker.py +0 -0
  305. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_scheduler.py +0 -0
  306. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_scheduler_parsing.py +0 -0
  307. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_search.py +0 -0
  308. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_server_async.py +0 -0
  309. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_server_pure.py +0 -0
  310. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_tasks.py +0 -0
  311. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/tests/unit/test_templating.py +0 -0
  312. {agentwire_dev-1.29.3 → agentwire_dev-1.29.5}/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.29.3
3
+ Version: 1.29.5
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
@@ -702,6 +702,8 @@ Provides-Extra: stt
702
702
  Requires-Dist: fastapi>=0.104.0; extra == 'stt'
703
703
  Requires-Dist: faster-whisper>=1.0.0; extra == 'stt'
704
704
  Requires-Dist: python-multipart>=0.0.6; extra == 'stt'
705
+ Requires-Dist: soundfile>=0.12.0; extra == 'stt'
706
+ Requires-Dist: useful-moonshine-onnx>=20250101; extra == 'stt'
705
707
  Requires-Dist: uvicorn>=0.24.0; extra == 'stt'
706
708
  Provides-Extra: tts
707
709
  Requires-Dist: chatterbox-tts>=0.1.6; extra == 'tts'
@@ -1,3 +1,3 @@
1
1
  """AgentWire - Multi-session voice web interface for AI coding agents."""
2
2
 
3
- __version__ = "1.29.3"
3
+ __version__ = "1.29.5"
@@ -6182,6 +6182,23 @@ def cmd_doctor(args) -> int:
6182
6182
  else:
6183
6183
  print(f" -> Service is remote, start it on {service_config.machine}")
6184
6184
 
6185
+ # 8b. Check STT server. STT isn't a `services.*` entry — it's configured via
6186
+ # `stt.url`, so the loop above can't see it. Without this check, a crashed STT
6187
+ # server is invisible and the portal silently falls back to a model-less
6188
+ # WhisperKit (every push-to-talk then fails). Probe it explicitly.
6189
+ stt_url = getattr(getattr(ctx.config, "stt", None), "url", None)
6190
+ if stt_url:
6191
+ from agentwire.stt.server_backend import STTServerBackend
6192
+
6193
+ if STTServerBackend.is_available(stt_url):
6194
+ print(f" [ok] Stt: responding on {stt_url}")
6195
+ else:
6196
+ print(f" [!!] Stt: not responding on {stt_url}")
6197
+ print(" Portal will fall back to WhisperKit (usually no model -> transcription FAILS).")
6198
+ print(" Fix: agentwire stt start")
6199
+ print(" If it won't boot: uv pip install --python .venv/bin/python -e '.[stt]'")
6200
+ issues_found += 1
6201
+
6185
6202
  # 9. Validate remote machines
6186
6203
  print("\nChecking remote machines...")
6187
6204
  remote_machines = {mid: m for mid, m in ctx.machines.items() if mid != ctx.local_machine_id}
@@ -166,6 +166,12 @@ export class SessionWindow {
166
166
  this.ws = null;
167
167
  }
168
168
 
169
+ // Remove the two-finger touch-scroll listeners
170
+ if (this._touchScrollCleanup) {
171
+ this._touchScrollCleanup();
172
+ this._touchScrollCleanup = null;
173
+ }
174
+
169
175
  // Dispose terminal (terminal mode) or output element (monitor mode)
170
176
  if (this.terminal) {
171
177
  this.terminal.dispose();
@@ -321,6 +327,13 @@ export class SessionWindow {
321
327
 
322
328
  this.terminal.open(terminalEl);
323
329
 
330
+ // Touch devices emit no `wheel` events, so xterm's wheel-driven
331
+ // scrolling (tmux copy-mode / the app's own scroll) is unreachable on a
332
+ // tablet. Translate a two-finger vertical pan into synthetic wheel
333
+ // events so touch scrolls history exactly like a desktop mouse wheel.
334
+ // One finger stays free for tap/selection.
335
+ this._setupTouchScroll(terminalEl);
336
+
324
337
  // Fit after font loads and layout is complete
325
338
  const fontFamily = '"FiraMono Nerd Font Mono", Menlo, Monaco, "Courier New", monospace';
326
339
  const fontSize = pickTerminalFontSize();
@@ -367,6 +380,154 @@ export class SessionWindow {
367
380
  }
368
381
  }
369
382
 
383
+ /**
384
+ * Translate a two-finger vertical pan into tmux mouse-wheel scroll.
385
+ *
386
+ * Touch devices emit no `wheel` events, so the desktop scroll path (mouse
387
+ * wheel → xterm encodes an SGR mouse event → tmux enters copy-mode and
388
+ * scrolls) never fires on a tablet. Rather than fake a WheelEvent and hope
389
+ * xterm's mouse encoder picks it up, we send the exact bytes a real wheel
390
+ * produces — the SGR-1006 mouse sequence — straight down the input
391
+ * WebSocket. tmux runs with `mouse on`, so it consumes these and scrolls
392
+ * history. One finger is left untouched for tap/selection.
393
+ *
394
+ * SGR wheel: ESC [ < Btn ; Col ; Row M — Btn 64 = wheel-up, 65 = wheel-down
395
+ * (1-based Col/Row; any point inside the pane works for scroll).
396
+ */
397
+ _setupTouchScroll(terminalEl) {
398
+ // Finger travel, in text lines, that advances one tmux wheel tick. tmux
399
+ // scrolls 5 lines per wheel tick (its WheelUp/DownPane `-N 5` binding),
400
+ // so a strict 1:1 mapping would need 5 lines of finger travel per tick —
401
+ // on a short window that's nearly the whole draggable height, so you get
402
+ // one tick then nothing. Firing a tick every ~1.5 lines keeps it ticking
403
+ // continuously across the whole stroke; momentum then covers distance.
404
+ const FINGER_LINES_PER_TICK = 1.5;
405
+ // Cap ticks emitted per animation frame so a fast flick can't flood tmux
406
+ // faster than it can redraw (the source of the laggy/stuttery feel).
407
+ const MAX_TICKS_PER_FRAME = 8;
408
+ // First tick of a gesture fires after only this fraction of a full tick
409
+ // of travel, so the start feels immediate instead of dead until ~5 lines.
410
+ const FIRST_TICK_FRACTION = 0.35;
411
+ // Momentum: after lift, keep scrolling and decay velocity each frame.
412
+ const FRICTION = 0.94; // per-frame velocity multiplier
413
+ const FLING_MIN_V = 0.04; // px/ms at release needed to start a fling
414
+ const MOMENTUM_STOP_V = 0.012; // px/ms below which momentum ends
415
+
416
+ let active = false;
417
+ let lastMidY = 0;
418
+ let accum = 0; // unconsumed finger travel (px), sign = direction
419
+ let rafId = null;
420
+ let emitted = false; // has any tick fired this gesture? (first-tick boost)
421
+ let velocity = 0; // px/ms, smoothed — drives momentum
422
+ let lastMoveT = 0;
423
+ let lastFrameT = 0;
424
+ let momentum = false;
425
+
426
+ const midY = (touches) => (touches[0].clientY + touches[1].clientY) / 2;
427
+
428
+ // Finger pixels per tick = lines-per-tick × measured cell height.
429
+ const pxPerTick = () => {
430
+ const rows = this.terminal?.rows || 24;
431
+ const h = terminalEl.getBoundingClientRect().height;
432
+ const cell = rows > 0 && h > 0 ? h / rows : 18;
433
+ return FINGER_LINES_PER_TICK * cell;
434
+ };
435
+
436
+ // dir < 0 → wheel-up (older history); dir > 0 → wheel-down (newer).
437
+ const wheelSeq = (dir) => {
438
+ const col = Math.max(1, Math.floor(this.terminal.cols / 2));
439
+ const row = Math.max(1, Math.floor(this.terminal.rows / 2));
440
+ return `\x1b[<${dir < 0 ? 64 : 65};${col};${row}M`;
441
+ };
442
+
443
+ const sendTicks = (ticks) => {
444
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN || !this.terminal) return;
445
+ this.ws.send(JSON.stringify({ type: 'input', data: wheelSeq(ticks).repeat(Math.abs(ticks)) }));
446
+ };
447
+
448
+ // One frame: advance momentum, then batch all due ticks into one message.
449
+ const flush = (now) => {
450
+ rafId = null;
451
+
452
+ if (momentum) {
453
+ const dt = Math.min(now - lastFrameT, 50);
454
+ lastFrameT = now;
455
+ accum += velocity * dt;
456
+ velocity *= FRICTION;
457
+ if (Math.abs(velocity) < MOMENTUM_STOP_V) momentum = false;
458
+ }
459
+ if (active || momentum) rafId = requestAnimationFrame(flush);
460
+
461
+ const step = pxPerTick();
462
+ // Snappier first tick: lower the threshold until the gesture moves.
463
+ const threshold = emitted ? step : step * FIRST_TICK_FRACTION;
464
+ let ticks = Math.trunc(accum / threshold);
465
+ if (ticks === 0) return;
466
+ if (ticks > MAX_TICKS_PER_FRAME) ticks = MAX_TICKS_PER_FRAME;
467
+ else if (ticks < -MAX_TICKS_PER_FRAME) ticks = -MAX_TICKS_PER_FRAME;
468
+ accum -= ticks * threshold;
469
+ emitted = true;
470
+ sendTicks(ticks);
471
+ };
472
+
473
+ const startRaf = () => { if (rafId === null) { lastFrameT = performance.now(); rafId = requestAnimationFrame(flush); } };
474
+ const stopRaf = () => { if (rafId !== null) { cancelAnimationFrame(rafId); rafId = null; } };
475
+
476
+ const onTouchStart = (e) => {
477
+ if (e.touches.length !== 2) { active = false; momentum = false; stopRaf(); return; }
478
+ active = true;
479
+ momentum = false;
480
+ emitted = false;
481
+ velocity = 0;
482
+ accum = 0;
483
+ lastMidY = midY(e.touches);
484
+ lastMoveT = performance.now();
485
+ e.preventDefault(); // stop the page/WinBox from claiming the gesture
486
+ startRaf();
487
+ };
488
+
489
+ const onTouchMove = (e) => {
490
+ if (!active || e.touches.length !== 2) return;
491
+ e.preventDefault();
492
+ const now = performance.now();
493
+ const y = midY(e.touches);
494
+ // Fingers up (y decreases) → newer/down; fingers down → older/up.
495
+ const dy = lastMidY - y;
496
+ accum += dy;
497
+ const dt = now - lastMoveT;
498
+ if (dt > 0) velocity = 0.6 * velocity + 0.4 * (dy / dt); // smoothed px/ms
499
+ lastMidY = y;
500
+ lastMoveT = now;
501
+ };
502
+
503
+ const onTouchEnd = (e) => {
504
+ if (e.touches.length >= 2) return;
505
+ active = false;
506
+ // Carry a fast lift into a decaying fling; otherwise stop clean.
507
+ if (Math.abs(velocity) >= FLING_MIN_V) {
508
+ momentum = true;
509
+ lastFrameT = performance.now();
510
+ startRaf();
511
+ } else {
512
+ velocity = 0;
513
+ accum = 0;
514
+ }
515
+ };
516
+
517
+ terminalEl.addEventListener('touchstart', onTouchStart, { passive: false });
518
+ terminalEl.addEventListener('touchmove', onTouchMove, { passive: false });
519
+ terminalEl.addEventListener('touchend', onTouchEnd);
520
+ terminalEl.addEventListener('touchcancel', onTouchEnd);
521
+
522
+ this._touchScrollCleanup = () => {
523
+ stopRaf();
524
+ terminalEl.removeEventListener('touchstart', onTouchStart);
525
+ terminalEl.removeEventListener('touchmove', onTouchMove);
526
+ terminalEl.removeEventListener('touchend', onTouchEnd);
527
+ terminalEl.removeEventListener('touchcancel', onTouchEnd);
528
+ };
529
+ }
530
+
370
531
  _createWinBox(container) {
371
532
  const title = `${this.sessionId} (${this.mode})`;
372
533
 
@@ -51,7 +51,18 @@ def get_stt_backend(config: Any) -> STTBackend:
51
51
  logger.info(f"Using STT server at {stt_url}")
52
52
  return STTServerBackend(url=stt_url, timeout=timeout)
53
53
  else:
54
- logger.warning(f"STT server at {stt_url} not available, falling back to WhisperKit")
54
+ # Loud, actionable warning: this is the silent-failure trap. A
55
+ # configured-but-unreachable STT server means the moonshine server
56
+ # crashed or isn't started, and we're about to fall back to
57
+ # WhisperKit — which is usually NOT installed, so every transcription
58
+ # will then fail at request time with a confusing error. Say so here.
59
+ logger.warning(
60
+ "STT server configured at %s but not reachable — falling back to "
61
+ "WhisperKit (likely has no model installed; transcription will FAIL). "
62
+ "Start it with `agentwire stt start`; if it won't boot, install deps: "
63
+ "`uv pip install --python .venv/bin/python -e '.[stt]'`.",
64
+ stt_url,
65
+ )
55
66
 
56
67
  # Fall back to WhisperKit
57
68
  logger.info("Using local WhisperKitSTT")
@@ -100,6 +100,60 @@ done
100
100
 
101
101
  Tried — load time 25.4 s → 3.2 s (real win), per-call inference ~457 ms → ~1342 ms (≈3× slower). Only 389 / 743 graph nodes are CoreML-compatible, so the autoregressive decoder bounces ANE↔CPU per token. Not worth pursuing until the upstream moonshine_onnx graph becomes more CoreML-friendly.
102
102
 
103
+ ## Troubleshooting: "STT does nothing" (the silent double-fallback)
104
+
105
+ This bit us once and is worth recognizing fast, because it fails **silently in two
106
+ places**. Symptom: push-to-talk produces no transcription and no visible error
107
+ (often first noticed on a tablet/phone, which red-herrings you toward the client).
108
+
109
+ **The failure chain:**
110
+
111
+ 1. The STT server (`agentwire-stt` tmux session on `:8101`) **crashes on startup** —
112
+ most commonly `ModuleNotFoundError: No module named 'fastapi'` (or `moonshine_onnx`)
113
+ because the project `.venv` is missing the STT deps. The crash is only visible in
114
+ the tmux pane; the session stays alive at a shell prompt, so it *looks* started.
115
+ 2. The portal builds `self.stt` once at startup via `get_stt_backend()`. With `:8101`
116
+ unreachable, `STTServerBackend.is_available()` is `False`, so it **falls back to
117
+ `WhisperKitSTT`** — which usually has no model installed.
118
+ 3. Every `/transcribe` then returns `{"error": ...}` with HTTP **200**, so the browser
119
+ shows nothing. The only trace is `ERROR agentwire.stt.whisperkit: WhisperKit model
120
+ not found` in the portal log.
121
+
122
+ **Diagnose (in order):**
123
+
124
+ ```bash
125
+ agentwire doctor # now prints [!!] Stt if :8101 is down
126
+ curl -s http://localhost:8101/health # {"status":"ok","model":{"backend":"moonshine",...}}
127
+ tmux capture-pane -pt agentwire-stt -S -50 # shows the real crash (missing import)
128
+ tmux capture-pane -pt agentwire-portal -S -200 | grep -i stt # "Using STT server" vs "falling back to WhisperKit"
129
+ ```
130
+
131
+ The portal log line at startup is the tell:
132
+ - `Using STT server at http://localhost:8101` + `STT backend: STTServerBackend` → good.
133
+ - `STT server ... not reachable — falling back to WhisperKit` → the server is down.
134
+
135
+ **Fix:** install the STT deps into the venv the server actually launches with
136
+ (`.venv/bin/python`), restart the server, then **restart the portal** (it only picks
137
+ the backend at startup):
138
+
139
+ ```bash
140
+ uv pip install --python .venv/bin/python -e '.[stt]' # declares moonshine + soundfile + fastapi
141
+ agentwire stt stop && agentwire stt start # wait for "Moonshine ONNX loaded"
142
+ agentwire portal restart --dev # re-runs get_stt_backend()
143
+ ```
144
+
145
+ **Why it stayed hidden:** `stt.url` is configured but the server was down, and the
146
+ WhisperKit fallback only errors at *request* time, not at startup. As of this writing
147
+ the fallback now logs a loud, actionable warning and `agentwire doctor` health-checks
148
+ `:8101` — so next time it surfaces immediately instead of silently degrading.
149
+
150
+ **Tablet note:** if the mic does nothing on a phone/tablet *before* audio ever reaches
151
+ `/transcribe`, that's a different problem — a non-secure browser context. Reaching the
152
+ portal at `https://<LAN-IP>:8765` with a click-through self-signed cert is **not** a
153
+ secure context, so `navigator.mediaDevices` is `undefined` and recording silently
154
+ no-ops. Give the tablet a trusted origin (tunnel/valid cert) or, to test, allow the
155
+ origin via `chrome://flags/#unsafely-treat-insecure-origin-as-secure`.
156
+
103
157
  ## Reference
104
158
 
105
159
  - Portal endpoint: `POST /transcribe` — multipart `file=@audio.webm`. Returns `{"text": "..."}`.
@@ -43,11 +43,16 @@ dev = [
43
43
  "pytest-asyncio>=0.23.0",
44
44
  "ruff>=0.1.0",
45
45
  ]
46
- # STT server dependencies (faster-whisper for speech-to-text)
46
+ # STT server dependencies. Moonshine ONNX is the default backend on Mac
47
+ # (small, fast, CPU-only, no torch) — it MUST be declared here or a fresh venv
48
+ # silently loses the default backend and the portal falls back to a model-less
49
+ # WhisperKit. faster-whisper is the higher-accuracy fallback for `STT_BACKEND=whisper`.
47
50
  stt = [
48
51
  "fastapi>=0.104.0",
49
52
  "uvicorn>=0.24.0",
50
53
  "python-multipart>=0.0.6",
54
+ "useful-moonshine-onnx>=20250101",
55
+ "soundfile>=0.12.0",
51
56
  "faster-whisper>=1.0.0",
52
57
  ]
53
58
  # TTS server dependencies (for GPU machines running the TTS backend)
File without changes
File without changes
File without changes