agentwire-dev 1.61.0__tar.gz → 1.63.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 (500) hide show
  1. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/PKG-INFO +1 -1
  2. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/__init__.py +1 -1
  3. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/core.py +48 -0
  4. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_worktree.py +9 -1
  5. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/pane_cli.py +2 -0
  6. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/notify.py +12 -1
  7. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/projects.py +62 -0
  8. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/sessions_admin.py +4 -4
  9. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/session_cli.py +59 -5
  10. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/css/desktop.css +990 -0
  11. agentwire_dev-1.63.0/agentwire/static/js/card-terminal.js +260 -0
  12. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/collage.js +110 -5
  13. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/command-palette.js +5 -0
  14. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/desktop-manager.js +11 -1
  15. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/desktop.js +274 -7
  16. agentwire_dev-1.63.0/agentwire/static/js/lineage.js +138 -0
  17. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/scratchpad.js +4 -0
  18. agentwire_dev-1.63.0/agentwire/static/js/session-hud-controller.js +284 -0
  19. agentwire_dev-1.63.0/agentwire/static/js/session-hud-spawn.js +144 -0
  20. agentwire_dev-1.63.0/agentwire/static/js/session-hud.js +311 -0
  21. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/session-window.js +97 -569
  22. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/shortcuts.js +2 -0
  23. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/config-section.js +37 -2
  24. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/sessions-section.js +40 -3
  25. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar.js +6 -3
  26. agentwire_dev-1.63.0/agentwire/static/js/spawn-ghost.js +105 -0
  27. agentwire_dev-1.63.0/agentwire/static/js/terminal-pane.js +779 -0
  28. agentwire_dev-1.63.0/agentwire/static/js/topology-render.js +788 -0
  29. agentwire_dev-1.63.0/agentwire/static/js/workspace-window.js +141 -0
  30. agentwire_dev-1.63.0/agentwire/static/topology-harness.html +120 -0
  31. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/INDEX.md +1 -0
  32. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/portal.md +3 -1
  33. agentwire_dev-1.63.0/docs/wiki/internals/session-topology.md +93 -0
  34. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/window-collage.md +4 -1
  35. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/sessions/worktree-sessions.md +25 -0
  36. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/integration/test_worktree_cmd.py +110 -0
  37. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_cli_commands.py +4 -0
  38. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_portal_api.py +51 -0
  39. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_routes_snapshot.py +2 -0
  40. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_worktree_branch_cleanup.py +112 -0
  41. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.agentwire.yml.example +0 -0
  42. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.claude/commands/handoff.md +0 -0
  43. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.claude/skills/wiki/SKILL.md +0 -0
  44. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/FUNDING.yml +0 -0
  45. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  46. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  47. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  48. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  49. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/workflows/pytest.yml +0 -0
  50. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/workflows/ruff.yml +0 -0
  51. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/workflows/security.yml +0 -0
  52. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.github/workflows/tts-smoke.yml +0 -0
  53. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/.gitignore +0 -0
  54. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/AGENTS.md +0 -0
  55. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/CODE_OF_CONDUCT.md +0 -0
  56. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/CONTRIBUTING.md +0 -0
  57. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/Dockerfile.local +0 -0
  58. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/LICENSE +0 -0
  59. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/README.md +0 -0
  60. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/RELEASING.md +0 -0
  61. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/SECURITY.md +0 -0
  62. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/SPONSORS.md +0 -0
  63. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/__main__.py +0 -0
  64. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/agents/__init__.py +0 -0
  65. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/agents/base.py +0 -0
  66. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/agents/tmux.py +0 -0
  67. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/cached_status.py +0 -0
  68. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels/__init__.py +0 -0
  69. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels/base.py +0 -0
  70. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels/email.py +0 -0
  71. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels/push.py +0 -0
  72. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels/quo.py +0 -0
  73. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/channels_cli.py +0 -0
  74. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/chrome_tabs.py +0 -0
  75. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/completion.py +0 -0
  76. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/config.py +0 -0
  77. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/config_cli.py +0 -0
  78. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/__init__.py +0 -0
  79. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/cli.py +0 -0
  80. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/inbox.py +0 -0
  81. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/minutes.py +0 -0
  82. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/state.py +0 -0
  83. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/council/view.py +0 -0
  84. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/devices.py +0 -0
  85. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/diff_cli.py +0 -0
  86. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/doctor_cli.py +0 -0
  87. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/doctor_voice.py +0 -0
  88. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/ensure_cli.py +0 -0
  89. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/fetch.py +0 -0
  90. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/__init__.py +0 -0
  91. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/git_state.py +0 -0
  92. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/instructions.py +0 -0
  93. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/parser.py +0 -0
  94. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/renderer.py +0 -0
  95. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff/schema.py +0 -0
  96. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/handoff_cli.py +0 -0
  97. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/history.py +0 -0
  98. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/history_cli.py +0 -0
  99. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/__init__.py +0 -0
  100. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/agentwire-permission.sh +0 -0
  101. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/__init__.py +0 -0
  102. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/audit_logger.py +0 -0
  103. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
  104. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
  105. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/mcp-tool-damage-control.py +0 -0
  106. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/read-tool-damage-control.py +0 -0
  107. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
  108. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
  109. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
  110. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
  111. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/control-plane.yaml +0 -0
  112. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
  113. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
  114. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
  115. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
  116. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
  117. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
  118. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
  119. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/outbound.yaml +0 -0
  120. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/publish.yaml +0 -0
  121. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
  122. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
  123. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/idle-handler.sh +0 -0
  124. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks/queue-processor.sh +0 -0
  125. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/hooks_cli.py +0 -0
  126. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/inbox.py +0 -0
  127. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/limits_cli.py +0 -0
  128. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/listen.py +0 -0
  129. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/locking.py +0 -0
  130. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/machine_cli.py +0 -0
  131. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_channels.py +0 -0
  132. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_chrome.py +0 -0
  133. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_cli.py +0 -0
  134. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_core.py +0 -0
  135. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_council.py +0 -0
  136. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_desktop.py +0 -0
  137. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_handoff.py +0 -0
  138. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_history.py +0 -0
  139. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_listen.py +0 -0
  140. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_lock.py +0 -0
  141. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_machine.py +0 -0
  142. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_msg.py +0 -0
  143. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_notify.py +0 -0
  144. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_pane.py +0 -0
  145. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_projects.py +0 -0
  146. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_scheduler.py +0 -0
  147. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_scratchpad.py +0 -0
  148. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_server.py +0 -0
  149. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_services.py +0 -0
  150. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_session.py +0 -0
  151. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_status.py +0 -0
  152. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_task.py +0 -0
  153. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_tunnels.py +0 -0
  154. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_voice.py +0 -0
  155. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/mcp_wiki.py +0 -0
  156. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/msg_cli.py +0 -0
  157. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/network.py +0 -0
  158. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/notify_cli.py +0 -0
  159. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/onboarding.py +0 -0
  160. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/palette_cli.py +0 -0
  161. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/pane_manager.py +0 -0
  162. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/portal_cli.py +0 -0
  163. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/project_config.py +0 -0
  164. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/projects.py +0 -0
  165. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/prompt_router.py +0 -0
  166. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/prompts_cli.py +0 -0
  167. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/push_cli.py +0 -0
  168. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/push_store.py +0 -0
  169. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/repo_cli.py +0 -0
  170. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/research.py +0 -0
  171. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/__init__.py +0 -0
  172. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/agentwire.md +0 -0
  173. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/anchor.md +0 -0
  174. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/chatbot.md +0 -0
  175. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/contributor.md +0 -0
  176. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/correspondent.md +0 -0
  177. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-brain.md +0 -0
  178. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-conscience.md +0 -0
  179. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-critic.md +0 -0
  180. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-devils-advocate.md +0 -0
  181. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-gut.md +0 -0
  182. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-historian.md +0 -0
  183. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-member.md +0 -0
  184. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/council-orchestrator.md +0 -0
  185. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/init.md +0 -0
  186. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/notifications.md +0 -0
  187. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/orchestrator.md +0 -0
  188. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/soul.md +0 -0
  189. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/task-runner.md +0 -0
  190. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/voice.md +0 -0
  191. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/worker-worktree.md +0 -0
  192. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles/worker.md +0 -0
  193. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/roles_cli.py +0 -0
  194. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/__init__.py +0 -0
  195. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/artifacts.py +0 -0
  196. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/config.py +0 -0
  197. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/council.py +0 -0
  198. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/desktop.py +0 -0
  199. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/history.py +0 -0
  200. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/machines.py +0 -0
  201. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/palette.py +0 -0
  202. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/permission.py +0 -0
  203. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/push.py +0 -0
  204. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/safety.py +0 -0
  205. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/scheduler.py +0 -0
  206. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/scratchpad.py +0 -0
  207. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/sessions.py +0 -0
  208. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/routes/voice.py +0 -0
  209. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/safety/__init__.py +0 -0
  210. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/safety/_core.py +0 -0
  211. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/safety_cli.py +0 -0
  212. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/safety_commands.py +0 -0
  213. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/__init__.py +0 -0
  214. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/dispatch.py +0 -0
  215. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/gates.py +0 -0
  216. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/loop.py +0 -0
  217. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/models.py +0 -0
  218. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/report.py +0 -0
  219. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/schedule.py +0 -0
  220. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/state.py +0 -0
  221. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler/zombie.py +0 -0
  222. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scheduler_cli.py +0 -0
  223. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/scratchpad.py +0 -0
  224. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/security.py +0 -0
  225. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/send_cli.py +0 -0
  226. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/server.py +0 -0
  227. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/services.py +0 -0
  228. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/session_context.py +0 -0
  229. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/session_ready.py +0 -0
  230. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/ssh.py +0 -0
  231. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
  232. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
  233. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
  234. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
  235. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
  236. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/announcements.json +0 -0
  237. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/apple-touch-icon.png +0 -0
  238. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/css/mobile.css +0 -0
  239. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/favicon-32.png +0 -0
  240. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/favicon-64.png +0 -0
  241. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/bear.webp +0 -0
  242. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/cat.webp +0 -0
  243. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/crown.webp +0 -0
  244. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/custom/agentwire-portal.webp +0 -0
  245. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/custom/agentwire-tts.webp +0 -0
  246. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/custom/agentwire.webp +0 -0
  247. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/deer.webp +0 -0
  248. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/drone.webp +0 -0
  249. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/eagle.webp +0 -0
  250. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/fox.webp +0 -0
  251. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/hawk.webp +0 -0
  252. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/horse.webp +0 -0
  253. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/lion.webp +0 -0
  254. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/rabbit.webp +0 -0
  255. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/robot.webp +0 -0
  256. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/tiger.webp +0 -0
  257. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/icons/sessions/wolf.webp +0 -0
  258. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/img/icon-192.png +0 -0
  259. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/img/icon-512.png +0 -0
  260. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/.gitkeep +0 -0
  261. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/announcement-modal.js +0 -0
  262. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/api.js +0 -0
  263. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/artifact-window.js +0 -0
  264. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/council-window.js +0 -0
  265. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/dead-key-suppressor.js +0 -0
  266. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/help-modal.js +0 -0
  267. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/icon-manager.js +0 -0
  268. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/mobile.js +0 -0
  269. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/notification-prefs.js +0 -0
  270. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/notifications-panel.js +0 -0
  271. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/ptt.js +0 -0
  272. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/push-client.js +0 -0
  273. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/review-window.js +0 -0
  274. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/safety-shared.js +0 -0
  275. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/safety-window.js +0 -0
  276. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/service-classification.js +0 -0
  277. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/session-id.js +0 -0
  278. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
  279. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/council-section.js +0 -0
  280. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
  281. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
  282. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
  283. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
  284. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/sidebar/services-section.js +0 -0
  285. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
  286. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/tile-manager.js +0 -0
  287. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/toast.js +0 -0
  288. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/token-modal.js +0 -0
  289. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/utils/ansi.js +0 -0
  290. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/utils/swipe.js +0 -0
  291. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/voice/autosend-prefs.js +0 -0
  292. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/voice/browser-stt.js +0 -0
  293. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/voice/browser-tts.js +0 -0
  294. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/voice/jargon.js +0 -0
  295. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/voice/prompt.js +0 -0
  296. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
  297. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/manifest.webmanifest +0 -0
  298. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/static/service-worker.js +0 -0
  299. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/__init__.py +0 -0
  300. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/base.py +0 -0
  301. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/cloud.py +0 -0
  302. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/engine.py +0 -0
  303. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/local.py +0 -0
  304. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/server_backend.py +0 -0
  305. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/stt/stt_server.py +0 -0
  306. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/system_cli.py +0 -0
  307. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tabs_cli.py +0 -0
  308. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tasks.py +0 -0
  309. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tasks_cli.py +0 -0
  310. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/__init__.py +0 -0
  311. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/base.html +0 -0
  312. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/council/minutes.html.j2 +0 -0
  313. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/desktop.html +0 -0
  314. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/email_notification.html +0 -0
  315. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
  316. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
  317. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/mobile.html +0 -0
  318. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/pair.html +0 -0
  319. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templates/tmux.conf +0 -0
  320. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/templating.py +0 -0
  321. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/aws.yaml +0 -0
  322. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/docker.yaml +0 -0
  323. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/gcp.yaml +0 -0
  324. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/gh.yaml +0 -0
  325. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/git.yaml +0 -0
  326. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/gws.yaml +0 -0
  327. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/kubectl.yaml +0 -0
  328. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/npm.yaml +0 -0
  329. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/terraform.yaml +0 -0
  330. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tooldefs/uv.yaml +0 -0
  331. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/__init__.py +0 -0
  332. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/audio.py +0 -0
  333. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/base.py +0 -0
  334. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/engines/__init__.py +0 -0
  335. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/engines/chatterbox.py +0 -0
  336. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/engines/kokoro.py +0 -0
  337. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/engines/zonos.py +0 -0
  338. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/kokoro_server.py +0 -0
  339. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/local.py +0 -0
  340. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts/registry.py +0 -0
  341. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts_cli.py +0 -0
  342. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tts_server.py +0 -0
  343. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tunnels.py +0 -0
  344. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/tunnels_cli.py +0 -0
  345. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/usage_limit.py +0 -0
  346. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/__init__.py +0 -0
  347. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/chunker.py +0 -0
  348. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/event_log.py +0 -0
  349. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/file_io.py +0 -0
  350. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/paths.py +0 -0
  351. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/speech.py +0 -0
  352. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/utils/subprocess.py +0 -0
  353. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/validation.py +0 -0
  354. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/voice_status.py +0 -0
  355. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/wiki.py +0 -0
  356. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/wiki_audit.py +0 -0
  357. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/wiki_cli.py +0 -0
  358. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/worktree.py +0 -0
  359. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/agentwire/worktree_registry.py +0 -0
  360. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/decisions/obsidian-second-brain.md +0 -0
  361. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/logo.png +0 -0
  362. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/architecture.md +0 -0
  363. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/briefing-mode.md +0 -0
  364. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/communication/channels.md +0 -0
  365. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/communication/hammerspoon.md +0 -0
  366. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/communication/handoff.md +0 -0
  367. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/concepts.md +0 -0
  368. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/council.md +0 -0
  369. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/deployment/remote-access.md +0 -0
  370. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/deployment/remote-machines.md +0 -0
  371. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/glossary.md +0 -0
  372. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
  373. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/damage-control.md +0 -0
  374. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/parallel-refactor.md +0 -0
  375. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/shell-escaping.md +0 -0
  376. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/internals/troubleshooting.md +0 -0
  377. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/quickstart.md +0 -0
  378. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/research/briefing-mode-feasibility.md +0 -0
  379. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/research/orchestration-transport-alternatives.md +0 -0
  380. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
  381. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/security/damage-control-hardening.md +0 -0
  382. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/security/pip-audit.md +0 -0
  383. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/security/remote-access-hardening.md +0 -0
  384. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/security/secrets.md +0 -0
  385. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/services.md +0 -0
  386. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
  387. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/sessions/messaging.md +0 -0
  388. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/sessions/prompt-routing.md +0 -0
  389. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/sessions/window-sizing.md +0 -0
  390. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/usage-limit-recovery.md +0 -0
  391. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/voice/shim-contract.md +0 -0
  392. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/voice/stt-cloud.md +0 -0
  393. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/voice/stt-self-hosted.md +0 -0
  394. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/docs/wiki/voice/tts-self-hosted.md +0 -0
  395. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/pyproject.toml +0 -0
  396. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/conftest.py +0 -0
  397. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/e2e/test_portal_ui.py +0 -0
  398. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/fixtures/sample_agentwire.yml +0 -0
  399. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/fixtures/sample_config.yaml +0 -0
  400. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/fixtures/sample_scheduler.yaml +0 -0
  401. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/integration/test_council_portal.py +0 -0
  402. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/integration/test_scheduler_board.py +0 -0
  403. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/integration/test_send_verified_tmux.py +0 -0
  404. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/integration/test_server_websockets.py +0 -0
  405. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_announcements.py +0 -0
  406. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_build_agent_command.py +0 -0
  407. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_channels.py +0 -0
  408. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_chrome_tabs.py +0 -0
  409. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_cli_output.py +0 -0
  410. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_cli_smoke.py +0 -0
  411. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_config.py +0 -0
  412. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_config_cli.py +0 -0
  413. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_control_plane_protection.py +0 -0
  414. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_core_created_by_rooting.py +0 -0
  415. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_council_cli.py +0 -0
  416. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_council_inbox.py +0 -0
  417. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_council_minutes.py +0 -0
  418. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_council_state.py +0 -0
  419. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_council_view.py +0 -0
  420. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_damage_control_bypass.py +0 -0
  421. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_damage_control_hooks.py +0 -0
  422. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_damage_control_sync.py +0 -0
  423. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_dangling_worktrees.py +0 -0
  424. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_devices.py +0 -0
  425. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_diff_cli.py +0 -0
  426. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_doctor_task_migration.py +0 -0
  427. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_doctor_voice.py +0 -0
  428. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_event_log.py +0 -0
  429. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_file_io.py +0 -0
  430. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_guarded_launch_command.py +0 -0
  431. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_handoff_git_state.py +0 -0
  432. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_handoff_instructions.py +0 -0
  433. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_handoff_parser.py +0 -0
  434. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_handoff_renderer.py +0 -0
  435. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_history.py +0 -0
  436. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_hooks_install.py +0 -0
  437. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_idle_handler.py +0 -0
  438. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_idle_nag.py +0 -0
  439. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_inbox.py +0 -0
  440. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_init_command.py +0 -0
  441. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_install_parity.py +0 -0
  442. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_limits_tick_isolation.py +0 -0
  443. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_locking.py +0 -0
  444. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_mcp_server.py +0 -0
  445. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_mcp_tools_args.py +0 -0
  446. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_msg_cli.py +0 -0
  447. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_notify_cli.py +0 -0
  448. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_onboarding_reinit.py +0 -0
  449. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_palette_cli.py +0 -0
  450. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_pip_environment.py +0 -0
  451. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_posture_default.py +0 -0
  452. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_project_config.py +0 -0
  453. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_prompt_router.py +0 -0
  454. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_push.py +0 -0
  455. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_rebuild_guard.py +0 -0
  456. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_repo_cli.py +0 -0
  457. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_roles.py +0 -0
  458. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_safety_commands.py +0 -0
  459. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_safety_disabled_rules.py +0 -0
  460. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_safety_escape_hatch.py +0 -0
  461. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_safety_heal.py +0 -0
  462. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_safety_kill_switch.py +0 -0
  463. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_scheduler.py +0 -0
  464. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_scheduler_parsing.py +0 -0
  465. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_scheduler_zombie.py +0 -0
  466. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_scratchpad.py +0 -0
  467. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_security.py +0 -0
  468. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_server_async.py +0 -0
  469. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_server_pure.py +0 -0
  470. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_services.py +0 -0
  471. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_session_context.py +0 -0
  472. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_session_created_by_env.py +0 -0
  473. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_session_ready.py +0 -0
  474. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_shared_dir_guard.py +0 -0
  475. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_shim_selfheal.py +0 -0
  476. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_skill_install.py +0 -0
  477. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_speech_tags.py +0 -0
  478. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_ssh.py +0 -0
  479. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_stt_backend.py +0 -0
  480. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_stt_cloud.py +0 -0
  481. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_stt_engine.py +0 -0
  482. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_task_cli.py +0 -0
  483. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tasks.py +0 -0
  484. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tasks_cli.py +0 -0
  485. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_templating.py +0 -0
  486. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_terminal_resize.py +0 -0
  487. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tmux_template.py +0 -0
  488. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tts_engine_resolution.py +0 -0
  489. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tts_local.py +0 -0
  490. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_tunnels_probe.py +0 -0
  491. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_unattended_env_isolation.py +0 -0
  492. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_usage_limit.py +0 -0
  493. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_validation.py +0 -0
  494. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_voice_status.py +0 -0
  495. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_wiki.py +0 -0
  496. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_wiki_audit.py +0 -0
  497. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_window_cycling_binding.py +0 -0
  498. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_worktree.py +0 -0
  499. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_worktree_layout.py +0 -0
  500. {agentwire_dev-1.61.0 → agentwire_dev-1.63.0}/tests/unit/test_worktree_registry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentwire-dev
3
- Version: 1.61.0
3
+ Version: 1.63.0
4
4
  Summary: Multi-session voice web interface for AI coding agents
5
5
  Project-URL: Homepage, https://agentwire.dev
6
6
  Project-URL: Repository, https://github.com/dotdevdotdev/agentwire-dev
@@ -1,3 +1,3 @@
1
1
  """AgentWire - Multi-session voice web interface for AI coding agents."""
2
2
 
3
- __version__ = "1.61.0"
3
+ __version__ = "1.63.0"
@@ -740,6 +740,54 @@ def _record_session_creator(session_name: str, created_by: str | None, via: str)
740
740
  store_session_metadata(session_name, metadata)
741
741
 
742
742
 
743
+ def _record_session_role(session_name: str, role: str | None) -> None:
744
+ """Record the session's ROLE axis (orchestrator/worker) to disk (merge-preserving).
745
+
746
+ Distinct from the etiquette/persona ``roles:`` list in ``.agentwire.yml`` —
747
+ this is the fundamental authority axis derived at creation time (``kind``
748
+ in cmd_new, ``effective_kind`` in cmd_worktree, "worker" for cmd_spawn).
749
+ Read back by list_local_sessions() and the session_created notify lookup.
750
+ """
751
+ if not role:
752
+ return
753
+ metadata = load_session_metadata(session_name)
754
+ metadata["role"] = role
755
+ store_session_metadata(session_name, metadata)
756
+
757
+
758
+ def notify_portal_session_created(session_name: str, parent: str | None, role: str | None) -> None:
759
+ """Tell the portal a session was just created, with topology context (#747).
760
+
761
+ Fires immediately from the creating process instead of relying solely on
762
+ the global tmux ``session-created`` hook, which only knows the bare
763
+ session name (no parent/role) and can race a slow first-message delivery
764
+ before metadata is written. Fire-and-forget — failures are silently
765
+ ignored since the portal may not be running.
766
+ """
767
+ import ssl
768
+
769
+ payload: dict = {"event": "session_created", "session": session_name}
770
+ if parent:
771
+ payload["parent"] = parent
772
+ if role:
773
+ payload["role"] = role
774
+
775
+ try:
776
+ ctx = ssl.create_default_context()
777
+ ctx.check_hostname = False
778
+ ctx.verify_mode = ssl.CERT_NONE
779
+
780
+ req = urllib.request.Request(
781
+ f"{_default_portal_url()}/api/notify",
782
+ data=json.dumps(payload).encode(),
783
+ headers={"Content-Type": "application/json", **_portal_auth_headers()},
784
+ method="POST",
785
+ )
786
+ urllib.request.urlopen(req, timeout=3, context=ctx)
787
+ except Exception:
788
+ pass
789
+
790
+
743
791
  def _display_parent(session_name: str, path: str = "") -> "str | None":
744
792
  """The session that should visually own this one in the sidebar.
745
793
 
@@ -225,6 +225,7 @@ def worktree_remove(
225
225
  project_dir: str = "",
226
226
  keep_branch: bool = False,
227
227
  force_delete_branch: bool = False,
228
+ close_pr_branch: bool = False,
228
229
  ) -> str:
229
230
  """Tear down a worktree session: kill the session, remove the worktree + branch, unregister.
230
231
 
@@ -245,7 +246,12 @@ def worktree_remove(
245
246
  project_dir: Path to the git repo (default: server cwd).
246
247
  keep_branch: Skip branch cleanup entirely (leave the branch as-is).
247
248
  force_delete_branch: Delete the branch even if not confirmed merged —
248
- use only when you're sure the work is safe to discard.
249
+ use only when you're sure the work is safe to discard. Still
250
+ refuses a branch with an OPEN PR (deleting it would silently
251
+ close the PR) unless close_pr_branch is also set.
252
+ close_pr_branch: Combined with force_delete_branch, also delete a
253
+ branch that has an OPEN PR, closing it. Explicit escape hatch —
254
+ only set this when you mean to close that PR.
249
255
 
250
256
  Returns:
251
257
  Success message describing what was removed, or a loud failure
@@ -258,6 +264,8 @@ def worktree_remove(
258
264
  args += ["--keep-branch"]
259
265
  if force_delete_branch:
260
266
  args += ["--force-delete-branch"]
267
+ if close_pr_branch:
268
+ args += ["--close-pr-branch"]
261
269
  data = run_agentwire_cmd(args)
262
270
  session = data.get("session", name)
263
271
  killed = " (killed live session)" if data.get("killed") else ""
@@ -37,6 +37,7 @@ from .core import (
37
37
  build_agent_command,
38
38
  inject_session_env,
39
39
  load_config,
40
+ load_session_metadata,
40
41
  parse_env_args,
41
42
  tmux_session_exists,
42
43
  )
@@ -172,6 +173,7 @@ def list_local_sessions(show_context: bool = False) -> list[dict]:
172
173
  "posture": cfg.get("posture"),
173
174
  "roles": cfg.get("roles", []),
174
175
  "parent": _display_parent(parts[0], path),
176
+ "role": load_session_metadata(parts[0]).get("role"),
175
177
  }
176
178
  if usage_limit_parked(parts[0]):
177
179
  session_info["usage_limit"] = True
@@ -66,9 +66,20 @@ class NotifyRoutesMixin:
66
66
  await self.broadcast_dashboard("sessions_update", {"sessions": sessions_data})
67
67
 
68
68
  elif event == "session_created":
69
+ # #747: name/parent/role travel in the payload when the
70
+ # creating process (cmd_new et al.) posts this explicitly —
71
+ # that's authoritative, no race. The bare global tmux hook
72
+ # (session-created, any tmux session) carries only the name,
73
+ # so fall back to a fresh lookup for that case (metadata may
74
+ # not be written yet on a very fast reattach — best-effort).
69
75
  self._invalidate_session_caches()
70
- await self.broadcast_dashboard("session_created", {"session": session})
71
76
  sessions_data = await self._get_sessions_data()
77
+ entry = next((s for s in sessions_data if s.get("name") == session), None)
78
+ parent = data.get("parent") or (entry.get("parent") if entry else None)
79
+ role = data.get("role") or (entry.get("role") if entry else None)
80
+ await self.broadcast_dashboard("session_created", {
81
+ "session": session, "name": session, "parent": parent, "role": role,
82
+ })
72
83
  await self.broadcast_dashboard("sessions_update", {"sessions": sessions_data})
73
84
 
74
85
  elif event == "pane_died":
@@ -379,6 +379,66 @@ class ProjectsRoutesMixin:
379
379
 
380
380
  return web.json_response({"existing": result.get("existing", [])})
381
381
 
382
+ async def api_worktree_cleanup(self, request: web.Request) -> web.Response:
383
+ """Tear down an orphaned worktree (Session HUD ghost card "Clean up").
384
+
385
+ Thin wrapper over the plain `agentwire worktree --remove` form — the
386
+ CLI's own merge/open-PR guard decides whether the branch is also
387
+ deleted; this never escalates to --force-delete-branch.
388
+
389
+ Body: {"name": "<branch or session>", "project": "/path/to/repo"}
390
+ Returns whatever the CLI returns verbatim: on success
391
+ {success, session, path, killed, worktree_removed, branch,
392
+ branch_deleted, branch_note, orphaned_tabs}; on failure
393
+ {success: false, error}.
394
+ """
395
+ try:
396
+ data = await request.json()
397
+ except Exception:
398
+ return web.json_response({"success": False, "error": "Invalid JSON body"}, status=400)
399
+
400
+ name = (data.get("name") or "").strip()
401
+ project = (data.get("project") or "").strip()
402
+ if not name or not project:
403
+ return web.json_response({"success": False, "error": "name and project are required"}, status=400)
404
+
405
+ # Thin wrapper: the git/registry/branch-safety logic lives in the CLI (SSOT).
406
+ success, result = await self.run_agentwire_cmd(
407
+ ["worktree", "--remove", name, "-p", project]
408
+ )
409
+ return web.json_response(result, status=200 if success else 400)
410
+
411
+ async def api_worktree_adopt(self, request: web.Request) -> web.Response:
412
+ """Spawn a session into an existing worktree (Session HUD ghost card "Adopt").
413
+
414
+ Thin wrapper over `agentwire worktree <name> -p <project> --existing
415
+ [--created-by <createdBy>]` — checks out the branch already on disk
416
+ (no new branch) and, when the dead session's recorded creator is
417
+ known, roots the new session under that same parent so it reports
418
+ back the way the original session would have.
419
+
420
+ Body: {"name": "<branch>", "project": "/path/to/repo", "createdBy": "<session>"}
421
+ Returns whatever the CLI returns verbatim (same shape as `agentwire new`'s
422
+ json — success/session/path/... — or {success: false, error}).
423
+ """
424
+ try:
425
+ data = await request.json()
426
+ except Exception:
427
+ return web.json_response({"success": False, "error": "Invalid JSON body"}, status=400)
428
+
429
+ name = (data.get("name") or "").strip()
430
+ project = (data.get("project") or "").strip()
431
+ created_by = (data.get("createdBy") or "").strip()
432
+ if not name or not project:
433
+ return web.json_response({"success": False, "error": "name and project are required"}, status=400)
434
+
435
+ args = ["worktree", name, "-p", project, "--existing"]
436
+ if created_by:
437
+ args += ["--created-by", created_by]
438
+
439
+ success, result = await self.run_agentwire_cmd(args)
440
+ return web.json_response(result, status=200 if success else 400)
441
+
382
442
 
383
443
  def register_projects_routes(server, app):
384
444
  """Wire the projects domain's routes onto ``app``."""
@@ -389,3 +449,5 @@ def register_projects_routes(server, app):
389
449
  app.router.add_get("/api/session/defaults", server.api_session_defaults)
390
450
  app.router.add_get("/api/check-path", server.api_check_path)
391
451
  app.router.add_get("/api/check-branches", server.api_check_branches)
452
+ app.router.add_post("/api/worktree/cleanup", server.api_worktree_cleanup)
453
+ app.router.add_post("/api/worktree/adopt", server.api_worktree_adopt)
@@ -183,10 +183,10 @@ class SessionsAdminRoutesMixin:
183
183
  yaml_config["voice"] = voice
184
184
  await self._write_agentwire_yaml(session_path, yaml_config, machine_id)
185
185
 
186
- # Broadcast session created to dashboard clients
187
- await self.broadcast_dashboard("session_created", {"session": session_name})
188
- sessions_data = await self._get_sessions_data()
189
- await self.broadcast_dashboard("sessions_update", {"sessions": sessions_data})
186
+ # No manual broadcast here (#747): the `agentwire new` subprocess
187
+ # just awaited above already posted the enriched session_created
188
+ # (name/parent/role) + sessions_update to this same portal from
189
+ # inside cmd_new, before returning.
190
190
 
191
191
  # Wait until the tmux pane has actually rendered something. The CLI
192
192
  # returns the moment `tmux send-keys` *queues* the agent command, so
@@ -29,12 +29,14 @@ from .core import (
29
29
  _output_json,
30
30
  _output_result,
31
31
  _record_session_creator,
32
+ _record_session_role,
32
33
  _resolve_posture_from_args,
33
34
  _resolve_posture_or_config,
34
35
  _run_remote,
35
36
  _set_session_name_env,
36
37
  build_agent_command,
37
38
  load_config,
39
+ notify_portal_session_created,
38
40
  parse_env_args,
39
41
  resolve_default_created_by,
40
42
  tmux_session_exists,
@@ -504,6 +506,14 @@ def cmd_new(args) -> int:
504
506
  # into place, and start the agent (skipped when bare).
505
507
  _launch_tmux_session(session_name, session_path, agent.env, agent_cmd)
506
508
 
509
+ # Record creator/role and push the enriched session_created event (#747)
510
+ # as early as possible — before the potentially slow first-message wait
511
+ # below — so the portal broadcast carries real parent/role instead of
512
+ # racing the metadata write against the async global tmux hook.
513
+ _record_session_creator(session_name, created_by, via="new")
514
+ _record_session_role(session_name, kind)
515
+ notify_portal_session_created(session_name, created_by, kind)
516
+
507
517
  # Update project config (.agentwire.yml) - only if --persist is given.
508
518
  # Persist USER roles (--roles) only — the intrinsic etiquette and soul are
509
519
  # derived/auto-appended each run, never written into project config.
@@ -567,8 +577,6 @@ def cmd_new(args) -> int:
567
577
  file=sys.stderr,
568
578
  )
569
579
 
570
- _record_session_creator(session_name, created_by, via="new")
571
-
572
580
  if json_mode:
573
581
  result = {
574
582
  "success": True,
@@ -1119,6 +1127,10 @@ def _worktree_list(args, project_path: Path, json_mode: bool) -> int:
1119
1127
  r["git"] = worktree_status(Path(r.get("worktree_path", "")))
1120
1128
  dead_msgs = inbox.list_dead(r.get("session", ""))
1121
1129
  r["dead_reports"] = [m.to_dict() for m in dead_msgs if m.kind in ("done", "escalation")]
1130
+ # Recorded creator/parent (persists after the session dies) — lets a
1131
+ # dead orphan entry still be placed in its family and re-adopted with
1132
+ # the same reporting relationship it had before (#781 ghost cards).
1133
+ r["created_by"] = _display_parent(r.get("session", ""), r.get("worktree_path", ""))
1122
1134
 
1123
1135
  if json_mode:
1124
1136
  _output_json({"success": True, "entries": rows})
@@ -1454,10 +1466,40 @@ def _branch_merge_state(project_path: Path, branch: str, base: str | None) -> st
1454
1466
  return "unknown"
1455
1467
 
1456
1468
 
1457
- def _delete_branch_if_safe(project_path: Path, branch: str, base: str | None, force: bool = False) -> tuple[bool, str]:
1469
+ def _open_pr_number(project_path: Path, branch: str) -> int | None:
1470
+ """Best-effort: the OPEN PR number for `branch`, or None if there isn't one
1471
+ (or `gh` is unavailable/unauthenticated) — never hard-fails, matching
1472
+ `_branch_merge_state`'s best-effort posture.
1473
+ """
1474
+ if not shutil.which("gh"):
1475
+ return None
1476
+ result = subprocess.run(
1477
+ ["gh", "pr", "view", branch, "--json", "state,number"],
1478
+ cwd=project_path, capture_output=True, text=True,
1479
+ )
1480
+ if result.returncode != 0:
1481
+ return None
1482
+ try:
1483
+ pr = json.loads(result.stdout)
1484
+ except json.JSONDecodeError:
1485
+ return None
1486
+ if str(pr.get("state", "")).upper() == "OPEN":
1487
+ return pr.get("number")
1488
+ return None
1489
+
1490
+
1491
+ def _delete_branch_if_safe(
1492
+ project_path: Path, branch: str, base: str | None, force: bool = False, close_pr_branch: bool = False,
1493
+ ) -> tuple[bool, str]:
1458
1494
  """Best-effort local + remote branch cleanup. Never touches an unmerged branch
1459
1495
  unless `force` — deleting an unmerged branch would silently drop real work.
1460
1496
 
1497
+ `force` bypasses the merge-state check but NOT an open PR: deleting the
1498
+ remote head branch of an OPEN PR silently closes it (GitHub loses the head
1499
+ ref), which is a different, more surprising destruction than "dropping
1500
+ unmerged local work" — so it needs its own explicit override,
1501
+ `close_pr_branch` (#756).
1502
+
1461
1503
  Returns (deleted, note) — note explains a skip, or names the confirmed state
1462
1504
  on delete.
1463
1505
  """
@@ -1465,6 +1507,13 @@ def _delete_branch_if_safe(project_path: Path, branch: str, base: str | None, fo
1465
1507
  state = _branch_merge_state(project_path, branch, base)
1466
1508
  if state != "merged":
1467
1509
  return False, f"not confirmed merged (state={state}); kept — pass --force-delete-branch to override"
1510
+ elif not close_pr_branch:
1511
+ open_pr = _open_pr_number(project_path, branch)
1512
+ if open_pr is not None:
1513
+ return False, (
1514
+ f"branch {branch} has OPEN PR #{open_pr} — force-deleting closes it. "
1515
+ "Merge/close the PR first, or pass --close-pr-branch to override."
1516
+ )
1468
1517
 
1469
1518
  local = subprocess.run(
1470
1519
  ["git", "-C", str(project_path), "branch", "-D", branch],
@@ -1486,6 +1535,7 @@ def _delete_branch_if_safe(project_path: Path, branch: str, base: str | None, fo
1486
1535
  def _teardown_entry(
1487
1536
  project_path: Path, worktree_dir: Path, session_name: str, worktree_path: Path,
1488
1537
  branch: str | None, base: str | None, *, keep_branch: bool = False, force_branch: bool = False,
1538
+ close_pr_branch: bool = False,
1489
1539
  ) -> dict:
1490
1540
  """Core atomic teardown: force-remove the worktree + prune, kill session,
1491
1541
  unregister, best-effort branch cleanup. Shared by --remove and
@@ -1522,7 +1572,9 @@ def _teardown_entry(
1522
1572
 
1523
1573
  branch_deleted, branch_note = (False, "")
1524
1574
  if branch and not keep_branch:
1525
- branch_deleted, branch_note = _delete_branch_if_safe(project_path, branch, base, force=force_branch)
1575
+ branch_deleted, branch_note = _delete_branch_if_safe(
1576
+ project_path, branch, base, force=force_branch, close_pr_branch=close_pr_branch,
1577
+ )
1526
1578
 
1527
1579
  # Only unregister once the dir is confirmed gone (see docstring).
1528
1580
  worktree_registry.unregister(project_path, session=session_name, worktree_path=worktree_path)
@@ -1561,6 +1613,7 @@ def _worktree_remove(args, project_path: Path, worktree_dir: Path, json_mode: bo
1561
1613
  project_path, worktree_dir, session_name, worktree_path, branch, base,
1562
1614
  keep_branch=getattr(args, 'keep_branch', False),
1563
1615
  force_branch=getattr(args, 'force_delete_branch', False),
1616
+ close_pr_branch=getattr(args, 'close_pr_branch', False),
1564
1617
  )
1565
1618
 
1566
1619
  if json_mode:
@@ -2012,7 +2065,8 @@ def register_session_parser(subparsers) -> None:
2012
2065
  "remnant) — this flags a LIVE session no one is watching.")
2013
2066
  parser.add_argument("--remove", action="store_true", help="Atomic teardown: force-remove the worktree, kill the session, delete the branch once merged, and unregister (cleanup/recovery)")
2014
2067
  parser.add_argument("--keep-branch", action="store_true", help="With --remove: skip branch cleanup entirely (default: best-effort delete once confirmed merged)")
2015
- parser.add_argument("--force-delete-branch", action="store_true", help="With --remove: delete the branch (local + remote) even if not confirmed merged")
2068
+ parser.add_argument("--force-delete-branch", action="store_true", help="With --remove: delete the branch (local + remote) even if not confirmed merged. Refuses if the branch has an OPEN PR (would silently close it) unless --close-pr-branch is also given")
2069
+ parser.add_argument("--close-pr-branch", action="store_true", help="With --remove --force-delete-branch: also delete a branch that has an OPEN PR, closing it (explicit escape hatch for #756's guard)")
2016
2070
  parser.add_argument("--prune", action="store_true", help="Drop registry entries whose worktree is gone + git worktree prune")
2017
2071
  parser.add_argument("--gc-merged", action="store_true", help="Tear down (session/worktree/branch) any registered entry whose branch is confirmed merged; implies --prune (runs standalone too)")
2018
2072
  parser.add_argument("--all", action="store_true", help="With --list/--dangling: include worktree sessions across every repo")