agentwire-dev 1.29.3__tar.gz → 1.30.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 (315) hide show
  1. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/PKG-INFO +3 -1
  2. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/__init__.py +1 -1
  3. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/__main__.py +142 -11
  4. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/config.py +42 -0
  5. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/mcp_server.py +16 -0
  6. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/scheduler.py +350 -73
  7. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/server.py +54 -16
  8. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/css/desktop.css +170 -0
  9. agentwire_dev-1.30.0/agentwire/static/js/collage.js +367 -0
  10. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/command-palette.js +5 -0
  11. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/desktop-manager.js +4 -0
  12. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/desktop.js +39 -83
  13. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/session-window.js +181 -120
  14. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/sidebar/scheduler-section.js +59 -11
  15. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/sidebar/sessions-section.js +18 -0
  16. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/tile-manager.js +58 -0
  17. agentwire_dev-1.30.0/agentwire/static/js/utils/ansi.js +122 -0
  18. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/stt/__init__.py +12 -1
  19. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/worktree.py +54 -19
  20. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/INDEX.md +1 -0
  21. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/internals/portal.md +4 -0
  22. agentwire_dev-1.30.0/docs/wiki/internals/window-collage.md +92 -0
  23. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/tts/stt-self-hosted.md +54 -0
  24. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/pyproject.toml +6 -1
  25. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_scheduler.py +118 -0
  26. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_worktree.py +54 -0
  27. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/.github/FUNDING.yml +0 -0
  28. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  29. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  30. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  31. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  32. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/.gitignore +0 -0
  33. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/CHANGELOG.md +0 -0
  34. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/CLA.md +0 -0
  35. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/CODE_OF_CONDUCT.md +0 -0
  36. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/CONTRIBUTING.md +0 -0
  37. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/Dockerfile.local +0 -0
  38. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/Dockerfile.runpod +0 -0
  39. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/LICENSE +0 -0
  40. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/README.md +0 -0
  41. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/RELEASING.md +0 -0
  42. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/SECURITY.md +0 -0
  43. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/SPONSORS.md +0 -0
  44. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/agents/__init__.py +0 -0
  45. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/agents/base.py +0 -0
  46. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/agents/tmux.py +0 -0
  47. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/cached_status.py +0 -0
  48. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/channels/__init__.py +0 -0
  49. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/channels/base.py +0 -0
  50. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/channels/email.py +0 -0
  51. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/channels/quo.py +0 -0
  52. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/cli_safety.py +0 -0
  53. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/completion.py +0 -0
  54. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/fetch.py +0 -0
  55. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/handoff/__init__.py +0 -0
  56. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/handoff/git_state.py +0 -0
  57. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/handoff/instructions.py +0 -0
  58. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/handoff/parser.py +0 -0
  59. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/handoff/renderer.py +0 -0
  60. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/handoff/schema.py +0 -0
  61. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/history.py +0 -0
  62. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/__init__.py +0 -0
  63. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/agentwire-permission.sh +0 -0
  64. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/__init__.py +0 -0
  65. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/audit_logger.py +0 -0
  66. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
  67. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
  68. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
  69. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
  70. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
  71. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
  72. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
  73. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
  74. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
  75. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
  76. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
  77. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
  78. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
  79. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
  80. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
  81. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/hooks/idle-handler.sh +0 -0
  82. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/listen.py +0 -0
  83. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/locking.py +0 -0
  84. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/missions/__init__.py +0 -0
  85. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/missions/cli.py +0 -0
  86. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/missions/config.py +0 -0
  87. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/missions/dispatcher.py +0 -0
  88. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/missions/eligibility.py +0 -0
  89. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/missions/feedback_router.py +0 -0
  90. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/missions/gc.py +0 -0
  91. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/missions/github.py +0 -0
  92. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/missions/naming.py +0 -0
  93. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/missions/state.py +0 -0
  94. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/network.py +0 -0
  95. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/onboarding.py +0 -0
  96. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/overnight.py +0 -0
  97. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/pane_manager.py +0 -0
  98. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/project_config.py +0 -0
  99. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/projects.py +0 -0
  100. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/prompts/__init__.py +0 -0
  101. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/prompts/init.md +0 -0
  102. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/roles/__init__.py +0 -0
  103. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/roles/agentwire.md +0 -0
  104. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/roles/chatbot.md +0 -0
  105. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/roles/init.md +0 -0
  106. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/roles/notifications.md +0 -0
  107. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/roles/orchestrator.md +0 -0
  108. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/roles/task-runner.md +0 -0
  109. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/roles/voice.md +0 -0
  110. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/roles/worker.md +0 -0
  111. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/safety/__init__.py +0 -0
  112. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/safety/_core.py +0 -0
  113. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/search.py +0 -0
  114. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-Echo--black.png +0 -0
  115. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-Echo--transparent.png +0 -0
  116. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-Echo.png +0 -0
  117. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-email-banner.png +0 -0
  118. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
  119. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
  120. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
  121. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers--full--transparent-top.png +0 -0
  122. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers--full-black.png +0 -0
  123. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers--telephone-fg.png +0 -0
  124. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
  125. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers--transparent-top.png +0 -0
  126. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers--transparent.png +0 -0
  127. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
  128. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/agentwire-splash-logo-layers.png +0 -0
  129. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/favicon.png +0 -0
  130. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/android.jpeg +0 -0
  131. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/automaton.jpeg +0 -0
  132. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/bot.jpeg +0 -0
  133. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/cyborg.jpeg +0 -0
  134. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/droid.jpeg +0 -0
  135. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/drone.jpeg +0 -0
  136. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/guardian.jpeg +0 -0
  137. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/mech.jpeg +0 -0
  138. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/probe.jpeg +0 -0
  139. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/robot.jpeg +0 -0
  140. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/sentinel.jpeg +0 -0
  141. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/machines/unit.jpeg +0 -0
  142. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/blob.jpeg +0 -0
  143. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/cloud.jpeg +0 -0
  144. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/crystal.jpeg +0 -0
  145. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/cyclops.jpeg +0 -0
  146. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/flame.jpeg +0 -0
  147. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/fuzzy.jpeg +0 -0
  148. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/horned.jpeg +0 -0
  149. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/moon.jpeg +0 -0
  150. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/slime.jpeg +0 -0
  151. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/star.jpeg +0 -0
  152. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/tentacle.jpeg +0 -0
  153. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/projects/winged.jpeg +0 -0
  154. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/bear.jpeg +0 -0
  155. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/cat.jpeg +0 -0
  156. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/crown.jpeg +0 -0
  157. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/custom/agentwire-portal.png +0 -0
  158. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/custom/agentwire-tts.png +0 -0
  159. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/custom/agentwire.png +0 -0
  160. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/deer.jpeg +0 -0
  161. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/drone.jpeg +0 -0
  162. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/eagle.jpeg +0 -0
  163. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/fox.jpeg +0 -0
  164. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/hawk.jpeg +0 -0
  165. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/horse.jpeg +0 -0
  166. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/lion.jpeg +0 -0
  167. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/rabbit.jpeg +0 -0
  168. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/robot.jpeg +0 -0
  169. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/tiger.jpeg +0 -0
  170. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/icons/sessions/wolf.jpeg +0 -0
  171. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/.gitkeep +0 -0
  172. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/artifact-window.js +0 -0
  173. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/components/icon-picker.js +0 -0
  174. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/components/list-card.js +0 -0
  175. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/components/type-tag.js +0 -0
  176. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/icon-manager.js +0 -0
  177. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/new-project-modal.js +0 -0
  178. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/notifications-panel.js +0 -0
  179. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/safety-shared.js +0 -0
  180. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/safety-window.js +0 -0
  181. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/session-id.js +0 -0
  182. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
  183. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/sidebar/config-section.js +0 -0
  184. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
  185. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/sidebar/missions-section.js +0 -0
  186. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
  187. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
  188. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/sidebar/services-section.js +0 -0
  189. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/sidebar.js +0 -0
  190. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
  191. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/utils/auto-refresh.js +0 -0
  192. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
  193. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/static/js/windows/chat-window.js +0 -0
  194. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/stt/base.py +0 -0
  195. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/stt/server_backend.py +0 -0
  196. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/stt/stt_server.py +0 -0
  197. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/stt/whisperkit.py +0 -0
  198. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tasks.py +0 -0
  199. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/templates/__init__.py +0 -0
  200. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/templates/base.html +0 -0
  201. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/templates/desktop.html +0 -0
  202. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/templates/email_notification.html +0 -0
  203. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
  204. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
  205. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/templates/tmux.conf +0 -0
  206. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/templating.py +0 -0
  207. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tooldefs/aws.yaml +0 -0
  208. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tooldefs/docker.yaml +0 -0
  209. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tooldefs/gcp.yaml +0 -0
  210. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tooldefs/gh.yaml +0 -0
  211. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tooldefs/git.yaml +0 -0
  212. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tooldefs/gws.yaml +0 -0
  213. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tooldefs/kubectl.yaml +0 -0
  214. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tooldefs/npm.yaml +0 -0
  215. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tooldefs/terraform.yaml +0 -0
  216. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tooldefs/uv.yaml +0 -0
  217. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/__init__.py +0 -0
  218. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/base.py +0 -0
  219. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/engines/__init__.py +0 -0
  220. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/engines/chatterbox.py +0 -0
  221. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/engines/kokoro.py +0 -0
  222. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/engines/qwen_base.py +0 -0
  223. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/engines/qwen_custom.py +0 -0
  224. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/engines/qwen_design.py +0 -0
  225. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/engines/zonos.py +0 -0
  226. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/registry.py +0 -0
  227. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts/runpod_handler.py +0 -0
  228. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tts_server.py +0 -0
  229. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/tunnels.py +0 -0
  230. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/utils/__init__.py +0 -0
  231. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/utils/chunker.py +0 -0
  232. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/utils/file_io.py +0 -0
  233. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/utils/paths.py +0 -0
  234. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/utils/subprocess.py +0 -0
  235. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/validation.py +0 -0
  236. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/voiceclone.py +0 -0
  237. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/voices/darren.wav +0 -0
  238. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/voices/default.wav +0 -0
  239. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/voices/jessica.wav +0 -0
  240. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/voices/lisa.wav +0 -0
  241. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/agentwire/voices/may.wav +0 -0
  242. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/decisions/obsidian-second-brain.md +0 -0
  243. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/logo.png +0 -0
  244. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/architecture.md +0 -0
  245. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/communication/channels.md +0 -0
  246. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/communication/hammerspoon.md +0 -0
  247. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/communication/handoff.md +0 -0
  248. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/concepts.md +0 -0
  249. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/deployment/remote-access.md +0 -0
  250. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/deployment/remote-machines.md +0 -0
  251. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/glossary.md +0 -0
  252. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
  253. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/internals/damage-control.md +0 -0
  254. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/internals/shell-escaping.md +0 -0
  255. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/internals/troubleshooting.md +0 -0
  256. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/missions.md +0 -0
  257. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/quickstart.md +0 -0
  258. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
  259. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
  260. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/sessions/pi.md +0 -0
  261. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/tts/runpod-tts.md +0 -0
  262. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/docs/wiki/tts/tts-self-hosted.md +0 -0
  263. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/requirements-tts.txt +0 -0
  264. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/templates/launchd/dev.agentwire.mission-dispatcher.plist +0 -0
  265. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/templates/launchd/dev.agentwire.mission-feedback-router.plist +0 -0
  266. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/templates/launchd/dev.agentwire.mission-janitor.plist +0 -0
  267. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/conftest.py +0 -0
  268. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/e2e/test_portal_ui.py +0 -0
  269. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/fixtures/sample_agentwire.yml +0 -0
  270. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/fixtures/sample_config.yaml +0 -0
  271. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/fixtures/sample_scheduler.yaml +0 -0
  272. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/integration/test_missions_concurrency.py +0 -0
  273. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/integration/test_missions_lifecycle.py +0 -0
  274. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/integration/test_scheduler_board.py +0 -0
  275. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/integration/test_server_websockets.py +0 -0
  276. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_build_agent_command.py +0 -0
  277. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_channels.py +0 -0
  278. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_cli_commands.py +0 -0
  279. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_cli_output.py +0 -0
  280. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_cli_safety.py +0 -0
  281. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_config.py +0 -0
  282. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_damage_control_hooks.py +0 -0
  283. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_damage_control_sync.py +0 -0
  284. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_file_io.py +0 -0
  285. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_handoff_git_state.py +0 -0
  286. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_handoff_instructions.py +0 -0
  287. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_handoff_parser.py +0 -0
  288. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_handoff_renderer.py +0 -0
  289. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_history.py +0 -0
  290. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_locking.py +0 -0
  291. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_mcp_server.py +0 -0
  292. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_mcp_tools_args.py +0 -0
  293. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_missions_cli.py +0 -0
  294. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_missions_config.py +0 -0
  295. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_missions_dispatcher.py +0 -0
  296. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_missions_eligibility.py +0 -0
  297. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_missions_feedback_router.py +0 -0
  298. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_missions_gc.py +0 -0
  299. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_missions_github.py +0 -0
  300. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_missions_naming.py +0 -0
  301. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_missions_state.py +0 -0
  302. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_overnight_resume_flags.py +0 -0
  303. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_portal_api.py +0 -0
  304. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_project_config.py +0 -0
  305. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_roles.py +0 -0
  306. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_safety_disabled_rules.py +0 -0
  307. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_safety_escape_hatch.py +0 -0
  308. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_safety_kill_switch.py +0 -0
  309. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_safety_mission_worker.py +0 -0
  310. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_scheduler_parsing.py +0 -0
  311. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_search.py +0 -0
  312. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_server_async.py +0 -0
  313. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_server_pure.py +0 -0
  314. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_tasks.py +0 -0
  315. {agentwire_dev-1.29.3 → agentwire_dev-1.30.0}/tests/unit/test_templating.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.30.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
@@ -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.30.0"
@@ -761,8 +761,12 @@ def _notify_portal_sessions_changed():
761
761
  # === Portal Commands ===
762
762
 
763
763
 
764
- def _start_portal_local(args) -> int:
765
- """Start portal locally in tmux."""
764
+ def _start_portal_local(args, attach: bool = True) -> int:
765
+ """Start portal locally in tmux.
766
+
767
+ When attach is False (used by `agentwire up`), the portal is started
768
+ detached and we return without attaching.
769
+ """
766
770
  from .network import NetworkContext
767
771
  from .tunnels import TunnelManager
768
772
 
@@ -770,8 +774,9 @@ def _start_portal_local(args) -> int:
770
774
 
771
775
  if tmux_session_exists(session_name):
772
776
  print(f"Portal already running in tmux session '{session_name}'")
773
- print("Attaching... (Ctrl+B D to detach)")
774
- subprocess.run(["tmux", "attach-session", "-t", session_name])
777
+ if attach:
778
+ print("Attaching... (Ctrl+B D to detach)")
779
+ subprocess.run(["tmux", "attach-session", "-t", session_name])
775
780
  return 0
776
781
 
777
782
  # Ensure required tunnels are up before starting portal
@@ -835,8 +840,11 @@ def _start_portal_local(args) -> int:
835
840
 
836
841
  _ensure_notifications_session()
837
842
 
838
- print("Portal started. Attaching... (Ctrl+B D to detach)")
839
- subprocess.run(["tmux", "attach-session", "-t", session_name])
843
+ if attach:
844
+ print("Portal started. Attaching... (Ctrl+B D to detach)")
845
+ subprocess.run(["tmux", "attach-session", "-t", session_name])
846
+ else:
847
+ print("Portal started.")
840
848
  return 0
841
849
 
842
850
 
@@ -1147,19 +1155,21 @@ def _get_venv_for_backend(backend: str) -> str:
1147
1155
  return "qwen"
1148
1156
 
1149
1157
 
1150
- def _start_tts_local(args, venv_override: str | None = None) -> int:
1158
+ def _start_tts_local(args, venv_override: str | None = None, attach: bool = True) -> int:
1151
1159
  """Start TTS server locally in tmux.
1152
1160
 
1153
1161
  Args:
1154
1162
  args: Parsed CLI arguments
1155
1163
  venv_override: Force specific venv (used for restart after venv_mismatch)
1164
+ attach: When False (used by `agentwire up`), start detached and return.
1156
1165
  """
1157
1166
  session_name = get_tts_session_name()
1158
1167
 
1159
1168
  if tmux_session_exists(session_name):
1160
1169
  print(f"TTS server already running in tmux session '{session_name}'")
1161
- print("Attaching... (Ctrl+B D to detach)")
1162
- subprocess.run(["tmux", "attach-session", "-t", session_name])
1170
+ if attach:
1171
+ print("Attaching... (Ctrl+B D to detach)")
1172
+ subprocess.run(["tmux", "attach-session", "-t", session_name])
1163
1173
  return 0
1164
1174
 
1165
1175
  # Get TTS config
@@ -1204,8 +1214,11 @@ def _start_tts_local(args, venv_override: str | None = None) -> int:
1204
1214
 
1205
1215
  _ensure_notifications_session()
1206
1216
 
1207
- print("TTS server started. Attaching... (Ctrl+B D to detach)")
1208
- subprocess.run(["tmux", "attach-session", "-t", session_name])
1217
+ if attach:
1218
+ print("TTS server started. Attaching... (Ctrl+B D to detach)")
1219
+ subprocess.run(["tmux", "attach-session", "-t", session_name])
1220
+ else:
1221
+ print("TTS server started.")
1209
1222
  return 0
1210
1223
 
1211
1224
 
@@ -5625,6 +5638,98 @@ def cmd_dev(args) -> int:
5625
5638
  return 0
5626
5639
 
5627
5640
 
5641
+ def _start_custom_service(svc) -> None:
5642
+ """Start a custom service session (detached) if not already running."""
5643
+ if tmux_session_exists(svc.name):
5644
+ print(f" [ok] {svc.name} (already running)")
5645
+ return
5646
+
5647
+ project = svc.project or str(get_source_dir())
5648
+ cmd = [sys.executable, "-m", "agentwire", "new", "-s", svc.name, "-p", project, "--json"]
5649
+ if svc.roles:
5650
+ cmd.extend(["--roles", svc.roles])
5651
+ if svc.type:
5652
+ cmd.extend(["--type", svc.type])
5653
+ try:
5654
+ subprocess.run(cmd, check=True, capture_output=True, timeout=60)
5655
+ print(f" [ok] {svc.name} (started)")
5656
+ except Exception as e:
5657
+ print(f" [!!] {svc.name}: {e}", file=sys.stderr)
5658
+
5659
+
5660
+ def cmd_up(args) -> int:
5661
+ """Boot all AgentWire services, then start/attach the dev session.
5662
+
5663
+ Brings up (detached): portal, TTS, STT, and any autostart custom
5664
+ services from config. The scheduler is auto-started by the portal
5665
+ (services.scheduler.autostart). Then runs `agentwire dev` to
5666
+ create + attach the main session.
5667
+
5668
+ Per-service start is best-effort — a failure to start one service
5669
+ doesn't block the rest or the dev session.
5670
+ """
5671
+ from argparse import Namespace
5672
+ from .config import load_config as load_config_typed
5673
+ from .network import NetworkContext
5674
+
5675
+ cfg_dict = load_config()
5676
+ cfg = load_config_typed()
5677
+ ctx = NetworkContext.from_config()
5678
+
5679
+ def _is_local(name: str) -> bool:
5680
+ try:
5681
+ return ctx.is_local(name)
5682
+ except Exception:
5683
+ return True
5684
+
5685
+ print("Bringing up AgentWire services...")
5686
+
5687
+ # Portal (autostarts the scheduler on boot)
5688
+ if _is_local("portal"):
5689
+ portal_args = Namespace(
5690
+ dev=getattr(args, "dev", False),
5691
+ no_tts=getattr(args, "no_tts", False),
5692
+ no_stt=getattr(args, "no_stt", False),
5693
+ port=None, host=None,
5694
+ config=getattr(args, "config", None),
5695
+ )
5696
+ _start_portal_local(portal_args, attach=False)
5697
+ else:
5698
+ print(" Portal configured for a remote machine — skipping (start it there).")
5699
+
5700
+ # TTS — skip if disabled or using a cloud backend
5701
+ tts_backend = cfg_dict.get("tts", {}).get("backend", "chatterbox")
5702
+ if getattr(args, "no_tts", False):
5703
+ print(" TTS skipped (--no-tts).")
5704
+ elif tts_backend in ("none", "runpod"):
5705
+ print(f" TTS skipped (backend: {tts_backend}).")
5706
+ elif _is_local("tts"):
5707
+ tts_args = Namespace(port=None, host=None, backend=None)
5708
+ _start_tts_local(tts_args, attach=False)
5709
+ else:
5710
+ print(" TTS configured for a remote machine — skipping (start it there).")
5711
+
5712
+ # STT — start when configured (uses a local source venv)
5713
+ if getattr(args, "no_stt", False):
5714
+ print(" STT skipped (--no-stt).")
5715
+ elif cfg_dict.get("stt", {}).get("url"):
5716
+ stt_args = Namespace(port=None, host=None, model=None, backend=None)
5717
+ cmd_stt_start(stt_args)
5718
+ else:
5719
+ print(" STT skipped (no stt.url configured).")
5720
+
5721
+ # Custom services
5722
+ custom = [s for s in cfg.services.custom if s.autostart]
5723
+ if custom:
5724
+ print("Starting custom services...")
5725
+ for svc in custom:
5726
+ _start_custom_service(svc)
5727
+
5728
+ print()
5729
+ # Finally, the dev session (creates + attaches the agentwire session)
5730
+ return cmd_dev(args)
5731
+
5732
+
5628
5733
  # === Init Command ===
5629
5734
 
5630
5735
  def cmd_init(args) -> int:
@@ -6182,6 +6287,23 @@ def cmd_doctor(args) -> int:
6182
6287
  else:
6183
6288
  print(f" -> Service is remote, start it on {service_config.machine}")
6184
6289
 
6290
+ # 8b. Check STT server. STT isn't a `services.*` entry — it's configured via
6291
+ # `stt.url`, so the loop above can't see it. Without this check, a crashed STT
6292
+ # server is invisible and the portal silently falls back to a model-less
6293
+ # WhisperKit (every push-to-talk then fails). Probe it explicitly.
6294
+ stt_url = getattr(getattr(ctx.config, "stt", None), "url", None)
6295
+ if stt_url:
6296
+ from agentwire.stt.server_backend import STTServerBackend
6297
+
6298
+ if STTServerBackend.is_available(stt_url):
6299
+ print(f" [ok] Stt: responding on {stt_url}")
6300
+ else:
6301
+ print(f" [!!] Stt: not responding on {stt_url}")
6302
+ print(" Portal will fall back to WhisperKit (usually no model -> transcription FAILS).")
6303
+ print(" Fix: agentwire stt start")
6304
+ print(" If it won't boot: uv pip install --python .venv/bin/python -e '.[stt]'")
6305
+ issues_found += 1
6306
+
6185
6307
  # 9. Validate remote machines
6186
6308
  print("\nChecking remote machines...")
6187
6309
  remote_machines = {mid: m for mid, m in ctx.machines.items() if mid != ctx.local_machine_id}
@@ -10162,6 +10284,15 @@ def main() -> int:
10162
10284
  )
10163
10285
  dev_parser.set_defaults(func=cmd_dev)
10164
10286
 
10287
+ up_parser = subparsers.add_parser(
10288
+ "up", help="Boot all services (portal, TTS, STT, scheduler, custom) then the dev session"
10289
+ )
10290
+ up_parser.add_argument("--dev", action="store_true", help="Run portal from source (uv run)")
10291
+ up_parser.add_argument("--no-tts", action="store_true", help="Skip starting the TTS server")
10292
+ up_parser.add_argument("--no-stt", action="store_true", help="Skip starting the STT server")
10293
+ up_parser.add_argument("--config", type=Path, default=None, help="Path to config file")
10294
+ up_parser.set_defaults(func=cmd_up)
10295
+
10165
10296
  # === listen command group ===
10166
10297
  listen_parser = subparsers.add_parser("listen", help="Voice input recording")
10167
10298
  listen_parser.add_argument(
@@ -66,6 +66,10 @@ class WorktreesConfig:
66
66
  enabled: bool = True
67
67
  suffix: str = "-worktrees"
68
68
  auto_create_branch: bool = True
69
+ # Gitignored files that `git worktree add` won't carry over (it only
70
+ # checks out tracked files). These are copied from the main repo into
71
+ # each fresh worktree so agents have the secrets/config they need.
72
+ copy_files: list = field(default_factory=lambda: [".env"])
69
73
 
70
74
 
71
75
  @dataclass
@@ -178,12 +182,34 @@ class ServiceConfig:
178
182
  scheme: str = "http" # http or https
179
183
 
180
184
 
185
+ @dataclass
186
+ class CustomServiceConfig:
187
+ """A user-defined session that behaves like a service.
188
+
189
+ Custom services show up in the portal's Services column and are booted
190
+ by `agentwire up`. A service is just an agentwire session created in a
191
+ project directory; `roles`/`type` override the project's .agentwire.yml
192
+ when set.
193
+ """
194
+
195
+ name: str
196
+ project: Optional[str] = None
197
+ autostart: bool = True
198
+ roles: Optional[str] = None # comma-separated; overrides project .agentwire.yml
199
+ type: Optional[str] = None # session type override (e.g. claude-bypass)
200
+
201
+ def __post_init__(self):
202
+ if self.project:
203
+ self.project = str(_expand_path(self.project) or self.project)
204
+
205
+
181
206
  @dataclass
182
207
  class ServicesConfig:
183
208
  """Where each service runs in the network."""
184
209
 
185
210
  portal: ServiceConfig = field(default_factory=lambda: ServiceConfig(port=8765, scheme="https"))
186
211
  tts: ServiceConfig = field(default_factory=lambda: ServiceConfig(port=8100, scheme="http"))
212
+ custom: list = field(default_factory=list) # list[CustomServiceConfig]
187
213
 
188
214
 
189
215
  @dataclass
@@ -218,6 +244,7 @@ class SessionConfig:
218
244
  class SchedulerConfig:
219
245
  """Scheduler daemon configuration."""
220
246
 
247
+ autostart: bool = True # start the daemon when the portal boots
221
248
  board_file: Path = field(default_factory=lambda: Path.home() / ".agentwire" / "scheduler.yaml")
222
249
  events_file: Path = field(default_factory=lambda: Path.home() / ".agentwire" / "scheduler-events.jsonl")
223
250
  live_state_file: Path = field(default_factory=lambda: Path.home() / ".agentwire" / "scheduler-live.json")
@@ -387,6 +414,7 @@ def _dict_to_config(data: dict) -> Config:
387
414
  enabled=worktrees_data.get("enabled", True),
388
415
  suffix=worktrees_data.get("suffix", "-worktrees"),
389
416
  auto_create_branch=worktrees_data.get("auto_create_branch", True),
417
+ copy_files=worktrees_data.get("copy_files", [".env"]),
390
418
  )
391
419
  projects = ProjectsConfig(
392
420
  dir=projects_data.get("dir", "~/projects"),
@@ -462,9 +490,22 @@ def _dict_to_config(data: dict) -> Config:
462
490
  health_endpoint=tts_service_data.get("health_endpoint", "/health"),
463
491
  scheme=tts_service_data.get("scheme", "http"), # TTS defaults to HTTP
464
492
  )
493
+ custom_services = []
494
+ for entry in services_data.get("custom", []) or []:
495
+ if isinstance(entry, str):
496
+ custom_services.append(CustomServiceConfig(name=entry))
497
+ elif isinstance(entry, dict) and entry.get("name"):
498
+ custom_services.append(CustomServiceConfig(
499
+ name=entry["name"],
500
+ project=entry.get("project"),
501
+ autostart=entry.get("autostart", True),
502
+ roles=entry.get("roles"),
503
+ type=entry.get("type"),
504
+ ))
465
505
  services = ServicesConfig(
466
506
  portal=portal_service,
467
507
  tts=tts_service,
508
+ custom=custom_services,
468
509
  )
469
510
 
470
511
  # Channel configs (registry-driven)
@@ -485,6 +526,7 @@ def _dict_to_config(data: dict) -> Config:
485
526
  # Scheduler
486
527
  scheduler_data = data.get("scheduler", {})
487
528
  scheduler = SchedulerConfig(
529
+ autostart=scheduler_data.get("autostart", True),
488
530
  board_file=scheduler_data.get("board_file", "~/.agentwire/scheduler.yaml"),
489
531
  events_file=scheduler_data.get("events_file", "~/.agentwire/scheduler-events.jsonl"),
490
532
  live_state_file=scheduler_data.get("live_state_file", "~/.agentwire/scheduler-live.json"),
@@ -2726,6 +2726,22 @@ def desktop_minimize_all() -> str:
2726
2726
  return f"Failed to minimize windows: {data.get('error', 'Unknown error')}"
2727
2727
 
2728
2728
 
2729
+ @mcp.tool()
2730
+ def desktop_collage() -> str:
2731
+ """Toggle the window collage in the portal desktop.
2732
+
2733
+ Lays every open window into a grid so they can all be seen at once;
2734
+ toggling again (or the user clicking a tile / pressing Esc) exits the overlay.
2735
+
2736
+ Returns:
2737
+ Success message or error description.
2738
+ """
2739
+ data = _portal_request("POST", "/api/desktop/collage")
2740
+ if data.get("success"):
2741
+ return "Collage toggled."
2742
+ return f"Failed to toggle Collage: {data.get('error', 'Unknown error')}"
2743
+
2744
+
2729
2745
  @mcp.tool()
2730
2746
  def desktop_layout(windows: list[dict]) -> str:
2731
2747
  """Apply a multi-window layout to the portal desktop.