swe-mux 0.1.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 (1644) hide show
  1. swe_mux-0.1.0/.docs/CLAUDE.md +689 -0
  2. swe_mux-0.1.0/.docs/design/00_OVERVIEW.md +123 -0
  3. swe_mux-0.1.0/.docs/design/architecture.md +190 -0
  4. swe_mux-0.1.0/.docs/design/data-model.md +640 -0
  5. swe_mux-0.1.0/.docs/design/features/agent-context.md +152 -0
  6. swe_mux-0.1.0/.docs/design/features/agent-environment.md +176 -0
  7. swe_mux-0.1.0/.docs/design/features/agent-messaging.md +374 -0
  8. swe_mux-0.1.0/.docs/design/features/approvals.md +326 -0
  9. swe_mux-0.1.0/.docs/design/features/assistant.md +392 -0
  10. swe_mux-0.1.0/.docs/design/features/attention-ranking.md +164 -0
  11. swe_mux-0.1.0/.docs/design/features/auto-delivery.md +304 -0
  12. swe_mux-0.1.0/.docs/design/features/automation-enablement.md +304 -0
  13. swe_mux-0.1.0/.docs/design/features/automation.md +547 -0
  14. swe_mux-0.1.0/.docs/design/features/backends.md +863 -0
  15. swe_mux-0.1.0/.docs/design/features/budgets.md +160 -0
  16. swe_mux-0.1.0/.docs/design/features/code-graph.md +193 -0
  17. swe_mux-0.1.0/.docs/design/features/configurator.md +329 -0
  18. swe_mux-0.1.0/.docs/design/features/delivery-readiness.md +381 -0
  19. swe_mux-0.1.0/.docs/design/features/desktop-shell.md +386 -0
  20. swe_mux-0.1.0/.docs/design/features/deterministic-consumers.md +293 -0
  21. swe_mux-0.1.0/.docs/design/features/device-presence.md +82 -0
  22. swe_mux-0.1.0/.docs/design/features/fleet-intelligence.md +98 -0
  23. swe_mux-0.1.0/.docs/design/features/ghost-windows.md +114 -0
  24. swe_mux-0.1.0/.docs/design/features/git.md +640 -0
  25. swe_mux-0.1.0/.docs/design/features/history.md +315 -0
  26. swe_mux-0.1.0/.docs/design/features/land-queue.md +612 -0
  27. swe_mux-0.1.0/.docs/design/features/launch-profiles.md +181 -0
  28. swe_mux-0.1.0/.docs/design/features/meta-hooks.md +52 -0
  29. swe_mux-0.1.0/.docs/design/features/mux-mcp.md +574 -0
  30. swe_mux-0.1.0/.docs/design/features/notifications.md +174 -0
  31. swe_mux-0.1.0/.docs/design/features/observations.md +57 -0
  32. swe_mux-0.1.0/.docs/design/features/operational-telemetry.md +235 -0
  33. swe_mux-0.1.0/.docs/design/features/processes-and-previews.md +616 -0
  34. swe_mux-0.1.0/.docs/design/features/project-actions.md +330 -0
  35. swe_mux-0.1.0/.docs/design/features/project-card.md +81 -0
  36. swe_mux-0.1.0/.docs/design/features/project-resources.md +697 -0
  37. swe_mux-0.1.0/.docs/design/features/projects.md +337 -0
  38. swe_mux-0.1.0/.docs/design/features/prompt-library.md +103 -0
  39. swe_mux-0.1.0/.docs/design/features/prompt-queue.md +302 -0
  40. swe_mux-0.1.0/.docs/design/features/provider-accounts.md +288 -0
  41. swe_mux-0.1.0/.docs/design/features/remote-access.md +234 -0
  42. swe_mux-0.1.0/.docs/design/features/scan-timeline.md +317 -0
  43. swe_mux-0.1.0/.docs/design/features/scheduled-runs.md +203 -0
  44. swe_mux-0.1.0/.docs/design/features/session-recovery.md +222 -0
  45. swe_mux-0.1.0/.docs/design/features/sessions.md +578 -0
  46. swe_mux-0.1.0/.docs/design/features/setting-links.md +300 -0
  47. swe_mux-0.1.0/.docs/design/features/status-detection.md +1082 -0
  48. swe_mux-0.1.0/.docs/design/features/terminal-input.md +445 -0
  49. swe_mux-0.1.0/.docs/design/features/tier0-facts.md +155 -0
  50. swe_mux-0.1.0/.docs/design/features/transcript-branches.md +86 -0
  51. swe_mux-0.1.0/.docs/design/features/ui.md +3373 -0
  52. swe_mux-0.1.0/.docs/design/features/usage.md +130 -0
  53. swe_mux-0.1.0/.docs/design/features/voice.md +1268 -0
  54. swe_mux-0.1.0/.docs/design/features/workspace-layout.md +311 -0
  55. swe_mux-0.1.0/.docs/design/interfaces.md +2793 -0
  56. swe_mux-0.1.0/.docs/development/AGENT_ENVIRONMENT_RUNTIME_INVENTORY.md +295 -0
  57. swe_mux-0.1.0/.docs/development/CODE_QUALITY_AUDIT_2026-08-23.md +152 -0
  58. swe_mux-0.1.0/.docs/development/CONTINUITY_TOUCH_KEYBOARD_ASK.md +120 -0
  59. swe_mux-0.1.0/.docs/development/CONTROL_PLANE_ROADMAP.md +1801 -0
  60. swe_mux-0.1.0/.docs/development/CROSS_PLATFORM_FINDINGS.md +397 -0
  61. swe_mux-0.1.0/.docs/development/HARNESS_EXPANSION_CANDIDATES.md +660 -0
  62. swe_mux-0.1.0/.docs/development/NEW_USER_RELEASE_READINESS.md +194 -0
  63. swe_mux-0.1.0/.docs/development/OPERATOR_LIFECYCLE.md +482 -0
  64. swe_mux-0.1.0/.docs/development/PERFORMANCE_RUNBOOK.md +365 -0
  65. swe_mux-0.1.0/.docs/development/PLUGIN_SYSTEM_FINDINGS.md +108 -0
  66. swe_mux-0.1.0/.docs/development/RELEASE_MANUAL_TASKS.md +291 -0
  67. swe_mux-0.1.0/.docs/development/ROADMAP.md +5152 -0
  68. swe_mux-0.1.0/.docs/development/STATUS_INCIDENT_RUNBOOK.md +189 -0
  69. swe_mux-0.1.0/.docs/development/TERMINAL_INPUT_INCIDENT_RUNBOOK.md +96 -0
  70. swe_mux-0.1.0/.docs/development/USABILITY_AUDIT_2026-08-20.md +519 -0
  71. swe_mux-0.1.0/.docs/development/archive/AGENT_MUX_SPEC.md +356 -0
  72. swe_mux-0.1.0/.docs/development/archive/GIT_DIFF_REVIEW_IMPLEMENTATION.md +610 -0
  73. swe_mux-0.1.0/.docs/development/archive/HARDENING_AUDIT_2026-07-27.md +912 -0
  74. swe_mux-0.1.0/.docs/development/archive/HARNESS_ABSTRACTION_AND_OMP.md +482 -0
  75. swe_mux-0.1.0/.docs/development/archive/HARNESS_PARITY_AUDIT_2026-08-11.md +258 -0
  76. swe_mux-0.1.0/.docs/development/archive/NOTIFICATION_SCOPING_PROPOSAL.md +113 -0
  77. swe_mux-0.1.0/.docs/development/archive/PROJECT_CARD_GENERATED_DESIGN.md +129 -0
  78. swe_mux-0.1.0/.docs/development/archive/ROADMAP.md +1719 -0
  79. swe_mux-0.1.0/.docs/development/archive/ROADMAP_V2.md +729 -0
  80. swe_mux-0.1.0/.docs/development/archive/SESSION_PRESERVING_RELOAD.md +430 -0
  81. swe_mux-0.1.0/.docs/development/archive/STATUS_DETECTION_V2_PLAN.md +310 -0
  82. swe_mux-0.1.0/.docs/development/archive/UTILITY_DRAWER_LAYOUT_IMPLEMENTATION.md +531 -0
  83. swe_mux-0.1.0/.docs/development/archive/VOICE_INTERACTION_ROADMAP.md +302 -0
  84. swe_mux-0.1.0/.docs/marketing/README.md +50 -0
  85. swe_mux-0.1.0/.docs/marketing/blog/01-launch.md +66 -0
  86. swe_mux-0.1.0/.docs/marketing/blog/02-session-preserving-runtime.md +62 -0
  87. swe_mux-0.1.0/.docs/marketing/blog/03-land-queue.md +54 -0
  88. swe_mux-0.1.0/.docs/marketing/blog/04-status-detection.md +57 -0
  89. swe_mux-0.1.0/.docs/marketing/blog/05-phone-fleet.md +49 -0
  90. swe_mux-0.1.0/.docs/marketing/blog/06-no-server-updates.md +50 -0
  91. swe_mux-0.1.0/.docs/marketing/posts/alternativeto.md +29 -0
  92. swe_mux-0.1.0/.docs/marketing/posts/awesome-list-prs.md +30 -0
  93. swe_mux-0.1.0/.docs/marketing/posts/bluesky-linkedin.md +35 -0
  94. swe_mux-0.1.0/.docs/marketing/posts/discord-claude-developers.md +23 -0
  95. swe_mux-0.1.0/.docs/marketing/posts/lobsters.md +19 -0
  96. swe_mux-0.1.0/.docs/marketing/posts/newsletter-submissions.md +50 -0
  97. swe_mux-0.1.0/.docs/marketing/posts/product-hunt.md +46 -0
  98. swe_mux-0.1.0/.docs/marketing/posts/reddit-soft-launch.md +66 -0
  99. swe_mux-0.1.0/.docs/marketing/posts/reddit-tier2.md +90 -0
  100. swe_mux-0.1.0/.docs/marketing/posts/show-hn.md +50 -0
  101. swe_mux-0.1.0/.docs/marketing/posts/x-thread.md +67 -0
  102. swe_mux-0.1.0/.docs/marketing/posts/youtube-outreach.md +33 -0
  103. swe_mux-0.1.0/.docs/technical/00_INDEX.md +31 -0
  104. swe_mux-0.1.0/.docs/technical/backend/packages/agent-surfaces.md +218 -0
  105. swe_mux-0.1.0/.docs/technical/backend/packages/automation-and-control-plane.md +130 -0
  106. swe_mux-0.1.0/.docs/technical/backend/packages/daemon-runtime.md +276 -0
  107. swe_mux-0.1.0/.docs/technical/backend/packages/git-and-landing.md +151 -0
  108. swe_mux-0.1.0/.docs/technical/backend/packages/harnesses.md +75 -0
  109. swe_mux-0.1.0/.docs/technical/backend/packages/history-and-observation.md +104 -0
  110. swe_mux-0.1.0/.docs/technical/backend/packages/platform.md +133 -0
  111. swe_mux-0.1.0/.docs/technical/backend/packages/processes-and-devices.md +91 -0
  112. swe_mux-0.1.0/.docs/technical/backend/packages/projects-and-worktrees.md +209 -0
  113. swe_mux-0.1.0/.docs/technical/backend/packages/pty-and-sessions.md +201 -0
  114. swe_mux-0.1.0/.docs/technical/backend/packages/routes.md +290 -0
  115. swe_mux-0.1.0/.docs/technical/backend/packages/runtime-rules.md +214 -0
  116. swe_mux-0.1.0/.docs/technical/backend/packages/voice-and-assistant.md +124 -0
  117. swe_mux-0.1.0/.docs/technical/backend/packages.md +61 -0
  118. swe_mux-0.1.0/.docs/technical/backend/sqlite.md +394 -0
  119. swe_mux-0.1.0/.docs/technical/frontend/packages/actions-and-clipboard.md +227 -0
  120. swe_mux-0.1.0/.docs/technical/frontend/packages/agent-inspection.md +88 -0
  121. swe_mux-0.1.0/.docs/technical/frontend/packages/composition.md +168 -0
  122. swe_mux-0.1.0/.docs/technical/frontend/packages/git-and-history.md +247 -0
  123. swe_mux-0.1.0/.docs/technical/frontend/packages/layout-and-chrome.md +192 -0
  124. swe_mux-0.1.0/.docs/technical/frontend/packages/metering.md +79 -0
  125. swe_mux-0.1.0/.docs/technical/frontend/packages/notes-and-files.md +119 -0
  126. swe_mux-0.1.0/.docs/technical/frontend/packages/queue-and-alerts.md +103 -0
  127. swe_mux-0.1.0/.docs/technical/frontend/packages/settings-and-gates.md +194 -0
  128. swe_mux-0.1.0/.docs/technical/frontend/packages/sidebar-and-projects.md +136 -0
  129. swe_mux-0.1.0/.docs/technical/frontend/packages/terminal.md +154 -0
  130. swe_mux-0.1.0/.docs/technical/frontend/packages/voice-and-assistant.md +131 -0
  131. swe_mux-0.1.0/.docs/technical/frontend/packages.md +99 -0
  132. swe_mux-0.1.0/.docs/technical/frontend/workspace-state.md +402 -0
  133. swe_mux-0.1.0/.gitattributes +54 -0
  134. swe_mux-0.1.0/.githooks/pre-commit +3 -0
  135. swe_mux-0.1.0/.githooks/pre-push +13 -0
  136. swe_mux-0.1.0/.github/DISCUSSION_TEMPLATE/ideas.yml +117 -0
  137. swe_mux-0.1.0/.github/workflows/ci.yml +322 -0
  138. swe_mux-0.1.0/.github/workflows/ideas.yml +93 -0
  139. swe_mux-0.1.0/.github/workflows/pages.yml +87 -0
  140. swe_mux-0.1.0/.github/workflows/release.yml +372 -0
  141. swe_mux-0.1.0/.gitignore +152 -0
  142. swe_mux-0.1.0/.worktree-setup +32 -0
  143. swe_mux-0.1.0/.worktree-verify +63 -0
  144. swe_mux-0.1.0/AGENTS.md +141 -0
  145. swe_mux-0.1.0/CHANGELOG.md +191 -0
  146. swe_mux-0.1.0/CLAUDE.md +338 -0
  147. swe_mux-0.1.0/CONTRIBUTING.md +146 -0
  148. swe_mux-0.1.0/LICENSE +202 -0
  149. swe_mux-0.1.0/NOTICE +27 -0
  150. swe_mux-0.1.0/PKG-INFO +199 -0
  151. swe_mux-0.1.0/README.md +145 -0
  152. swe_mux-0.1.0/RELEASING.md +206 -0
  153. swe_mux-0.1.0/SECURITY.md +146 -0
  154. swe_mux-0.1.0/THIRD-PARTY-NOTICES.md +293 -0
  155. swe_mux-0.1.0/TRADEMARK.md +49 -0
  156. swe_mux-0.1.0/frontend/...trashtsc-out.txt +2 -0
  157. swe_mux-0.1.0/frontend/action-editor-harness.html +3 -0
  158. swe_mux-0.1.0/frontend/automation-cost-harness.html +3 -0
  159. swe_mux-0.1.0/frontend/change-map-harness.html +3 -0
  160. swe_mux-0.1.0/frontend/command-rail-harness.html +3 -0
  161. swe_mux-0.1.0/frontend/drawer-surfaces-harness.html +3 -0
  162. swe_mux-0.1.0/frontend/dropdown-harness.html +3 -0
  163. swe_mux-0.1.0/frontend/files-tab-harness.html +3 -0
  164. swe_mux-0.1.0/frontend/git-diff-harness.html +3 -0
  165. swe_mux-0.1.0/frontend/git-land-harness.html +3 -0
  166. swe_mux-0.1.0/frontend/git-map-harness.html +3 -0
  167. swe_mux-0.1.0/frontend/git-map-range-harness.html +3 -0
  168. swe_mux-0.1.0/frontend/git-map-select-harness.html +3 -0
  169. swe_mux-0.1.0/frontend/git-row-layout-harness.html +3 -0
  170. swe_mux-0.1.0/frontend/git-setup-harness.html +3 -0
  171. swe_mux-0.1.0/frontend/grant-gate-harness.html +3 -0
  172. swe_mux-0.1.0/frontend/hidden-note-editor-harness.html +3 -0
  173. swe_mux-0.1.0/frontend/history-harness.html +3 -0
  174. swe_mux-0.1.0/frontend/index.html +26 -0
  175. swe_mux-0.1.0/frontend/jump-latest-harness.html +20 -0
  176. swe_mux-0.1.0/frontend/lazy-surfaces-harness.html +3 -0
  177. swe_mux-0.1.0/frontend/notes-tab-harness.html +3 -0
  178. swe_mux-0.1.0/frontend/package-lock.json +3073 -0
  179. swe_mux-0.1.0/frontend/package.json +69 -0
  180. swe_mux-0.1.0/frontend/palette-harness.html +3 -0
  181. swe_mux-0.1.0/frontend/pane-harness.html +3 -0
  182. swe_mux-0.1.0/frontend/playwright.renderer.config.ts +33 -0
  183. swe_mux-0.1.0/frontend/process-fleet-harness.html +3 -0
  184. swe_mux-0.1.0/frontend/processes-tab-harness.html +3 -0
  185. swe_mux-0.1.0/frontend/prompt-editor-harness.html +3 -0
  186. swe_mux-0.1.0/frontend/public/icons/apple-touch-icon.png +0 -0
  187. swe_mux-0.1.0/frontend/public/icons/icon-192.png +0 -0
  188. swe_mux-0.1.0/frontend/public/icons/icon-512.png +0 -0
  189. swe_mux-0.1.0/frontend/public/icons/icon-maskable-512.png +0 -0
  190. swe_mux-0.1.0/frontend/public/manifest.webmanifest +17 -0
  191. swe_mux-0.1.0/frontend/public/notification-sounds/LICENSE.orca.txt +24 -0
  192. swe_mux-0.1.0/frontend/public/notification-sounds/blip.mp3 +0 -0
  193. swe_mux-0.1.0/frontend/public/notification-sounds/blop.mp3 +0 -0
  194. swe_mux-0.1.0/frontend/public/notification-sounds/bong.mp3 +0 -0
  195. swe_mux-0.1.0/frontend/public/notification-sounds/ding.mp3 +0 -0
  196. swe_mux-0.1.0/frontend/public/notification-sounds/sonar.mp3 +0 -0
  197. swe_mux-0.1.0/frontend/public/notification-sounds/thump.mp3 +0 -0
  198. swe_mux-0.1.0/frontend/public/notification-sounds/two-tone.mp3 +0 -0
  199. swe_mux-0.1.0/frontend/public/sw.js +40 -0
  200. swe_mux-0.1.0/frontend/queue-readiness-harness.html +3 -0
  201. swe_mux-0.1.0/frontend/quota-grid-harness.html +3 -0
  202. swe_mux-0.1.0/frontend/rail-dropup-harness.html +3 -0
  203. swe_mux-0.1.0/frontend/rail-overflow-harness.html +3 -0
  204. swe_mux-0.1.0/frontend/redeploy-chip-harness.html +3 -0
  205. swe_mux-0.1.0/frontend/renderer-harness.html +20 -0
  206. swe_mux-0.1.0/frontend/resource-layout-harness.html +3 -0
  207. swe_mux-0.1.0/frontend/resources-harness.html +3 -0
  208. swe_mux-0.1.0/frontend/scan-timeline-harness.html +3 -0
  209. swe_mux-0.1.0/frontend/schedule-harness.html +3 -0
  210. swe_mux-0.1.0/frontend/scripts/compress-static.mjs +52 -0
  211. swe_mux-0.1.0/frontend/scripts/patch-xterm-requestmode.mjs +52 -0
  212. swe_mux-0.1.0/frontend/scripts/patch-xterm-webgl.mjs +67 -0
  213. swe_mux-0.1.0/frontend/scripts/smart-turn-bench.mts +161 -0
  214. swe_mux-0.1.0/frontend/scripts/verify-acceptance.mjs +107 -0
  215. swe_mux-0.1.0/frontend/scripts/verify-bundle.mjs +44 -0
  216. swe_mux-0.1.0/frontend/session-row-harness.html +3 -0
  217. swe_mux-0.1.0/frontend/setting-reveal-harness.html +3 -0
  218. swe_mux-0.1.0/frontend/settings-harness.html +3 -0
  219. swe_mux-0.1.0/frontend/sidebar-groups-harness.html +3 -0
  220. swe_mux-0.1.0/frontend/smart-turn-lab.html +26 -0
  221. swe_mux-0.1.0/frontend/src/ActionEditorModal.tsx +28 -0
  222. swe_mux-0.1.0/frontend/src/ActionsTab.tsx +169 -0
  223. swe_mux-0.1.0/frontend/src/AgentContextTab.tsx +604 -0
  224. swe_mux-0.1.0/frontend/src/AgentEnvironmentTab.tsx +381 -0
  225. swe_mux-0.1.0/frontend/src/App.tsx +8213 -0
  226. swe_mux-0.1.0/frontend/src/ApprovalChip.tsx +257 -0
  227. swe_mux-0.1.0/frontend/src/AssistantPanel.tsx +446 -0
  228. swe_mux-0.1.0/frontend/src/AttentionInbox.tsx +146 -0
  229. swe_mux-0.1.0/frontend/src/AutomationDashboard.tsx +236 -0
  230. swe_mux-0.1.0/frontend/src/AutomationMatrix.tsx +328 -0
  231. swe_mux-0.1.0/frontend/src/AutomationPolicyView.tsx +109 -0
  232. swe_mux-0.1.0/frontend/src/AutomationSpendView.tsx +152 -0
  233. swe_mux-0.1.0/frontend/src/BranchPicker.tsx +175 -0
  234. swe_mux-0.1.0/frontend/src/BudgetControl.tsx +146 -0
  235. swe_mux-0.1.0/frontend/src/ChangeMapPane.tsx +583 -0
  236. swe_mux-0.1.0/frontend/src/ClipboardDropup.tsx +90 -0
  237. swe_mux-0.1.0/frontend/src/ClipboardPanel.tsx +268 -0
  238. swe_mux-0.1.0/frontend/src/CodeEditor.tsx +184 -0
  239. swe_mux-0.1.0/frontend/src/ConnectPhone.tsx +48 -0
  240. swe_mux-0.1.0/frontend/src/ContinuityBanner.tsx +15 -0
  241. swe_mux-0.1.0/frontend/src/ConversationControl.tsx +1470 -0
  242. swe_mux-0.1.0/frontend/src/DelimitedTextViewer.tsx +80 -0
  243. swe_mux-0.1.0/frontend/src/DirectoryPicker.tsx +75 -0
  244. swe_mux-0.1.0/frontend/src/DrawerSegmentControl.tsx +57 -0
  245. swe_mux-0.1.0/frontend/src/Dropdown.tsx +412 -0
  246. swe_mux-0.1.0/frontend/src/EdgeTtsSettings.tsx +145 -0
  247. swe_mux-0.1.0/frontend/src/EndedPaneBanner.tsx +51 -0
  248. swe_mux-0.1.0/frontend/src/FindingsPane.tsx +271 -0
  249. swe_mux-0.1.0/frontend/src/FleetActivityView.tsx +104 -0
  250. swe_mux-0.1.0/frontend/src/FleetQueue.tsx +403 -0
  251. swe_mux-0.1.0/frontend/src/GitDiffView.tsx +70 -0
  252. swe_mux-0.1.0/frontend/src/GitFileRow.tsx +66 -0
  253. swe_mux-0.1.0/frontend/src/GitLandBar.tsx +622 -0
  254. swe_mux-0.1.0/frontend/src/GitLandRow.tsx +172 -0
  255. swe_mux-0.1.0/frontend/src/GitReviewModal.tsx +169 -0
  256. swe_mux-0.1.0/frontend/src/GitSessionLinks.tsx +106 -0
  257. swe_mux-0.1.0/frontend/src/GitTab.tsx +1035 -0
  258. swe_mux-0.1.0/frontend/src/GrantGate.tsx +263 -0
  259. swe_mux-0.1.0/frontend/src/GuidedTutorial.tsx +184 -0
  260. swe_mux-0.1.0/frontend/src/HarnessSetup.tsx +117 -0
  261. swe_mux-0.1.0/frontend/src/HistoryBrowser.tsx +438 -0
  262. swe_mux-0.1.0/frontend/src/ImageViewer.tsx +59 -0
  263. swe_mux-0.1.0/frontend/src/InteractionHud.tsx +62 -0
  264. swe_mux-0.1.0/frontend/src/LazyChangeMap.tsx +33 -0
  265. swe_mux-0.1.0/frontend/src/LazyCodeEditor.tsx +32 -0
  266. swe_mux-0.1.0/frontend/src/LazyGitDiff.tsx +16 -0
  267. swe_mux-0.1.0/frontend/src/MenuGroup.tsx +124 -0
  268. swe_mux-0.1.0/frontend/src/ModelName.tsx +14 -0
  269. swe_mux-0.1.0/frontend/src/ModelPicker.tsx +194 -0
  270. swe_mux-0.1.0/frontend/src/ModelRoutingSummary.tsx +95 -0
  271. swe_mux-0.1.0/frontend/src/NetworkUsageModal.tsx +109 -0
  272. swe_mux-0.1.0/frontend/src/NotesTab.tsx +498 -0
  273. swe_mux-0.1.0/frontend/src/NotificationPushSettings.tsx +199 -0
  274. swe_mux-0.1.0/frontend/src/NotificationSoundSettings.tsx +3 -0
  275. swe_mux-0.1.0/frontend/src/Notifications.tsx +173 -0
  276. swe_mux-0.1.0/frontend/src/Observations.tsx +162 -0
  277. swe_mux-0.1.0/frontend/src/PreviewPane.tsx +164 -0
  278. swe_mux-0.1.0/frontend/src/ProcessFleetView.tsx +345 -0
  279. swe_mux-0.1.0/frontend/src/ProcessesTab.tsx +71 -0
  280. swe_mux-0.1.0/frontend/src/ProjectContextEditor.tsx +89 -0
  281. swe_mux-0.1.0/frontend/src/ProjectNoteEditor.tsx +508 -0
  282. swe_mux-0.1.0/frontend/src/ProjectResource.tsx +1587 -0
  283. swe_mux-0.1.0/frontend/src/ProjectRunMenu.tsx +327 -0
  284. swe_mux-0.1.0/frontend/src/ProjectsManager.tsx +440 -0
  285. swe_mux-0.1.0/frontend/src/PromptLibrary.tsx +212 -0
  286. swe_mux-0.1.0/frontend/src/PromptTemplateEditor.tsx +298 -0
  287. swe_mux-0.1.0/frontend/src/PromptsDropup.tsx +112 -0
  288. swe_mux-0.1.0/frontend/src/PromptsTab.tsx +393 -0
  289. swe_mux-0.1.0/frontend/src/ProviderAccounts.tsx +248 -0
  290. swe_mux-0.1.0/frontend/src/QueuePane.tsx +972 -0
  291. swe_mux-0.1.0/frontend/src/QuotaAnalytics.tsx +212 -0
  292. swe_mux-0.1.0/frontend/src/RailDropup.tsx +137 -0
  293. swe_mux-0.1.0/frontend/src/RailEditor.tsx +896 -0
  294. swe_mux-0.1.0/frontend/src/RailOverflowPopover.tsx +118 -0
  295. swe_mux-0.1.0/frontend/src/RailPad.tsx +652 -0
  296. swe_mux-0.1.0/frontend/src/RailRepeatKey.tsx +107 -0
  297. swe_mux-0.1.0/frontend/src/RailScroller.tsx +240 -0
  298. swe_mux-0.1.0/frontend/src/RailStrip.tsx +70 -0
  299. swe_mux-0.1.0/frontend/src/RedeployChip.tsx +66 -0
  300. swe_mux-0.1.0/frontend/src/ResourceUsage.tsx +128 -0
  301. swe_mux-0.1.0/frontend/src/ResourcesModal.tsx +123 -0
  302. swe_mux-0.1.0/frontend/src/ScanSpendStatus.tsx +41 -0
  303. swe_mux-0.1.0/frontend/src/ScanTimelineTab.tsx +316 -0
  304. swe_mux-0.1.0/frontend/src/ScheduleTab.tsx +617 -0
  305. swe_mux-0.1.0/frontend/src/SendToAgentPicker.tsx +326 -0
  306. swe_mux-0.1.0/frontend/src/SessionRowBody.tsx +166 -0
  307. swe_mux-0.1.0/frontend/src/SessionRowLive.tsx +57 -0
  308. swe_mux-0.1.0/frontend/src/SessionRowSettings.tsx +393 -0
  309. swe_mux-0.1.0/frontend/src/SettingLink.tsx +37 -0
  310. swe_mux-0.1.0/frontend/src/Settings.tsx +2640 -0
  311. swe_mux-0.1.0/frontend/src/SkillsDropup.tsx +111 -0
  312. swe_mux-0.1.0/frontend/src/StateIndicator.tsx +78 -0
  313. swe_mux-0.1.0/frontend/src/StorageUsageModal.tsx +114 -0
  314. swe_mux-0.1.0/frontend/src/TerminalDraftComposer.tsx +65 -0
  315. swe_mux-0.1.0/frontend/src/TerminalPane.tsx +4074 -0
  316. swe_mux-0.1.0/frontend/src/ThemePicker.tsx +123 -0
  317. swe_mux-0.1.0/frontend/src/TranscriptTab.tsx +739 -0
  318. swe_mux-0.1.0/frontend/src/TranscriptToolCalls.tsx +16 -0
  319. swe_mux-0.1.0/frontend/src/UpdateBanner.tsx +65 -0
  320. swe_mux-0.1.0/frontend/src/UsageDashboardView.tsx +222 -0
  321. swe_mux-0.1.0/frontend/src/UsageModal.tsx +126 -0
  322. swe_mux-0.1.0/frontend/src/UsageModelBreakdown.tsx +95 -0
  323. swe_mux-0.1.0/frontend/src/UsageOverview.tsx +128 -0
  324. swe_mux-0.1.0/frontend/src/UtilityDrawer.tsx +848 -0
  325. swe_mux-0.1.0/frontend/src/VoiceCommandsButton.tsx +48 -0
  326. swe_mux-0.1.0/frontend/src/VoiceLatencyReport.tsx +55 -0
  327. swe_mux-0.1.0/frontend/src/VoiceReadTab.tsx +330 -0
  328. swe_mux-0.1.0/frontend/src/WakeWordTester.tsx +151 -0
  329. swe_mux-0.1.0/frontend/src/WorkloadTelemetry.tsx +72 -0
  330. swe_mux-0.1.0/frontend/src/WslBridgePanel.tsx +72 -0
  331. swe_mux-0.1.0/frontend/src/agentContext.ts +112 -0
  332. swe_mux-0.1.0/frontend/src/agentEnvironment.ts +204 -0
  333. swe_mux-0.1.0/frontend/src/agentTargets.ts +77 -0
  334. swe_mux-0.1.0/frontend/src/alertPrefs.ts +79 -0
  335. swe_mux-0.1.0/frontend/src/api.ts +88 -0
  336. swe_mux-0.1.0/frontend/src/approvals.ts +139 -0
  337. swe_mux-0.1.0/frontend/src/assistant.ts +465 -0
  338. swe_mux-0.1.0/frontend/src/assistantSpeech.ts +285 -0
  339. swe_mux-0.1.0/frontend/src/attention.ts +92 -0
  340. swe_mux-0.1.0/frontend/src/audioFrames.ts +113 -0
  341. swe_mux-0.1.0/frontend/src/automationCost.ts +306 -0
  342. swe_mux-0.1.0/frontend/src/branchPoints.ts +148 -0
  343. swe_mux-0.1.0/frontend/src/branchSeed.ts +52 -0
  344. swe_mux-0.1.0/frontend/src/changeMap.ts +534 -0
  345. swe_mux-0.1.0/frontend/src/changeMapLayout.worker.ts +72 -0
  346. swe_mux-0.1.0/frontend/src/clipboardHistory.ts +317 -0
  347. swe_mux-0.1.0/frontend/src/codeLanguage.ts +192 -0
  348. swe_mux-0.1.0/frontend/src/codeTheme.ts +136 -0
  349. swe_mux-0.1.0/frontend/src/coldSession.ts +87 -0
  350. swe_mux-0.1.0/frontend/src/commandLine.ts +81 -0
  351. swe_mux-0.1.0/frontend/src/commandRail.ts +1486 -0
  352. swe_mux-0.1.0/frontend/src/commands.ts +83 -0
  353. swe_mux-0.1.0/frontend/src/composerInsertion.ts +80 -0
  354. swe_mux-0.1.0/frontend/src/composerText.ts +139 -0
  355. swe_mux-0.1.0/frontend/src/configurator.ts +123 -0
  356. swe_mux-0.1.0/frontend/src/consoleContention.ts +56 -0
  357. swe_mux-0.1.0/frontend/src/continuityStatus.ts +24 -0
  358. swe_mux-0.1.0/frontend/src/conversation.ts +789 -0
  359. swe_mux-0.1.0/frontend/src/conversationDraft.ts +47 -0
  360. swe_mux-0.1.0/frontend/src/conversationTarget.ts +83 -0
  361. swe_mux-0.1.0/frontend/src/delimitedText.ts +161 -0
  362. swe_mux-0.1.0/frontend/src/deliveryReadiness.ts +252 -0
  363. swe_mux-0.1.0/frontend/src/devicePresence.ts +147 -0
  364. swe_mux-0.1.0/frontend/src/deviceSettings.ts +177 -0
  365. swe_mux-0.1.0/frontend/src/dismissStack.ts +180 -0
  366. swe_mux-0.1.0/frontend/src/dotShapes.ts +59 -0
  367. swe_mux-0.1.0/frontend/src/dragReorder.ts +112 -0
  368. swe_mux-0.1.0/frontend/src/drawerLayout.ts +673 -0
  369. swe_mux-0.1.0/frontend/src/drawerNotes.ts +108 -0
  370. swe_mux-0.1.0/frontend/src/drawerSegments.ts +248 -0
  371. swe_mux-0.1.0/frontend/src/drawerTabOrder.ts +43 -0
  372. swe_mux-0.1.0/frontend/src/drawerTabs.ts +137 -0
  373. swe_mux-0.1.0/frontend/src/drawerTransient.ts +24 -0
  374. swe_mux-0.1.0/frontend/src/drawerVisibility.ts +119 -0
  375. swe_mux-0.1.0/frontend/src/dropdownOptions.ts +192 -0
  376. swe_mux-0.1.0/frontend/src/dropdownPlacement.ts +141 -0
  377. swe_mux-0.1.0/frontend/src/earcons.ts +49 -0
  378. swe_mux-0.1.0/frontend/src/editorText.ts +3 -0
  379. swe_mux-0.1.0/frontend/src/eventRefresh.ts +50 -0
  380. swe_mux-0.1.0/frontend/src/fileClipboard.ts +81 -0
  381. swe_mux-0.1.0/frontend/src/fileSearchLimit.ts +47 -0
  382. swe_mux-0.1.0/frontend/src/fleetCommands.ts +115 -0
  383. swe_mux-0.1.0/frontend/src/fleetLayouts.ts +118 -0
  384. swe_mux-0.1.0/frontend/src/fleetRefresh.ts +206 -0
  385. swe_mux-0.1.0/frontend/src/fleetStatus.ts +96 -0
  386. swe_mux-0.1.0/frontend/src/fuzzyText.ts +69 -0
  387. swe_mux-0.1.0/frontend/src/gitLand.ts +770 -0
  388. swe_mux-0.1.0/frontend/src/gitReview.ts +172 -0
  389. swe_mux-0.1.0/frontend/src/gitSetup.ts +25 -0
  390. swe_mux-0.1.0/frontend/src/gitTabCache.ts +67 -0
  391. swe_mux-0.1.0/frontend/src/gitWorktrees.ts +1003 -0
  392. swe_mux-0.1.0/frontend/src/grants.ts +243 -0
  393. swe_mux-0.1.0/frontend/src/harnessIcons.tsx +78 -0
  394. swe_mux-0.1.0/frontend/src/harnessRegistry.ts +365 -0
  395. swe_mux-0.1.0/frontend/src/harnessRegistrySeed.ts +240 -0
  396. swe_mux-0.1.0/frontend/src/historyDetail.ts +133 -0
  397. swe_mux-0.1.0/frontend/src/humanPresence.ts +46 -0
  398. swe_mux-0.1.0/frontend/src/inputBackend.ts +53 -0
  399. swe_mux-0.1.0/frontend/src/inputOwnership.ts +182 -0
  400. swe_mux-0.1.0/frontend/src/insertTarget.ts +152 -0
  401. swe_mux-0.1.0/frontend/src/installSwitches.ts +56 -0
  402. swe_mux-0.1.0/frontend/src/keybindingsStore.ts +21 -0
  403. swe_mux-0.1.0/frontend/src/keyboardReserve.ts +161 -0
  404. swe_mux-0.1.0/frontend/src/keys.ts +16 -0
  405. swe_mux-0.1.0/frontend/src/kokoroVoices.ts +36 -0
  406. swe_mux-0.1.0/frontend/src/landSetupPrompt.ts +84 -0
  407. swe_mux-0.1.0/frontend/src/landState.ts +134 -0
  408. swe_mux-0.1.0/frontend/src/layout.ts +462 -0
  409. swe_mux-0.1.0/frontend/src/layoutBox.ts +86 -0
  410. swe_mux-0.1.0/frontend/src/layoutWriter.ts +102 -0
  411. swe_mux-0.1.0/frontend/src/lineageView.ts +93 -0
  412. swe_mux-0.1.0/frontend/src/liveness.ts +175 -0
  413. swe_mux-0.1.0/frontend/src/llmProvider.ts +191 -0
  414. swe_mux-0.1.0/frontend/src/main.tsx +22 -0
  415. swe_mux-0.1.0/frontend/src/menuPosition.ts +55 -0
  416. swe_mux-0.1.0/frontend/src/mobileGestures.ts +496 -0
  417. swe_mux-0.1.0/frontend/src/mobileInput.ts +184 -0
  418. swe_mux-0.1.0/frontend/src/mobileKeyboard.ts +467 -0
  419. swe_mux-0.1.0/frontend/src/mobileTerminalDraft.ts +139 -0
  420. swe_mux-0.1.0/frontend/src/mobileTerminalIme.ts +33 -0
  421. swe_mux-0.1.0/frontend/src/mobileVoice.ts +30 -0
  422. swe_mux-0.1.0/frontend/src/mobileWorkspace.ts +45 -0
  423. swe_mux-0.1.0/frontend/src/modalFocus.ts +73 -0
  424. swe_mux-0.1.0/frontend/src/modelDisplay.ts +58 -0
  425. swe_mux-0.1.0/frontend/src/modelFilter.ts +49 -0
  426. swe_mux-0.1.0/frontend/src/modelPricing.ts +166 -0
  427. swe_mux-0.1.0/frontend/src/modelRouting.ts +171 -0
  428. swe_mux-0.1.0/frontend/src/networkUsage.ts +70 -0
  429. swe_mux-0.1.0/frontend/src/noteEditGuard.ts +206 -0
  430. swe_mux-0.1.0/frontend/src/noteEditorSettings.ts +243 -0
  431. swe_mux-0.1.0/frontend/src/noteFind.ts +87 -0
  432. swe_mux-0.1.0/frontend/src/noteOutline.ts +160 -0
  433. swe_mux-0.1.0/frontend/src/noteRailIcons.ts +44 -0
  434. swe_mux-0.1.0/frontend/src/noteSaveQueue.ts +0 -0
  435. swe_mux-0.1.0/frontend/src/noteScroll.ts +123 -0
  436. swe_mux-0.1.0/frontend/src/noteSelection.ts +171 -0
  437. swe_mux-0.1.0/frontend/src/noteTabs.ts +69 -0
  438. swe_mux-0.1.0/frontend/src/notificationPrefs.ts +66 -0
  439. swe_mux-0.1.0/frontend/src/operationalTelemetry.ts +111 -0
  440. swe_mux-0.1.0/frontend/src/pasteTrace.ts +150 -0
  441. swe_mux-0.1.0/frontend/src/pathNames.ts +8 -0
  442. swe_mux-0.1.0/frontend/src/pendingInput.ts +28 -0
  443. swe_mux-0.1.0/frontend/src/pendingSession.ts +52 -0
  444. swe_mux-0.1.0/frontend/src/pointerDragClaim.ts +55 -0
  445. swe_mux-0.1.0/frontend/src/previewCapture.ts +46 -0
  446. swe_mux-0.1.0/frontend/src/previewLinks.ts +12 -0
  447. swe_mux-0.1.0/frontend/src/processFleet.ts +230 -0
  448. swe_mux-0.1.0/frontend/src/processFleetFeed.ts +196 -0
  449. swe_mux-0.1.0/frontend/src/processRows.ts +215 -0
  450. swe_mux-0.1.0/frontend/src/processTree.ts +37 -0
  451. swe_mux-0.1.0/frontend/src/projectAutomations.ts +118 -0
  452. swe_mux-0.1.0/frontend/src/projectConfig.ts +199 -0
  453. swe_mux-0.1.0/frontend/src/projectConfigState.ts +144 -0
  454. swe_mux-0.1.0/frontend/src/projectCreate.ts +154 -0
  455. swe_mux-0.1.0/frontend/src/projectGroups.ts +43 -0
  456. swe_mux-0.1.0/frontend/src/projectOptions.ts +40 -0
  457. swe_mux-0.1.0/frontend/src/projectRecency.ts +15 -0
  458. swe_mux-0.1.0/frontend/src/projectResourceCreate.ts +7 -0
  459. swe_mux-0.1.0/frontend/src/projectSort.ts +337 -0
  460. swe_mux-0.1.0/frontend/src/promptLibraryEvents.ts +14 -0
  461. swe_mux-0.1.0/frontend/src/promptRail.ts +148 -0
  462. swe_mux-0.1.0/frontend/src/promptTemplates.ts +61 -0
  463. swe_mux-0.1.0/frontend/src/promptTitles.ts +98 -0
  464. swe_mux-0.1.0/frontend/src/providerAccountDisplay.ts +104 -0
  465. swe_mux-0.1.0/frontend/src/push.ts +110 -0
  466. swe_mux-0.1.0/frontend/src/queueApi.ts +456 -0
  467. swe_mux-0.1.0/frontend/src/railClearance.ts +108 -0
  468. swe_mux-0.1.0/frontend/src/railDensity.ts +79 -0
  469. swe_mux-0.1.0/frontend/src/railDrag.ts +325 -0
  470. swe_mux-0.1.0/frontend/src/railIcons.tsx +540 -0
  471. swe_mux-0.1.0/frontend/src/railKeyRepeat.ts +131 -0
  472. swe_mux-0.1.0/frontend/src/railLayout.ts +372 -0
  473. swe_mux-0.1.0/frontend/src/railModifiers.ts +175 -0
  474. swe_mux-0.1.0/frontend/src/railOverflow.ts +165 -0
  475. swe_mux-0.1.0/frontend/src/railOverlayPlacement.ts +97 -0
  476. swe_mux-0.1.0/frontend/src/railPadGesture.ts +704 -0
  477. swe_mux-0.1.0/frontend/src/railReattach.ts +321 -0
  478. swe_mux-0.1.0/frontend/src/railScope.ts +436 -0
  479. swe_mux-0.1.0/frontend/src/railVoice.ts +85 -0
  480. swe_mux-0.1.0/frontend/src/recentFiles.ts +57 -0
  481. swe_mux-0.1.0/frontend/src/redeployProgress.ts +380 -0
  482. swe_mux-0.1.0/frontend/src/remoteConnection.tsx +104 -0
  483. swe_mux-0.1.0/frontend/src/resourceSaveIndicator.ts +25 -0
  484. swe_mux-0.1.0/frontend/src/resourceTooling.ts +79 -0
  485. swe_mux-0.1.0/frontend/src/resourceTotals.ts +66 -0
  486. swe_mux-0.1.0/frontend/src/resumeCommand.ts +36 -0
  487. swe_mux-0.1.0/frontend/src/schedules.ts +470 -0
  488. swe_mux-0.1.0/frontend/src/serverClock.ts +59 -0
  489. swe_mux-0.1.0/frontend/src/sessionAttention.ts +257 -0
  490. swe_mux-0.1.0/frontend/src/sessionFocusHistory.ts +69 -0
  491. swe_mux-0.1.0/frontend/src/sessionJoin.ts +116 -0
  492. swe_mux-0.1.0/frontend/src/sessionKills.ts +166 -0
  493. swe_mux-0.1.0/frontend/src/sessionNames.ts +37 -0
  494. swe_mux-0.1.0/frontend/src/sessionProcesses.ts +42 -0
  495. swe_mux-0.1.0/frontend/src/sessionRowConfig.ts +565 -0
  496. swe_mux-0.1.0/frontend/src/sessionRowFields.ts +1085 -0
  497. swe_mux-0.1.0/frontend/src/sessionRowPrefs.ts +224 -0
  498. swe_mux-0.1.0/frontend/src/sessionSnapshots.ts +82 -0
  499. swe_mux-0.1.0/frontend/src/sessionSounds.ts +132 -0
  500. swe_mux-0.1.0/frontend/src/sessionStatus.ts +200 -0
  501. swe_mux-0.1.0/frontend/src/settingReveal.ts +180 -0
  502. swe_mux-0.1.0/frontend/src/settingTargets.ts +263 -0
  503. swe_mux-0.1.0/frontend/src/settingsDraft.ts +37 -0
  504. swe_mux-0.1.0/frontend/src/settingsSave.ts +58 -0
  505. swe_mux-0.1.0/frontend/src/settingsSearch.ts +273 -0
  506. swe_mux-0.1.0/frontend/src/settingsTabs.ts +215 -0
  507. swe_mux-0.1.0/frontend/src/sidebarProjects.ts +94 -0
  508. swe_mux-0.1.0/frontend/src/sidebarResize.ts +39 -0
  509. swe_mux-0.1.0/frontend/src/sidebarSearch.ts +304 -0
  510. swe_mux-0.1.0/frontend/src/sileroVad.ts +109 -0
  511. swe_mux-0.1.0/frontend/src/skills.ts +136 -0
  512. swe_mux-0.1.0/frontend/src/smartTurn.ts +133 -0
  513. swe_mux-0.1.0/frontend/src/smartTurnFeatures.ts +307 -0
  514. swe_mux-0.1.0/frontend/src/smartTurnLab.tsx +335 -0
  515. swe_mux-0.1.0/frontend/src/speechGate.ts +166 -0
  516. swe_mux-0.1.0/frontend/src/spokenListContext.ts +53 -0
  517. swe_mux-0.1.0/frontend/src/staticPreview.ts +21 -0
  518. swe_mux-0.1.0/frontend/src/style.css +5619 -0
  519. swe_mux-0.1.0/frontend/src/systemBack.ts +113 -0
  520. swe_mux-0.1.0/frontend/src/terminalActions.ts +124 -0
  521. swe_mux-0.1.0/frontend/src/terminalAttachments.ts +38 -0
  522. swe_mux-0.1.0/frontend/src/terminalCaretPlacement.ts +687 -0
  523. swe_mux-0.1.0/frontend/src/terminalClipboard.ts +168 -0
  524. swe_mux-0.1.0/frontend/src/terminalHealth.ts +144 -0
  525. swe_mux-0.1.0/frontend/src/terminalInputDiagnostics.ts +248 -0
  526. swe_mux-0.1.0/frontend/src/terminalKeys.ts +46 -0
  527. swe_mux-0.1.0/frontend/src/terminalLetterbox.ts +81 -0
  528. swe_mux-0.1.0/frontend/src/terminalPaneMemo.ts +83 -0
  529. swe_mux-0.1.0/frontend/src/terminalProtocol.ts +39 -0
  530. swe_mux-0.1.0/frontend/src/terminalRenderDiagnostics.ts +67 -0
  531. swe_mux-0.1.0/frontend/src/terminalRenderPause.ts +79 -0
  532. swe_mux-0.1.0/frontend/src/terminalRenderer.ts +89 -0
  533. swe_mux-0.1.0/frontend/src/terminalViewport.ts +637 -0
  534. swe_mux-0.1.0/frontend/src/terminalWheelPacing.ts +140 -0
  535. swe_mux-0.1.0/frontend/src/theme.ts +95 -0
  536. swe_mux-0.1.0/frontend/src/transcriptAudio.ts +115 -0
  537. swe_mux-0.1.0/frontend/src/transcriptView.ts +387 -0
  538. swe_mux-0.1.0/frontend/src/tutorial.ts +100 -0
  539. swe_mux-0.1.0/frontend/src/types.ts +458 -0
  540. swe_mux-0.1.0/frontend/src/uiBuild.ts +24 -0
  541. swe_mux-0.1.0/frontend/src/uiCommand.ts +58 -0
  542. swe_mux-0.1.0/frontend/src/uiScale.ts +186 -0
  543. swe_mux-0.1.0/frontend/src/updateCheck.ts +134 -0
  544. swe_mux-0.1.0/frontend/src/usageAnalytics.ts +192 -0
  545. swe_mux-0.1.0/frontend/src/usagePots.ts +102 -0
  546. swe_mux-0.1.0/frontend/src/usageSegments.ts +60 -0
  547. swe_mux-0.1.0/frontend/src/utteranceCompleteness.ts +314 -0
  548. swe_mux-0.1.0/frontend/src/utteranceDeferral.ts +287 -0
  549. swe_mux-0.1.0/frontend/src/viewHistory.ts +195 -0
  550. swe_mux-0.1.0/frontend/src/viewState.ts +117 -0
  551. swe_mux-0.1.0/frontend/src/vite-env.d.ts +1 -0
  552. swe_mux-0.1.0/frontend/src/voice.ts +746 -0
  553. swe_mux-0.1.0/frontend/src/voiceCaptureWorklet.ts +65 -0
  554. swe_mux-0.1.0/frontend/src/voiceCommandReference.ts +141 -0
  555. swe_mux-0.1.0/frontend/src/voiceComms.ts +13 -0
  556. swe_mux-0.1.0/frontend/src/voiceConversationHistory.ts +72 -0
  557. swe_mux-0.1.0/frontend/src/voiceDock.ts +190 -0
  558. swe_mux-0.1.0/frontend/src/voiceFuzzy.ts +108 -0
  559. swe_mux-0.1.0/frontend/src/voiceGroups.ts +111 -0
  560. swe_mux-0.1.0/frontend/src/voiceIntents.ts +94 -0
  561. swe_mux-0.1.0/frontend/src/voiceLatency.ts +158 -0
  562. swe_mux-0.1.0/frontend/src/voiceLaunch.ts +36 -0
  563. swe_mux-0.1.0/frontend/src/voiceMode.ts +43 -0
  564. swe_mux-0.1.0/frontend/src/voiceNavigation.ts +67 -0
  565. swe_mux-0.1.0/frontend/src/voiceQueries.ts +309 -0
  566. swe_mux-0.1.0/frontend/src/wakeWordTest.ts +94 -0
  567. swe_mux-0.1.0/frontend/src/warmPanes.ts +79 -0
  568. swe_mux-0.1.0/frontend/src/wheelScroll.ts +32 -0
  569. swe_mux-0.1.0/frontend/src/workspaceTabs.ts +15 -0
  570. swe_mux-0.1.0/frontend/src/worktreeLaunch.ts +30 -0
  571. swe_mux-0.1.0/frontend/src/worktreeRemoval.ts +199 -0
  572. swe_mux-0.1.0/frontend/src/worktreeSelection.ts +95 -0
  573. swe_mux-0.1.0/frontend/src/wslBridge.ts +78 -0
  574. swe_mux-0.1.0/frontend/test/actionsDrawer.test.ts +181 -0
  575. swe_mux-0.1.0/frontend/test/agentContext.test.ts +61 -0
  576. swe_mux-0.1.0/frontend/test/agentEnvironment.test.ts +106 -0
  577. swe_mux-0.1.0/frontend/test/agentTargets.test.ts +87 -0
  578. swe_mux-0.1.0/frontend/test/all.ts +214 -0
  579. swe_mux-0.1.0/frontend/test/approvals.test.ts +153 -0
  580. swe_mux-0.1.0/frontend/test/assistantConfirm.test.ts +77 -0
  581. swe_mux-0.1.0/frontend/test/assistantEvents.test.ts +146 -0
  582. swe_mux-0.1.0/frontend/test/assistantNewConversation.test.ts +166 -0
  583. swe_mux-0.1.0/frontend/test/assistantSpeech.test.ts +189 -0
  584. swe_mux-0.1.0/frontend/test/attention.test.ts +65 -0
  585. swe_mux-0.1.0/frontend/test/audioFrames.test.ts +70 -0
  586. swe_mux-0.1.0/frontend/test/automationCost.test.ts +194 -0
  587. swe_mux-0.1.0/frontend/test/branchPoints.test.ts +127 -0
  588. swe_mux-0.1.0/frontend/test/budgetControl.test.ts +82 -0
  589. swe_mux-0.1.0/frontend/test/bundleSplit.test.ts +130 -0
  590. swe_mux-0.1.0/frontend/test/changeMap.test.ts +326 -0
  591. swe_mux-0.1.0/frontend/test/clipboardHistory.test.ts +157 -0
  592. swe_mux-0.1.0/frontend/test/commandLine.test.ts +90 -0
  593. swe_mux-0.1.0/frontend/test/commandRail.test.ts +461 -0
  594. swe_mux-0.1.0/frontend/test/composerInsertion.test.ts +89 -0
  595. swe_mux-0.1.0/frontend/test/composerText.test.ts +176 -0
  596. swe_mux-0.1.0/frontend/test/configurator.test.ts +74 -0
  597. swe_mux-0.1.0/frontend/test/conversation.test.ts +200 -0
  598. swe_mux-0.1.0/frontend/test/conversationDraft.test.ts +66 -0
  599. swe_mux-0.1.0/frontend/test/conversationTarget.test.ts +103 -0
  600. swe_mux-0.1.0/frontend/test/conversationToggle.test.ts +115 -0
  601. swe_mux-0.1.0/frontend/test/delimitedText.test.ts +41 -0
  602. swe_mux-0.1.0/frontend/test/deliveryReadiness.test.ts +167 -0
  603. swe_mux-0.1.0/frontend/test/devicePresence.test.ts +58 -0
  604. swe_mux-0.1.0/frontend/test/directoryPicker.test.ts +15 -0
  605. swe_mux-0.1.0/frontend/test/dismissStack.test.ts +203 -0
  606. swe_mux-0.1.0/frontend/test/dragReorder.test.ts +114 -0
  607. swe_mux-0.1.0/frontend/test/drawerLayout.test.ts +277 -0
  608. swe_mux-0.1.0/frontend/test/drawerNotes.test.ts +79 -0
  609. swe_mux-0.1.0/frontend/test/drawerSegments.test.ts +233 -0
  610. swe_mux-0.1.0/frontend/test/drawerTabOrder.test.ts +73 -0
  611. swe_mux-0.1.0/frontend/test/drawerTabs.test.ts +175 -0
  612. swe_mux-0.1.0/frontend/test/drawerTransient.test.ts +29 -0
  613. swe_mux-0.1.0/frontend/test/drawerVisibility.test.ts +98 -0
  614. swe_mux-0.1.0/frontend/test/dropdown.test.ts +152 -0
  615. swe_mux-0.1.0/frontend/test/endedPaneBanner.test.ts +105 -0
  616. swe_mux-0.1.0/frontend/test/eventRefresh.test.ts +30 -0
  617. swe_mux-0.1.0/frontend/test/fileClipboard.test.ts +85 -0
  618. swe_mux-0.1.0/frontend/test/fileSearchLimit.test.ts +47 -0
  619. swe_mux-0.1.0/frontend/test/findings.test.ts +149 -0
  620. swe_mux-0.1.0/frontend/test/fleetCommands.test.ts +129 -0
  621. swe_mux-0.1.0/frontend/test/fleetLayouts.test.ts +171 -0
  622. swe_mux-0.1.0/frontend/test/fleetRefresh.test.ts +231 -0
  623. swe_mux-0.1.0/frontend/test/fleetStatus.test.ts +42 -0
  624. swe_mux-0.1.0/frontend/test/gitLand.test.ts +805 -0
  625. swe_mux-0.1.0/frontend/test/gitReview.test.ts +68 -0
  626. swe_mux-0.1.0/frontend/test/gitSetup.test.ts +15 -0
  627. swe_mux-0.1.0/frontend/test/gitTabCache.test.ts +70 -0
  628. swe_mux-0.1.0/frontend/test/gitWorktrees.test.ts +660 -0
  629. swe_mux-0.1.0/frontend/test/grants.test.ts +194 -0
  630. swe_mux-0.1.0/frontend/test/harnessRegistry.test.ts +240 -0
  631. swe_mux-0.1.0/frontend/test/historyBrowser.test.ts +147 -0
  632. swe_mux-0.1.0/frontend/test/inputBackend.test.ts +99 -0
  633. swe_mux-0.1.0/frontend/test/inputOwnership.test.ts +133 -0
  634. swe_mux-0.1.0/frontend/test/insertionRefusal.test.ts +33 -0
  635. swe_mux-0.1.0/frontend/test/keyboardReserve.test.ts +120 -0
  636. swe_mux-0.1.0/frontend/test/kokoroVoices.test.ts +18 -0
  637. swe_mux-0.1.0/frontend/test/layout.test.ts +281 -0
  638. swe_mux-0.1.0/frontend/test/layoutBox.test.ts +86 -0
  639. swe_mux-0.1.0/frontend/test/layoutWriter.test.ts +202 -0
  640. swe_mux-0.1.0/frontend/test/lineageView.test.ts +90 -0
  641. swe_mux-0.1.0/frontend/test/liveness.test.ts +303 -0
  642. swe_mux-0.1.0/frontend/test/llmProvider.test.ts +226 -0
  643. swe_mux-0.1.0/frontend/test/menuPosition.test.ts +109 -0
  644. swe_mux-0.1.0/frontend/test/mobileGestures.test.ts +446 -0
  645. swe_mux-0.1.0/frontend/test/mobileInput.test.ts +129 -0
  646. swe_mux-0.1.0/frontend/test/mobileKeyboard.test.ts +372 -0
  647. swe_mux-0.1.0/frontend/test/mobileTerminalDraft.test.ts +97 -0
  648. swe_mux-0.1.0/frontend/test/mobileTerminalIme.test.ts +33 -0
  649. swe_mux-0.1.0/frontend/test/mobileVoice.test.ts +14 -0
  650. swe_mux-0.1.0/frontend/test/mobileWorkspace.test.ts +55 -0
  651. swe_mux-0.1.0/frontend/test/modelDisplay.test.ts +54 -0
  652. swe_mux-0.1.0/frontend/test/modelPicker.test.ts +47 -0
  653. swe_mux-0.1.0/frontend/test/modelPricing.test.ts +108 -0
  654. swe_mux-0.1.0/frontend/test/modelRouting.test.ts +137 -0
  655. swe_mux-0.1.0/frontend/test/networkUsage.test.ts +39 -0
  656. swe_mux-0.1.0/frontend/test/noteEditGuard.test.ts +141 -0
  657. swe_mux-0.1.0/frontend/test/noteEditor.test.ts +535 -0
  658. swe_mux-0.1.0/frontend/test/noteEditorSettings.test.ts +118 -0
  659. swe_mux-0.1.0/frontend/test/noteFind.test.ts +86 -0
  660. swe_mux-0.1.0/frontend/test/noteOutline.test.ts +150 -0
  661. swe_mux-0.1.0/frontend/test/noteScroll.test.ts +153 -0
  662. swe_mux-0.1.0/frontend/test/noteSelection.test.ts +118 -0
  663. swe_mux-0.1.0/frontend/test/noteTabs.test.ts +54 -0
  664. swe_mux-0.1.0/frontend/test/notificationPrefs.test.ts +37 -0
  665. swe_mux-0.1.0/frontend/test/pasteTrace.test.ts +109 -0
  666. swe_mux-0.1.0/frontend/test/pendingInput.test.ts +36 -0
  667. swe_mux-0.1.0/frontend/test/pendingSession.test.ts +45 -0
  668. swe_mux-0.1.0/frontend/test/phase3Workflow.test.ts +90 -0
  669. swe_mux-0.1.0/frontend/test/pointerDragClaim.test.ts +46 -0
  670. swe_mux-0.1.0/frontend/test/previewCapture.test.ts +55 -0
  671. swe_mux-0.1.0/frontend/test/previewLinks.test.ts +10 -0
  672. swe_mux-0.1.0/frontend/test/processFleet.test.ts +160 -0
  673. swe_mux-0.1.0/frontend/test/processRows.test.ts +112 -0
  674. swe_mux-0.1.0/frontend/test/processTree.test.ts +26 -0
  675. swe_mux-0.1.0/frontend/test/projectConfig.test.ts +121 -0
  676. swe_mux-0.1.0/frontend/test/projectCreate.test.ts +102 -0
  677. swe_mux-0.1.0/frontend/test/projectGroups.test.ts +80 -0
  678. swe_mux-0.1.0/frontend/test/projectResourceCreate.test.ts +22 -0
  679. swe_mux-0.1.0/frontend/test/projectSort.test.ts +272 -0
  680. swe_mux-0.1.0/frontend/test/promptRail.test.ts +92 -0
  681. swe_mux-0.1.0/frontend/test/providerAccounts.test.ts +107 -0
  682. swe_mux-0.1.0/frontend/test/queueApi.test.ts +155 -0
  683. swe_mux-0.1.0/frontend/test/queuePane.test.ts +50 -0
  684. swe_mux-0.1.0/frontend/test/railClearance.test.ts +66 -0
  685. swe_mux-0.1.0/frontend/test/railDensity.test.ts +145 -0
  686. swe_mux-0.1.0/frontend/test/railGlassContrast.test.ts +136 -0
  687. swe_mux-0.1.0/frontend/test/railKeyRepeat.test.ts +149 -0
  688. swe_mux-0.1.0/frontend/test/railLayout.test.ts +249 -0
  689. swe_mux-0.1.0/frontend/test/railModifiers.test.ts +125 -0
  690. swe_mux-0.1.0/frontend/test/railOverflow.test.ts +284 -0
  691. swe_mux-0.1.0/frontend/test/railPadGesture.test.ts +911 -0
  692. swe_mux-0.1.0/frontend/test/railPadModel.test.ts +413 -0
  693. swe_mux-0.1.0/frontend/test/railScope.test.ts +412 -0
  694. swe_mux-0.1.0/frontend/test/railVoice.test.ts +79 -0
  695. swe_mux-0.1.0/frontend/test/randomId.test.ts +17 -0
  696. swe_mux-0.1.0/frontend/test/recentFiles.test.ts +51 -0
  697. swe_mux-0.1.0/frontend/test/redeployProgress.test.ts +300 -0
  698. swe_mux-0.1.0/frontend/test/renderer/action-editor-touch.spec.ts +131 -0
  699. swe_mux-0.1.0/frontend/test/renderer/action-editor.spec.ts +116 -0
  700. swe_mux-0.1.0/frontend/test/renderer/actionEditorHarness.tsx +43 -0
  701. swe_mux-0.1.0/frontend/test/renderer/automation-cost-layout.spec.ts +255 -0
  702. swe_mux-0.1.0/frontend/test/renderer/automationCostHarness.tsx +148 -0
  703. swe_mux-0.1.0/frontend/test/renderer/change-map-layout.spec.ts +322 -0
  704. swe_mux-0.1.0/frontend/test/renderer/changeMapHarness.tsx +154 -0
  705. swe_mux-0.1.0/frontend/test/renderer/command-rail-keys.spec.ts +129 -0
  706. swe_mux-0.1.0/frontend/test/renderer/command-rail-pad.spec.ts +773 -0
  707. swe_mux-0.1.0/frontend/test/renderer/commandRailHarness.tsx +222 -0
  708. swe_mux-0.1.0/frontend/test/renderer/decrqm.spec.ts +26 -0
  709. swe_mux-0.1.0/frontend/test/renderer/drawer-surfaces.spec.ts +116 -0
  710. swe_mux-0.1.0/frontend/test/renderer/drawerSurfacesHarness.tsx +143 -0
  711. swe_mux-0.1.0/frontend/test/renderer/dropdown.spec.ts +198 -0
  712. swe_mux-0.1.0/frontend/test/renderer/dropdown.ts +22 -0
  713. swe_mux-0.1.0/frontend/test/renderer/dropdownHarness.tsx +65 -0
  714. swe_mux-0.1.0/frontend/test/renderer/files-tab.spec.ts +138 -0
  715. swe_mux-0.1.0/frontend/test/renderer/filesTabHarness.tsx +127 -0
  716. swe_mux-0.1.0/frontend/test/renderer/git-diff-view.spec.ts +42 -0
  717. swe_mux-0.1.0/frontend/test/renderer/git-land.spec.ts +311 -0
  718. swe_mux-0.1.0/frontend/test/renderer/git-map-layout.spec.ts +136 -0
  719. swe_mux-0.1.0/frontend/test/renderer/git-map-range.spec.ts +126 -0
  720. swe_mux-0.1.0/frontend/test/renderer/git-map-select.spec.ts +94 -0
  721. swe_mux-0.1.0/frontend/test/renderer/git-row-layout.spec.ts +128 -0
  722. swe_mux-0.1.0/frontend/test/renderer/git-setup.spec.ts +39 -0
  723. swe_mux-0.1.0/frontend/test/renderer/gitDiffHarness.tsx +28 -0
  724. swe_mux-0.1.0/frontend/test/renderer/gitLandHarness.tsx +131 -0
  725. swe_mux-0.1.0/frontend/test/renderer/gitMapHarness.tsx +110 -0
  726. swe_mux-0.1.0/frontend/test/renderer/gitMapRangeHarness.tsx +91 -0
  727. swe_mux-0.1.0/frontend/test/renderer/gitMapSelectHarness.tsx +106 -0
  728. swe_mux-0.1.0/frontend/test/renderer/gitRowLayoutHarness.tsx +140 -0
  729. swe_mux-0.1.0/frontend/test/renderer/gitSetupHarness.tsx +65 -0
  730. swe_mux-0.1.0/frontend/test/renderer/grant-gate.spec.ts +84 -0
  731. swe_mux-0.1.0/frontend/test/renderer/grantGateHarness.tsx +81 -0
  732. swe_mux-0.1.0/frontend/test/renderer/harness.ts +604 -0
  733. swe_mux-0.1.0/frontend/test/renderer/hidden-note-editor.spec.ts +54 -0
  734. swe_mux-0.1.0/frontend/test/renderer/hiddenNoteEditorHarness.tsx +46 -0
  735. swe_mux-0.1.0/frontend/test/renderer/history-layout.spec.ts +181 -0
  736. swe_mux-0.1.0/frontend/test/renderer/historyHarness.tsx +39 -0
  737. swe_mux-0.1.0/frontend/test/renderer/jump-latest.spec.ts +44 -0
  738. swe_mux-0.1.0/frontend/test/renderer/jumpLatest.ts +159 -0
  739. swe_mux-0.1.0/frontend/test/renderer/lazy-surfaces.spec.ts +116 -0
  740. swe_mux-0.1.0/frontend/test/renderer/lazySurfacesHarness.tsx +70 -0
  741. swe_mux-0.1.0/frontend/test/renderer/model-picker.spec.ts +303 -0
  742. swe_mux-0.1.0/frontend/test/renderer/notes-tab-actions.spec.ts +110 -0
  743. swe_mux-0.1.0/frontend/test/renderer/notesTabHarness.tsx +66 -0
  744. swe_mux-0.1.0/frontend/test/renderer/palette-gating.spec.ts +59 -0
  745. swe_mux-0.1.0/frontend/test/renderer/paletteHarness.tsx +89 -0
  746. swe_mux-0.1.0/frontend/test/renderer/pane-layout.spec.ts +176 -0
  747. swe_mux-0.1.0/frontend/test/renderer/paneHarness.tsx +60 -0
  748. swe_mux-0.1.0/frontend/test/renderer/process-fleet-layout.spec.ts +150 -0
  749. swe_mux-0.1.0/frontend/test/renderer/processFleetHarness.tsx +88 -0
  750. swe_mux-0.1.0/frontend/test/renderer/processes-tab-parity.spec.ts +130 -0
  751. swe_mux-0.1.0/frontend/test/renderer/processesTabHarness.tsx +110 -0
  752. swe_mux-0.1.0/frontend/test/renderer/prompt-editor.spec.ts +92 -0
  753. swe_mux-0.1.0/frontend/test/renderer/promptEditorHarness.tsx +93 -0
  754. swe_mux-0.1.0/frontend/test/renderer/queue-readiness.spec.ts +111 -0
  755. swe_mux-0.1.0/frontend/test/renderer/queueReadinessHarness.tsx +141 -0
  756. swe_mux-0.1.0/frontend/test/renderer/quota-grid-layout.spec.ts +120 -0
  757. swe_mux-0.1.0/frontend/test/renderer/quotaGridHarness.tsx +81 -0
  758. swe_mux-0.1.0/frontend/test/renderer/rail-dropup.spec.ts +167 -0
  759. swe_mux-0.1.0/frontend/test/renderer/rail-overflow.spec.ts +450 -0
  760. swe_mux-0.1.0/frontend/test/renderer/railDropupHarness.tsx +86 -0
  761. swe_mux-0.1.0/frontend/test/renderer/railOverflowHarness.tsx +158 -0
  762. swe_mux-0.1.0/frontend/test/renderer/railTouch.ts +74 -0
  763. swe_mux-0.1.0/frontend/test/renderer/redeploy-chip.spec.ts +110 -0
  764. swe_mux-0.1.0/frontend/test/renderer/redeployChipHarness.tsx +54 -0
  765. swe_mux-0.1.0/frontend/test/renderer/resource-layout.spec.ts +22 -0
  766. swe_mux-0.1.0/frontend/test/renderer/resourceLayoutHarness.ts +22 -0
  767. swe_mux-0.1.0/frontend/test/renderer/resources-layout.spec.ts +104 -0
  768. swe_mux-0.1.0/frontend/test/renderer/resourcesHarness.tsx +80 -0
  769. swe_mux-0.1.0/frontend/test/renderer/scan-timeline-rows.spec.ts +156 -0
  770. swe_mux-0.1.0/frontend/test/renderer/scanTimelineHarness.tsx +110 -0
  771. swe_mux-0.1.0/frontend/test/renderer/schedule-layout.spec.ts +232 -0
  772. swe_mux-0.1.0/frontend/test/renderer/scheduleHarness.tsx +197 -0
  773. swe_mux-0.1.0/frontend/test/renderer/session-row-layout.spec.ts +441 -0
  774. swe_mux-0.1.0/frontend/test/renderer/sessionRowHarness.tsx +162 -0
  775. swe_mux-0.1.0/frontend/test/renderer/setting-reveal.spec.ts +125 -0
  776. swe_mux-0.1.0/frontend/test/renderer/settingRevealHarness.ts +79 -0
  777. swe_mux-0.1.0/frontend/test/renderer/settings-layout.spec.ts +339 -0
  778. swe_mux-0.1.0/frontend/test/renderer/settings-save.spec.ts +116 -0
  779. swe_mux-0.1.0/frontend/test/renderer/settingsConfigFixture.ts +480 -0
  780. swe_mux-0.1.0/frontend/test/renderer/settingsHarness.tsx +203 -0
  781. swe_mux-0.1.0/frontend/test/renderer/sidebar-groups.spec.ts +96 -0
  782. swe_mux-0.1.0/frontend/test/renderer/sidebarGroupsHarness.tsx +56 -0
  783. swe_mux-0.1.0/frontend/test/renderer/terminal-webgl.spec.ts +154 -0
  784. swe_mux-0.1.0/frontend/test/renderer/tutorial-steps.spec.ts +127 -0
  785. swe_mux-0.1.0/frontend/test/renderer/tutorialHarness.tsx +41 -0
  786. swe_mux-0.1.0/frontend/test/renderer/usage-layout.spec.ts +148 -0
  787. swe_mux-0.1.0/frontend/test/renderer/usageHarness.tsx +126 -0
  788. swe_mux-0.1.0/frontend/test/renderer/voice-capture.spec.ts +21 -0
  789. swe_mux-0.1.0/frontend/test/renderer/voice-dock.spec.ts +275 -0
  790. swe_mux-0.1.0/frontend/test/renderer/voice-settings.spec.ts +299 -0
  791. swe_mux-0.1.0/frontend/test/renderer/voiceCaptureHarness.ts +70 -0
  792. swe_mux-0.1.0/frontend/test/renderer/voiceDockHarness.tsx +198 -0
  793. swe_mux-0.1.0/frontend/test/renderer/workspace-smoke.spec.ts +67 -0
  794. swe_mux-0.1.0/frontend/test/resourceSaveIndicator.test.ts +16 -0
  795. swe_mux-0.1.0/frontend/test/resourceUsage.test.ts +104 -0
  796. swe_mux-0.1.0/frontend/test/resumeCommand.test.ts +29 -0
  797. swe_mux-0.1.0/frontend/test/scanTimeline.test.ts +202 -0
  798. swe_mux-0.1.0/frontend/test/schedules.test.ts +274 -0
  799. swe_mux-0.1.0/frontend/test/scrollbackRepaint.test.ts +92 -0
  800. swe_mux-0.1.0/frontend/test/serverClock.test.ts +62 -0
  801. swe_mux-0.1.0/frontend/test/sessionAttention.test.ts +249 -0
  802. swe_mux-0.1.0/frontend/test/sessionFocusHistory.test.ts +64 -0
  803. swe_mux-0.1.0/frontend/test/sessionJoin.test.ts +131 -0
  804. swe_mux-0.1.0/frontend/test/sessionKills.test.ts +287 -0
  805. swe_mux-0.1.0/frontend/test/sessionNames.test.ts +40 -0
  806. swe_mux-0.1.0/frontend/test/sessionProcesses.test.ts +78 -0
  807. swe_mux-0.1.0/frontend/test/sessionRowClock.test.ts +109 -0
  808. swe_mux-0.1.0/frontend/test/sessionRowFields.test.ts +986 -0
  809. swe_mux-0.1.0/frontend/test/sessionSnapshots.test.ts +67 -0
  810. swe_mux-0.1.0/frontend/test/sessionStatus.test.ts +320 -0
  811. swe_mux-0.1.0/frontend/test/settingReveal.test.ts +62 -0
  812. swe_mux-0.1.0/frontend/test/settingTargets.test.ts +142 -0
  813. swe_mux-0.1.0/frontend/test/settingsCoverage.test.ts +180 -0
  814. swe_mux-0.1.0/frontend/test/settingsDraft.test.ts +30 -0
  815. swe_mux-0.1.0/frontend/test/settingsSave.test.ts +89 -0
  816. swe_mux-0.1.0/frontend/test/settingsSearch.test.ts +185 -0
  817. swe_mux-0.1.0/frontend/test/settingsTabs.test.ts +115 -0
  818. swe_mux-0.1.0/frontend/test/sidebarProjects.test.ts +66 -0
  819. swe_mux-0.1.0/frontend/test/sidebarSearch.test.ts +223 -0
  820. swe_mux-0.1.0/frontend/test/skills.test.ts +122 -0
  821. swe_mux-0.1.0/frontend/test/smartTurnFeatures.test.ts +134 -0
  822. swe_mux-0.1.0/frontend/test/smartTurnGolden.json +514 -0
  823. swe_mux-0.1.0/frontend/test/sourceText.test.ts +161 -0
  824. swe_mux-0.1.0/frontend/test/speechGate.test.ts +124 -0
  825. swe_mux-0.1.0/frontend/test/spokenListContext.test.ts +64 -0
  826. swe_mux-0.1.0/frontend/test/staticPreview.test.ts +54 -0
  827. swe_mux-0.1.0/frontend/test/styleInvariants.test.ts +51 -0
  828. swe_mux-0.1.0/frontend/test/systemBack.test.ts +153 -0
  829. swe_mux-0.1.0/frontend/test/tabContextMenu.test.ts +132 -0
  830. swe_mux-0.1.0/frontend/test/terminalActions.test.ts +73 -0
  831. swe_mux-0.1.0/frontend/test/terminalAttachments.test.ts +53 -0
  832. swe_mux-0.1.0/frontend/test/terminalCaretPlacement.test.ts +403 -0
  833. swe_mux-0.1.0/frontend/test/terminalClipboard.test.ts +207 -0
  834. swe_mux-0.1.0/frontend/test/terminalHealth.test.ts +77 -0
  835. swe_mux-0.1.0/frontend/test/terminalInputDiagnostics.test.ts +113 -0
  836. swe_mux-0.1.0/frontend/test/terminalKeys.test.ts +57 -0
  837. swe_mux-0.1.0/frontend/test/terminalLetterbox.test.ts +57 -0
  838. swe_mux-0.1.0/frontend/test/terminalPaneInputBackend.test.ts +153 -0
  839. swe_mux-0.1.0/frontend/test/terminalProtocol.test.ts +53 -0
  840. swe_mux-0.1.0/frontend/test/terminalRenderDiagnostics.test.ts +73 -0
  841. swe_mux-0.1.0/frontend/test/terminalRenderPause.test.ts +49 -0
  842. swe_mux-0.1.0/frontend/test/terminalRenderer.test.ts +115 -0
  843. swe_mux-0.1.0/frontend/test/terminalViewport.test.ts +672 -0
  844. swe_mux-0.1.0/frontend/test/terminalWheelPacing.test.ts +146 -0
  845. swe_mux-0.1.0/frontend/test/testRegistry.test.ts +82 -0
  846. swe_mux-0.1.0/frontend/test/theme.test.ts +21 -0
  847. swe_mux-0.1.0/frontend/test/transcriptAudio.test.ts +143 -0
  848. swe_mux-0.1.0/frontend/test/transcriptView.test.ts +277 -0
  849. swe_mux-0.1.0/frontend/test/tutorial.test.ts +107 -0
  850. swe_mux-0.1.0/frontend/test/uiBuild.test.ts +26 -0
  851. swe_mux-0.1.0/frontend/test/uiBuildConfig.test.ts +16 -0
  852. swe_mux-0.1.0/frontend/test/uiCommand.test.ts +52 -0
  853. swe_mux-0.1.0/frontend/test/uiScale.test.ts +142 -0
  854. swe_mux-0.1.0/frontend/test/updateCheck.test.ts +113 -0
  855. swe_mux-0.1.0/frontend/test/usageAnalytics.test.ts +89 -0
  856. swe_mux-0.1.0/frontend/test/usagePots.test.ts +106 -0
  857. swe_mux-0.1.0/frontend/test/utteranceCompleteness.test.ts +168 -0
  858. swe_mux-0.1.0/frontend/test/utteranceDeferral.test.ts +262 -0
  859. swe_mux-0.1.0/frontend/test/viewHistory.test.ts +235 -0
  860. swe_mux-0.1.0/frontend/test/viewState.test.ts +132 -0
  861. swe_mux-0.1.0/frontend/test/voiceCommandReference.test.ts +46 -0
  862. swe_mux-0.1.0/frontend/test/voiceComms.test.ts +13 -0
  863. swe_mux-0.1.0/frontend/test/voiceConversationHistory.test.ts +57 -0
  864. swe_mux-0.1.0/frontend/test/voiceDock.test.ts +254 -0
  865. swe_mux-0.1.0/frontend/test/voiceFuzzy.test.ts +55 -0
  866. swe_mux-0.1.0/frontend/test/voiceGroups.test.ts +113 -0
  867. swe_mux-0.1.0/frontend/test/voiceIntents.test.ts +60 -0
  868. swe_mux-0.1.0/frontend/test/voiceLatency.test.ts +121 -0
  869. swe_mux-0.1.0/frontend/test/voiceNavigation.test.ts +59 -0
  870. swe_mux-0.1.0/frontend/test/voicePlayback.test.ts +600 -0
  871. swe_mux-0.1.0/frontend/test/voiceQueries.test.ts +178 -0
  872. swe_mux-0.1.0/frontend/test/wakeWordTest.test.ts +80 -0
  873. swe_mux-0.1.0/frontend/test/warmPanes.test.ts +293 -0
  874. swe_mux-0.1.0/frontend/test/wheelScroll.test.ts +31 -0
  875. swe_mux-0.1.0/frontend/test/workspaceTabs.test.ts +38 -0
  876. swe_mux-0.1.0/frontend/test/worktreeLaunch.test.ts +27 -0
  877. swe_mux-0.1.0/frontend/test/worktreeRemoval.test.ts +129 -0
  878. swe_mux-0.1.0/frontend/test/worktreeSelection.test.ts +112 -0
  879. swe_mux-0.1.0/frontend/test/wslBridge.test.ts +85 -0
  880. swe_mux-0.1.0/frontend/tsconfig.json +23 -0
  881. swe_mux-0.1.0/frontend/tsconfig.test.json +6 -0
  882. swe_mux-0.1.0/frontend/tutorial-harness.html +3 -0
  883. swe_mux-0.1.0/frontend/usage-harness.html +3 -0
  884. swe_mux-0.1.0/frontend/vendor/continuity-editor-0.2.36.tgz +0 -0
  885. swe_mux-0.1.0/frontend/vite.config.ts +76 -0
  886. swe_mux-0.1.0/frontend/voice-capture-harness.html +3 -0
  887. swe_mux-0.1.0/frontend/voice-dock-harness.html +3 -0
  888. swe_mux-0.1.0/mypy-platform.toml +20 -0
  889. swe_mux-0.1.0/packaging/build_desktop.py +440 -0
  890. swe_mux-0.1.0/packaging/desktop_entry.py +6 -0
  891. swe_mux-0.1.0/packaging/generate_frontend_registry.py +43 -0
  892. swe_mux-0.1.0/packaging/install_smoke.py +409 -0
  893. swe_mux-0.1.0/packaging/license_audit.py +734 -0
  894. swe_mux-0.1.0/packaging/package_desktop_release.py +105 -0
  895. swe_mux-0.1.0/packaging/redeploy_desktop.py +1080 -0
  896. swe_mux-0.1.0/packaging/rthook_av_stub.py +27 -0
  897. swe_mux-0.1.0/packaging/supervisor_entry.py +6 -0
  898. swe_mux-0.1.0/packaging/swe_mux.spec +128 -0
  899. swe_mux-0.1.0/packaging/swe_mux_supervisor.spec +71 -0
  900. swe_mux-0.1.0/packaging/third_party_licenses.json +1217 -0
  901. swe_mux-0.1.0/packaging/verify_release_artifact.py +628 -0
  902. swe_mux-0.1.0/packaging/verify_release_unit.py +1367 -0
  903. swe_mux-0.1.0/pyproject.toml +329 -0
  904. swe_mux-0.1.0/site/CNAME +1 -0
  905. swe_mux-0.1.0/site/README.md +626 -0
  906. swe_mux-0.1.0/site/acknowledgements/index.html +826 -0
  907. swe_mux-0.1.0/site/changelog/index.html +616 -0
  908. swe_mux-0.1.0/site/content/acknowledgements-prose.html +58 -0
  909. swe_mux-0.1.0/site/content/ideas.json +7 -0
  910. swe_mux-0.1.0/site/content/roadmap.html +127 -0
  911. swe_mux-0.1.0/site/docs/index.html +792 -0
  912. swe_mux-0.1.0/site/img/desktop-alerts.webp +0 -0
  913. swe_mux-0.1.0/site/img/desktop-git.webp +0 -0
  914. swe_mux-0.1.0/site/img/desktop-insight.webp +0 -0
  915. swe_mux-0.1.0/site/img/desktop-notes.webp +0 -0
  916. swe_mux-0.1.0/site/img/desktop-workspace.webp +0 -0
  917. swe_mux-0.1.0/site/img/logo-light.png +0 -0
  918. swe_mux-0.1.0/site/img/logo.png +0 -0
  919. swe_mux-0.1.0/site/img/mobile-alerts.webp +0 -0
  920. swe_mux-0.1.0/site/img/mobile-nav.webp +0 -0
  921. swe_mux-0.1.0/site/img/mobile-notes.webp +0 -0
  922. swe_mux-0.1.0/site/img/mobile-session.webp +0 -0
  923. swe_mux-0.1.0/site/index.html +891 -0
  924. swe_mux-0.1.0/site/roadmap/index.html +631 -0
  925. swe_mux-0.1.0/site/tools/build.py +1182 -0
  926. swe_mux-0.1.0/site/tools/check.mjs +202 -0
  927. swe_mux-0.1.0/site/tools/contrast.py +75 -0
  928. swe_mux-0.1.0/site/tools/ideas.py +327 -0
  929. swe_mux-0.1.0/site/tools/logo.py +74 -0
  930. swe_mux-0.1.0/site/tools/placeholders.py +296 -0
  931. swe_mux-0.1.0/site/tools/wordmark-source.png +0 -0
  932. swe_mux-0.1.0/src/swe_mux/__init__.py +3 -0
  933. swe_mux-0.1.0/src/swe_mux/__main__.py +318 -0
  934. swe_mux-0.1.0/src/swe_mux/adapters/__init__.py +111 -0
  935. swe_mux-0.1.0/src/swe_mux/adapters/base.py +135 -0
  936. swe_mux-0.1.0/src/swe_mux/adapters/claude.py +482 -0
  937. swe_mux-0.1.0/src/swe_mux/adapters/codex.py +416 -0
  938. swe_mux-0.1.0/src/swe_mux/adapters/omp.py +492 -0
  939. swe_mux-0.1.0/src/swe_mux/adapters/opencode.py +335 -0
  940. swe_mux-0.1.0/src/swe_mux/adapters/pi.py +423 -0
  941. swe_mux-0.1.0/src/swe_mux/adapters/shell.py +81 -0
  942. swe_mux-0.1.0/src/swe_mux/agent_context.py +883 -0
  943. swe_mux-0.1.0/src/swe_mux/agent_environment.py +1780 -0
  944. swe_mux-0.1.0/src/swe_mux/agent_launcher.py +685 -0
  945. swe_mux-0.1.0/src/swe_mux/agent_messaging.py +1211 -0
  946. swe_mux-0.1.0/src/swe_mux/agent_skills.py +713 -0
  947. swe_mux-0.1.0/src/swe_mux/app_keys.py +236 -0
  948. swe_mux-0.1.0/src/swe_mux/approvals.py +387 -0
  949. swe_mux-0.1.0/src/swe_mux/assets/configurator/automations.md +98 -0
  950. swe_mux-0.1.0/src/swe_mux/assets/configurator/diagnostics.md +82 -0
  951. swe_mux-0.1.0/src/swe_mux/assets/configurator/harnesses.md +93 -0
  952. swe_mux-0.1.0/src/swe_mux/assets/configurator/modifying-swe-mux.md +91 -0
  953. swe_mux-0.1.0/src/swe_mux/assets/configurator/orientation.md +88 -0
  954. swe_mux-0.1.0/src/swe_mux/assets/configurator/rail-and-actions.md +129 -0
  955. swe_mux-0.1.0/src/swe_mux/assets/configurator/remote.md +76 -0
  956. swe_mux-0.1.0/src/swe_mux/assets/configurator/settings.md +136 -0
  957. swe_mux-0.1.0/src/swe_mux/assets/configurator/worktrees.md +89 -0
  958. swe_mux-0.1.0/src/swe_mux/assets/integrations/edge_tts_bridge.py +90 -0
  959. swe_mux-0.1.0/src/swe_mux/assets/omp_mux_hook.ts +315 -0
  960. swe_mux-0.1.0/src/swe_mux/assets/opencode_mux_plugin.js +218 -0
  961. swe_mux-0.1.0/src/swe_mux/assets/pi_mux_hook.ts +277 -0
  962. swe_mux-0.1.0/src/swe_mux/assets/project-actions-schema.md +238 -0
  963. swe_mux-0.1.0/src/swe_mux/assistant.py +4342 -0
  964. swe_mux-0.1.0/src/swe_mux/attention_narration.py +175 -0
  965. swe_mux-0.1.0/src/swe_mux/attention_ranking.py +1073 -0
  966. swe_mux-0.1.0/src/swe_mux/auto_delivery.py +1044 -0
  967. swe_mux-0.1.0/src/swe_mux/automation.py +2730 -0
  968. swe_mux-0.1.0/src/swe_mux/automation_registry.py +586 -0
  969. swe_mux-0.1.0/src/swe_mux/automation_store.py +2692 -0
  970. swe_mux-0.1.0/src/swe_mux/av_stub.py +79 -0
  971. swe_mux-0.1.0/src/swe_mux/background_tasks.py +327 -0
  972. swe_mux-0.1.0/src/swe_mux/behavioral_consumers.py +572 -0
  973. swe_mux-0.1.0/src/swe_mux/bounded_subprocess.py +326 -0
  974. swe_mux-0.1.0/src/swe_mux/budget.py +360 -0
  975. swe_mux-0.1.0/src/swe_mux/build_support.py +58 -0
  976. swe_mux-0.1.0/src/swe_mux/bundle_archive.py +149 -0
  977. swe_mux-0.1.0/src/swe_mux/bundle_locks.py +274 -0
  978. swe_mux-0.1.0/src/swe_mux/bundle_metadata.py +144 -0
  979. swe_mux-0.1.0/src/swe_mux/claude_models.py +56 -0
  980. swe_mux-0.1.0/src/swe_mux/cli.py +628 -0
  981. swe_mux-0.1.0/src/swe_mux/cli_state.py +636 -0
  982. swe_mux-0.1.0/src/swe_mux/cli_version.py +137 -0
  983. swe_mux-0.1.0/src/swe_mux/clipboard_store.py +536 -0
  984. swe_mux-0.1.0/src/swe_mux/code_graph.py +1817 -0
  985. swe_mux-0.1.0/src/swe_mux/codex_tui.py +46 -0
  986. swe_mux-0.1.0/src/swe_mux/composer_input.py +300 -0
  987. swe_mux-0.1.0/src/swe_mux/config.py +2575 -0
  988. swe_mux-0.1.0/src/swe_mux/configurator.py +1112 -0
  989. swe_mux-0.1.0/src/swe_mux/console_contention.py +350 -0
  990. swe_mux-0.1.0/src/swe_mux/delivery_readiness.py +746 -0
  991. swe_mux-0.1.0/src/swe_mux/desktop.py +793 -0
  992. swe_mux-0.1.0/src/swe_mux/desktop_window_state.py +262 -0
  993. swe_mux-0.1.0/src/swe_mux/deterministic_consumers.py +1604 -0
  994. swe_mux-0.1.0/src/swe_mux/device_presence.py +193 -0
  995. swe_mux-0.1.0/src/swe_mux/doctor.py +902 -0
  996. swe_mux-0.1.0/src/swe_mux/doctor_local.py +940 -0
  997. swe_mux-0.1.0/src/swe_mux/edge_tts_provider.py +793 -0
  998. swe_mux-0.1.0/src/swe_mux/errors.py +49 -0
  999. swe_mux-0.1.0/src/swe_mux/event_bus.py +202 -0
  1000. swe_mux-0.1.0/src/swe_mux/file_manager.py +83 -0
  1001. swe_mux-0.1.0/src/swe_mux/fleet_intelligence.py +685 -0
  1002. swe_mux-0.1.0/src/swe_mux/ghost_windows.py +282 -0
  1003. swe_mux-0.1.0/src/swe_mux/git_init.py +342 -0
  1004. swe_mux-0.1.0/src/swe_mux/git_monitor.py +963 -0
  1005. swe_mux-0.1.0/src/swe_mux/git_operations.py +125 -0
  1006. swe_mux-0.1.0/src/swe_mux/git_projects.py +140 -0
  1007. swe_mux-0.1.0/src/swe_mux/git_provenance.py +1531 -0
  1008. swe_mux-0.1.0/src/swe_mux/git_review.py +2055 -0
  1009. swe_mux-0.1.0/src/swe_mux/grants.py +339 -0
  1010. swe_mux-0.1.0/src/swe_mux/harness.py +2269 -0
  1011. swe_mux-0.1.0/src/swe_mux/history.py +4142 -0
  1012. swe_mux-0.1.0/src/swe_mux/history_backfill.py +236 -0
  1013. swe_mux-0.1.0/src/swe_mux/history_scan.py +111 -0
  1014. swe_mux-0.1.0/src/swe_mux/hook_client.py +229 -0
  1015. swe_mux-0.1.0/src/swe_mux/host_platform.py +110 -0
  1016. swe_mux-0.1.0/src/swe_mux/http_support.py +100 -0
  1017. swe_mux-0.1.0/src/swe_mux/keybindings.py +316 -0
  1018. swe_mux-0.1.0/src/swe_mux/kokoro_tts.py +656 -0
  1019. swe_mux-0.1.0/src/swe_mux/land_classify.py +306 -0
  1020. swe_mux-0.1.0/src/swe_mux/land_preconditions.py +306 -0
  1021. swe_mux-0.1.0/src/swe_mux/land_queue.py +1656 -0
  1022. swe_mux-0.1.0/src/swe_mux/land_store.py +1005 -0
  1023. swe_mux-0.1.0/src/swe_mux/launchers.py +234 -0
  1024. swe_mux-0.1.0/src/swe_mux/layouts.py +420 -0
  1025. swe_mux-0.1.0/src/swe_mux/leaf_names.py +84 -0
  1026. swe_mux-0.1.0/src/swe_mux/lifecycle.py +210 -0
  1027. swe_mux-0.1.0/src/swe_mux/llm_endpoint.py +751 -0
  1028. swe_mux-0.1.0/src/swe_mux/logsetup.py +307 -0
  1029. swe_mux-0.1.0/src/swe_mux/loop_lag.py +156 -0
  1030. swe_mux-0.1.0/src/swe_mux/mcp.py +5412 -0
  1031. swe_mux-0.1.0/src/swe_mux/mcp_contract.py +160 -0
  1032. swe_mux-0.1.0/src/swe_mux/mcp_tools.py +1035 -0
  1033. swe_mux-0.1.0/src/swe_mux/meta_hooks.py +414 -0
  1034. swe_mux-0.1.0/src/swe_mux/models.py +678 -0
  1035. swe_mux-0.1.0/src/swe_mux/nested_job.py +94 -0
  1036. swe_mux-0.1.0/src/swe_mux/nested_worktrees.py +153 -0
  1037. swe_mux-0.1.0/src/swe_mux/network_usage.py +363 -0
  1038. swe_mux-0.1.0/src/swe_mux/observation.py +5960 -0
  1039. swe_mux-0.1.0/src/swe_mux/opencode_store.py +332 -0
  1040. swe_mux-0.1.0/src/swe_mux/openrouter.py +1672 -0
  1041. swe_mux-0.1.0/src/swe_mux/operational_telemetry.py +2656 -0
  1042. swe_mux-0.1.0/src/swe_mux/path_identity.py +172 -0
  1043. swe_mux-0.1.0/src/swe_mux/phonics.py +160 -0
  1044. swe_mux-0.1.0/src/swe_mux/posix_firewall.py +150 -0
  1045. swe_mux-0.1.0/src/swe_mux/posix_guardian.py +170 -0
  1046. swe_mux-0.1.0/src/swe_mux/posix_process_group.py +257 -0
  1047. swe_mux-0.1.0/src/swe_mux/prerequisites.py +82 -0
  1048. swe_mux-0.1.0/src/swe_mux/preview_capture.py +342 -0
  1049. swe_mux-0.1.0/src/swe_mux/preview_store.py +133 -0
  1050. swe_mux-0.1.0/src/swe_mux/preview_transport.py +805 -0
  1051. swe_mux-0.1.0/src/swe_mux/process_reaper.py +85 -0
  1052. swe_mux-0.1.0/src/swe_mux/processes.py +2191 -0
  1053. swe_mux-0.1.0/src/swe_mux/profiles.py +554 -0
  1054. swe_mux-0.1.0/src/swe_mux/project_actions.py +1345 -0
  1055. swe_mux-0.1.0/src/swe_mux/project_card.py +626 -0
  1056. swe_mux-0.1.0/src/swe_mux/project_context.py +190 -0
  1057. swe_mux-0.1.0/src/swe_mux/project_files.py +2305 -0
  1058. swe_mux-0.1.0/src/swe_mux/project_init.py +62 -0
  1059. swe_mux-0.1.0/src/swe_mux/project_scope.py +175 -0
  1060. swe_mux-0.1.0/src/swe_mux/project_watcher.py +269 -0
  1061. swe_mux-0.1.0/src/swe_mux/projects.py +413 -0
  1062. swe_mux-0.1.0/src/swe_mux/prompt_library.py +366 -0
  1063. swe_mux-0.1.0/src/swe_mux/prompt_queue.py +2598 -0
  1064. swe_mux-0.1.0/src/swe_mux/provider_accounts.py +2115 -0
  1065. swe_mux-0.1.0/src/swe_mux/pty_backend.py +110 -0
  1066. swe_mux-0.1.0/src/swe_mux/pty_backend_posix.py +281 -0
  1067. swe_mux-0.1.0/src/swe_mux/pty_backend_windows.py +241 -0
  1068. swe_mux-0.1.0/src/swe_mux/pty_host.py +494 -0
  1069. swe_mux-0.1.0/src/swe_mux/push.py +886 -0
  1070. swe_mux-0.1.0/src/swe_mux/py.typed +1 -0
  1071. swe_mux-0.1.0/src/swe_mux/readiness_watch.py +203 -0
  1072. swe_mux-0.1.0/src/swe_mux/recent_files.py +259 -0
  1073. swe_mux-0.1.0/src/swe_mux/reconcile.py +662 -0
  1074. swe_mux-0.1.0/src/swe_mux/redeploy_launch.py +181 -0
  1075. swe_mux-0.1.0/src/swe_mux/routes/__init__.py +114 -0
  1076. swe_mux-0.1.0/src/swe_mux/routes/agent_context.py +147 -0
  1077. swe_mux-0.1.0/src/swe_mux/routes/agent_ingress.py +424 -0
  1078. swe_mux-0.1.0/src/swe_mux/routes/assistant.py +127 -0
  1079. swe_mux-0.1.0/src/swe_mux/routes/attention.py +160 -0
  1080. swe_mux-0.1.0/src/swe_mux/routes/automation.py +1203 -0
  1081. swe_mux-0.1.0/src/swe_mux/routes/branch.py +770 -0
  1082. swe_mux-0.1.0/src/swe_mux/routes/clipboard.py +114 -0
  1083. swe_mux-0.1.0/src/swe_mux/routes/configurator.py +517 -0
  1084. swe_mux-0.1.0/src/swe_mux/routes/diagnostics.py +820 -0
  1085. swe_mux-0.1.0/src/swe_mux/routes/git.py +937 -0
  1086. swe_mux-0.1.0/src/swe_mux/routes/grants.py +265 -0
  1087. swe_mux-0.1.0/src/swe_mux/routes/history.py +322 -0
  1088. swe_mux-0.1.0/src/swe_mux/routes/insights.py +541 -0
  1089. swe_mux-0.1.0/src/swe_mux/routes/land.py +293 -0
  1090. swe_mux-0.1.0/src/swe_mux/routes/notes.py +302 -0
  1091. swe_mux-0.1.0/src/swe_mux/routes/observations.py +347 -0
  1092. swe_mux-0.1.0/src/swe_mux/routes/processes.py +293 -0
  1093. swe_mux-0.1.0/src/swe_mux/routes/project_actions.py +443 -0
  1094. swe_mux-0.1.0/src/swe_mux/routes/project_files.py +324 -0
  1095. swe_mux-0.1.0/src/swe_mux/routes/projects.py +718 -0
  1096. swe_mux-0.1.0/src/swe_mux/routes/prompts.py +133 -0
  1097. swe_mux-0.1.0/src/swe_mux/routes/pty.py +1210 -0
  1098. swe_mux-0.1.0/src/swe_mux/routes/push.py +78 -0
  1099. swe_mux-0.1.0/src/swe_mux/routes/queue.py +252 -0
  1100. swe_mux-0.1.0/src/swe_mux/routes/scan_timeline.py +1105 -0
  1101. swe_mux-0.1.0/src/swe_mux/routes/schedules.py +321 -0
  1102. swe_mux-0.1.0/src/swe_mux/routes/sessions.py +1192 -0
  1103. swe_mux-0.1.0/src/swe_mux/routes/settings.py +467 -0
  1104. swe_mux-0.1.0/src/swe_mux/routes/support.py +113 -0
  1105. swe_mux-0.1.0/src/swe_mux/routes/system.py +924 -0
  1106. swe_mux-0.1.0/src/swe_mux/routes/terminal.py +342 -0
  1107. swe_mux-0.1.0/src/swe_mux/routes/update.py +223 -0
  1108. swe_mux-0.1.0/src/swe_mux/routes/usage.py +229 -0
  1109. swe_mux-0.1.0/src/swe_mux/routes/voice.py +677 -0
  1110. swe_mux-0.1.0/src/swe_mux/runtime_config.py +236 -0
  1111. swe_mux-0.1.0/src/swe_mux/runtime_cwd.py +158 -0
  1112. swe_mux-0.1.0/src/swe_mux/scan_consumers.py +399 -0
  1113. swe_mux-0.1.0/src/swe_mux/scan_timeline.py +1765 -0
  1114. swe_mux-0.1.0/src/swe_mux/schedule_store.py +601 -0
  1115. swe_mux-0.1.0/src/swe_mux/scheduler.py +664 -0
  1116. swe_mux-0.1.0/src/swe_mux/schedules.py +766 -0
  1117. swe_mux-0.1.0/src/swe_mux/screen_mode.py +209 -0
  1118. swe_mux-0.1.0/src/swe_mux/scrollback.py +145 -0
  1119. swe_mux-0.1.0/src/swe_mux/secret_backends.py +320 -0
  1120. swe_mux-0.1.0/src/swe_mux/secret_cipher_windows.py +66 -0
  1121. swe_mux-0.1.0/src/swe_mux/secret_store.py +98 -0
  1122. swe_mux-0.1.0/src/swe_mux/server.py +2307 -0
  1123. swe_mux-0.1.0/src/swe_mux/session.py +7639 -0
  1124. swe_mux-0.1.0/src/swe_mux/session_attachments.py +196 -0
  1125. swe_mux-0.1.0/src/swe_mux/session_control.py +683 -0
  1126. swe_mux-0.1.0/src/swe_mux/session_media.py +113 -0
  1127. swe_mux-0.1.0/src/swe_mux/session_recovery.py +1041 -0
  1128. swe_mux-0.1.0/src/swe_mux/session_resume.py +557 -0
  1129. swe_mux-0.1.0/src/swe_mux/session_titles.py +97 -0
  1130. swe_mux-0.1.0/src/swe_mux/session_watch.py +891 -0
  1131. swe_mux-0.1.0/src/swe_mux/settings_patch.py +309 -0
  1132. swe_mux-0.1.0/src/swe_mux/settings_store.py +365 -0
  1133. swe_mux-0.1.0/src/swe_mux/shim_paths.py +138 -0
  1134. swe_mux-0.1.0/src/swe_mux/spawn_contract.py +434 -0
  1135. swe_mux-0.1.0/src/swe_mux/spawn_probe.py +179 -0
  1136. swe_mux-0.1.0/src/swe_mux/sqlite_store.py +343 -0
  1137. swe_mux-0.1.0/src/swe_mux/startup_phases.py +246 -0
  1138. swe_mux-0.1.0/src/swe_mux/static/assets/ChangeMapPane-BmAMqDR-.js +312 -0
  1139. swe_mux-0.1.0/src/swe_mux/static/assets/ChangeMapPane-BmAMqDR-.js.gz +0 -0
  1140. swe_mux-0.1.0/src/swe_mux/static/assets/CodeEditor-Dk-PW5vg.js +14 -0
  1141. swe_mux-0.1.0/src/swe_mux/static/assets/CodeEditor-Dk-PW5vg.js.gz +0 -0
  1142. swe_mux-0.1.0/src/swe_mux/static/assets/GitDiffView-DLZqjFsl.js +16 -0
  1143. swe_mux-0.1.0/src/swe_mux/static/assets/GitDiffView-DLZqjFsl.js.gz +0 -0
  1144. swe_mux-0.1.0/src/swe_mux/static/assets/GitDiffView-T3uj2-aP.css +1 -0
  1145. swe_mux-0.1.0/src/swe_mux/static/assets/GitDiffView-T3uj2-aP.css.gz +0 -0
  1146. swe_mux-0.1.0/src/swe_mux/static/assets/changeMapLayout.worker-D4Skptgd.js +1 -0
  1147. swe_mux-0.1.0/src/swe_mux/static/assets/changeMapLayout.worker-D4Skptgd.js.gz +0 -0
  1148. swe_mux-0.1.0/src/swe_mux/static/assets/clike-B9uivgTg.js +1 -0
  1149. swe_mux-0.1.0/src/swe_mux/static/assets/clike-B9uivgTg.js.gz +0 -0
  1150. swe_mux-0.1.0/src/swe_mux/static/assets/continuity_wasm_bg-CyQ8dtl-.wasm +0 -0
  1151. swe_mux-0.1.0/src/swe_mux/static/assets/continuity_wasm_bg-CyQ8dtl-.wasm.gz +0 -0
  1152. swe_mux-0.1.0/src/swe_mux/static/assets/diff-DbItnlRl.js +1 -0
  1153. swe_mux-0.1.0/src/swe_mux/static/assets/dockerfile-ZL4hHokT.js +1 -0
  1154. swe_mux-0.1.0/src/swe_mux/static/assets/dockerfile-ZL4hHokT.js.gz +0 -0
  1155. swe_mux-0.1.0/src/swe_mux/static/assets/haskell-Cw1EW3IL.js +1 -0
  1156. swe_mux-0.1.0/src/swe_mux/static/assets/haskell-Cw1EW3IL.js.gz +0 -0
  1157. swe_mux-0.1.0/src/swe_mux/static/assets/index-9S1IdbBC.js +13 -0
  1158. swe_mux-0.1.0/src/swe_mux/static/assets/index-9S1IdbBC.js.gz +0 -0
  1159. swe_mux-0.1.0/src/swe_mux/static/assets/index-B2AdifhJ.js +885 -0
  1160. swe_mux-0.1.0/src/swe_mux/static/assets/index-B2AdifhJ.js.gz +0 -0
  1161. swe_mux-0.1.0/src/swe_mux/static/assets/index-B4cuaoWd.js +1 -0
  1162. swe_mux-0.1.0/src/swe_mux/static/assets/index-B4cuaoWd.js.gz +0 -0
  1163. swe_mux-0.1.0/src/swe_mux/static/assets/index-BP_kv-PN.js +1 -0
  1164. swe_mux-0.1.0/src/swe_mux/static/assets/index-BP_kv-PN.js.gz +0 -0
  1165. swe_mux-0.1.0/src/swe_mux/static/assets/index-BSsVPCRN.js +7 -0
  1166. swe_mux-0.1.0/src/swe_mux/static/assets/index-BSsVPCRN.js.gz +0 -0
  1167. swe_mux-0.1.0/src/swe_mux/static/assets/index-BYfgxfcM.js +1 -0
  1168. swe_mux-0.1.0/src/swe_mux/static/assets/index-BYfgxfcM.js.gz +0 -0
  1169. swe_mux-0.1.0/src/swe_mux/static/assets/index-CGm8hXwA.js +1 -0
  1170. swe_mux-0.1.0/src/swe_mux/static/assets/index-CGm8hXwA.js.gz +0 -0
  1171. swe_mux-0.1.0/src/swe_mux/static/assets/index-CJZrhNKs.js +3 -0
  1172. swe_mux-0.1.0/src/swe_mux/static/assets/index-CJZrhNKs.js.gz +0 -0
  1173. swe_mux-0.1.0/src/swe_mux/static/assets/index-C_sGKiLP.js +1 -0
  1174. swe_mux-0.1.0/src/swe_mux/static/assets/index-C_sGKiLP.js.gz +0 -0
  1175. swe_mux-0.1.0/src/swe_mux/static/assets/index-Cd9jc5_X.js +2 -0
  1176. swe_mux-0.1.0/src/swe_mux/static/assets/index-Cd9jc5_X.js.gz +0 -0
  1177. swe_mux-0.1.0/src/swe_mux/static/assets/index-D6y23oVF.js +1 -0
  1178. swe_mux-0.1.0/src/swe_mux/static/assets/index-D6y23oVF.js.gz +0 -0
  1179. swe_mux-0.1.0/src/swe_mux/static/assets/index-DezTEy5U.js +1 -0
  1180. swe_mux-0.1.0/src/swe_mux/static/assets/index-DezTEy5U.js.gz +0 -0
  1181. swe_mux-0.1.0/src/swe_mux/static/assets/index-MfKV3jL_.js +1 -0
  1182. swe_mux-0.1.0/src/swe_mux/static/assets/index-MfKV3jL_.js.gz +0 -0
  1183. swe_mux-0.1.0/src/swe_mux/static/assets/index-QrZhPhw0.css +32 -0
  1184. swe_mux-0.1.0/src/swe_mux/static/assets/index-QrZhPhw0.css.gz +0 -0
  1185. swe_mux-0.1.0/src/swe_mux/static/assets/index-UXl4ApE-.js +1 -0
  1186. swe_mux-0.1.0/src/swe_mux/static/assets/index-UXl4ApE-.js.gz +0 -0
  1187. swe_mux-0.1.0/src/swe_mux/static/assets/index-qS11BjWv.js +6 -0
  1188. swe_mux-0.1.0/src/swe_mux/static/assets/index-qS11BjWv.js.gz +0 -0
  1189. swe_mux-0.1.0/src/swe_mux/static/assets/index-sRHo1vT4.js +1 -0
  1190. swe_mux-0.1.0/src/swe_mux/static/assets/index-sRHo1vT4.js.gz +0 -0
  1191. swe_mux-0.1.0/src/swe_mux/static/assets/lua-VAEuO923.js +1 -0
  1192. swe_mux-0.1.0/src/swe_mux/static/assets/lua-VAEuO923.js.gz +0 -0
  1193. swe_mux-0.1.0/src/swe_mux/static/assets/nginx-DdIZxoE0.js +1 -0
  1194. swe_mux-0.1.0/src/swe_mux/static/assets/nginx-DdIZxoE0.js.gz +0 -0
  1195. swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-5-bdKoo7.js +1 -0
  1196. swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-BQQNiIPt.wasm +0 -0
  1197. swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-BQQNiIPt.wasm.gz +0 -0
  1198. swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-CJxt2Z9d.js +1 -0
  1199. swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-Rz2TxrO3.mjs +81 -0
  1200. swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-Rz2TxrO3.mjs.gz +0 -0
  1201. swe_mux-0.1.0/src/swe_mux/static/assets/ort.bundle.min-ByP5eVXb.js +1826 -0
  1202. swe_mux-0.1.0/src/swe_mux/static/assets/ort.bundle.min-ByP5eVXb.js.gz +0 -0
  1203. swe_mux-0.1.0/src/swe_mux/static/assets/perl-CdXCOZ3F.js +1 -0
  1204. swe_mux-0.1.0/src/swe_mux/static/assets/perl-CdXCOZ3F.js.gz +0 -0
  1205. swe_mux-0.1.0/src/swe_mux/static/assets/powershell-CFHJl5sT.js +1 -0
  1206. swe_mux-0.1.0/src/swe_mux/static/assets/powershell-CFHJl5sT.js.gz +0 -0
  1207. swe_mux-0.1.0/src/swe_mux/static/assets/properties-C78fOPTZ.js +1 -0
  1208. swe_mux-0.1.0/src/swe_mux/static/assets/protobuf-ChK-085T.js +1 -0
  1209. swe_mux-0.1.0/src/swe_mux/static/assets/r-B6wPVr8A.js +1 -0
  1210. swe_mux-0.1.0/src/swe_mux/static/assets/r-B6wPVr8A.js.gz +0 -0
  1211. swe_mux-0.1.0/src/swe_mux/static/assets/ruby-B2Rjki9n.js +1 -0
  1212. swe_mux-0.1.0/src/swe_mux/static/assets/ruby-B2Rjki9n.js.gz +0 -0
  1213. swe_mux-0.1.0/src/swe_mux/static/assets/shell-CjFT_Tl9.js +1 -0
  1214. swe_mux-0.1.0/src/swe_mux/static/assets/shell-CjFT_Tl9.js.gz +0 -0
  1215. swe_mux-0.1.0/src/swe_mux/static/assets/silero_vad_v5-CsSLqjY_.js +1 -0
  1216. swe_mux-0.1.0/src/swe_mux/static/assets/silero_vad_v5-Dt9-bTDn.onnx +0 -0
  1217. swe_mux-0.1.0/src/swe_mux/static/assets/swift-BzpIVaGY.js +1 -0
  1218. swe_mux-0.1.0/src/swe_mux/static/assets/swift-BzpIVaGY.js.gz +0 -0
  1219. swe_mux-0.1.0/src/swe_mux/static/assets/toml-Bm5Em-hy.js +1 -0
  1220. swe_mux-0.1.0/src/swe_mux/static/assets/toml-Bm5Em-hy.js.gz +0 -0
  1221. swe_mux-0.1.0/src/swe_mux/static/icons/apple-touch-icon.png +0 -0
  1222. swe_mux-0.1.0/src/swe_mux/static/icons/icon-192.png +0 -0
  1223. swe_mux-0.1.0/src/swe_mux/static/icons/icon-512.png +0 -0
  1224. swe_mux-0.1.0/src/swe_mux/static/icons/icon-maskable-512.png +0 -0
  1225. swe_mux-0.1.0/src/swe_mux/static/index.html +29 -0
  1226. swe_mux-0.1.0/src/swe_mux/static/index.html.gz +0 -0
  1227. swe_mux-0.1.0/src/swe_mux/static/manifest.webmanifest +17 -0
  1228. swe_mux-0.1.0/src/swe_mux/static/notification-sounds/LICENSE.orca.txt +24 -0
  1229. swe_mux-0.1.0/src/swe_mux/static/notification-sounds/blip.mp3 +0 -0
  1230. swe_mux-0.1.0/src/swe_mux/static/notification-sounds/blop.mp3 +0 -0
  1231. swe_mux-0.1.0/src/swe_mux/static/notification-sounds/bong.mp3 +0 -0
  1232. swe_mux-0.1.0/src/swe_mux/static/notification-sounds/ding.mp3 +0 -0
  1233. swe_mux-0.1.0/src/swe_mux/static/notification-sounds/sonar.mp3 +0 -0
  1234. swe_mux-0.1.0/src/swe_mux/static/notification-sounds/thump.mp3 +0 -0
  1235. swe_mux-0.1.0/src/swe_mux/static/notification-sounds/two-tone.mp3 +0 -0
  1236. swe_mux-0.1.0/src/swe_mux/static/sw.js +40 -0
  1237. swe_mux-0.1.0/src/swe_mux/static/sw.js.gz +0 -0
  1238. swe_mux-0.1.0/src/swe_mux/status_timeline.py +512 -0
  1239. swe_mux-0.1.0/src/swe_mux/storage_usage.py +268 -0
  1240. swe_mux-0.1.0/src/swe_mux/subprocess_flags.py +85 -0
  1241. swe_mux-0.1.0/src/swe_mux/supervisor.py +999 -0
  1242. swe_mux-0.1.0/src/swe_mux/supervisor_client.py +1132 -0
  1243. swe_mux-0.1.0/src/swe_mux/tailscale.py +665 -0
  1244. swe_mux-0.1.0/src/swe_mux/terminal_arbitration.py +193 -0
  1245. swe_mux-0.1.0/src/swe_mux/text_safety.py +54 -0
  1246. swe_mux-0.1.0/src/swe_mux/tier0_store.py +736 -0
  1247. swe_mux-0.1.0/src/swe_mux/timer_resolution.py +110 -0
  1248. swe_mux-0.1.0/src/swe_mux/tools/__init__.py +21 -0
  1249. swe_mux-0.1.0/src/swe_mux/tools/git_provenance_backfill.py +1731 -0
  1250. swe_mux-0.1.0/src/swe_mux/transcript_fork.py +402 -0
  1251. swe_mux-0.1.0/src/swe_mux/transcript_view.py +1729 -0
  1252. swe_mux-0.1.0/src/swe_mux/tts_profiles.py +89 -0
  1253. swe_mux-0.1.0/src/swe_mux/ui_build.py +73 -0
  1254. swe_mux-0.1.0/src/swe_mux/update_check.py +833 -0
  1255. swe_mux-0.1.0/src/swe_mux/update_install.py +1087 -0
  1256. swe_mux-0.1.0/src/swe_mux/usage.py +535 -0
  1257. swe_mux-0.1.0/src/swe_mux/verify_progress.py +230 -0
  1258. swe_mux-0.1.0/src/swe_mux/voice.py +3584 -0
  1259. swe_mux-0.1.0/src/swe_mux/voice_audio.py +98 -0
  1260. swe_mux-0.1.0/src/swe_mux/voice_models.py +573 -0
  1261. swe_mux-0.1.0/src/swe_mux/win_jobobj.py +227 -0
  1262. swe_mux-0.1.0/src/swe_mux/windows_firewall.py +498 -0
  1263. swe_mux-0.1.0/src/swe_mux/worktree_exec.py +203 -0
  1264. swe_mux-0.1.0/src/swe_mux/worktree_graveyard.py +260 -0
  1265. swe_mux-0.1.0/src/swe_mux/worktree_mutation.py +556 -0
  1266. swe_mux-0.1.0/src/swe_mux/worktree_setup.py +169 -0
  1267. swe_mux-0.1.0/src/swe_mux/worktree_verify.py +480 -0
  1268. swe_mux-0.1.0/src/swe_mux/wsl_bridge.py +872 -0
  1269. swe_mux-0.1.0/tests/__init__.py +1 -0
  1270. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-agent-tool-subagent.json +30 -0
  1271. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-approval-resume-pty.json +33 -0
  1272. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-approval-resume-transcript.json +33 -0
  1273. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-background-pty-reopen.json +105 -0
  1274. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-background-queued-completion.json +169 -0
  1275. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-background-tasks.json +331 -0
  1276. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-classifier-blind.json +28 -0
  1277. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-compaction-mid-turn.json +25 -0
  1278. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-crash-mid-turn.json +26 -0
  1279. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-cron-lifecycle.json +240 -0
  1280. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-degraded-parser-live-transcript.json +26 -0
  1281. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-esc-pause-without-marker.json +31 -0
  1282. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-foreign-subagent-hook.json +127 -0
  1283. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-healthy-parser-dead-transcript.json +26 -0
  1284. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-hook-transcript-relocation.json +26 -0
  1285. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-idle-vs-permission-vs-elicitation.json +39 -0
  1286. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-interrupt-aborts-hook-turn.json +22 -0
  1287. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-jsonl-boundaries.json +26 -0
  1288. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-late-hook-reopen-race.json +32 -0
  1289. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-long-tool-never-cut.json +32 -0
  1290. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-loop-expiry.json +127 -0
  1291. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-loop-lifecycle.json +317 -0
  1292. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-modern-spinner-resume.json +30 -0
  1293. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-native-completion-closes-hook-turn.json +22 -0
  1294. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-nested-child-hooks.json +41 -0
  1295. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-parallel-tool-idle-repaint.json +28 -0
  1296. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-pending-approval-not-cleared.json +39 -0
  1297. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-promote-demote-lifecycle.json +34 -0
  1298. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-resume-catchup-recent.json +23 -0
  1299. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-resume-catchup-stale.json +22 -0
  1300. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-root-subagent.json +30 -0
  1301. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-sibling-cross-attribution.json +28 -0
  1302. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-startup-dialog.json +32 -0
  1303. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-subagent-only-stop.json +27 -0
  1304. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-subagents-hooks.json +201 -0
  1305. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-subagents-transcript-fallback.json +188 -0
  1306. swe_mux-0.1.0/tests/fixtures/detection/v1/claude-watchdog-ended-stuck.json +27 -0
  1307. swe_mux-0.1.0/tests/fixtures/detection/v1/codex-current-schema.json +48 -0
  1308. swe_mux-0.1.0/tests/fixtures/detection/v1/codex-parser-drift.json +38 -0
  1309. swe_mux-0.1.0/tests/fixtures/detection/v1/codex-question-subagent.json +34 -0
  1310. swe_mux-0.1.0/tests/fixtures/detection/v1/codex-rate-limit-abort.json +37 -0
  1311. swe_mux-0.1.0/tests/fixtures/detection/v1/codex-startup-dialog.json +24 -0
  1312. swe_mux-0.1.0/tests/fixtures/detection/v1/codex-unwitnessed-first-turn.json +111 -0
  1313. swe_mux-0.1.0/tests/fixtures/detection/v1/codex-watchdog-unknown-tail.json +28 -0
  1314. swe_mux-0.1.0/tests/fixtures/detection/v1/daemon-restart-run-recovery.json +35 -0
  1315. swe_mux-0.1.0/tests/fixtures/detection/v1/delivery-safety-boundaries.json +62 -0
  1316. swe_mux-0.1.0/tests/fixtures/detection/v1/edge_case_inventory.json +166 -0
  1317. swe_mux-0.1.0/tests/fixtures/detection/v1/hook-transcript-dedupe.json +26 -0
  1318. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-clear.json +22 -0
  1319. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-compaction.json +24 -0
  1320. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-hook-approval.json +28 -0
  1321. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-hook-lifecycle.json +31 -0
  1322. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-interrupted-exit.json +28 -0
  1323. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-new-session.json +24 -0
  1324. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-plain-turn.json +24 -0
  1325. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-resume-catchup.json +26 -0
  1326. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-task-fanout.json +34 -0
  1327. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-tool-turn.json +27 -0
  1328. swe_mux-0.1.0/tests/fixtures/detection/v1/omp-unwitnessed-first-turn.json +29 -0
  1329. swe_mux-0.1.0/tests/fixtures/detection/v1/opencode-approval.json +124 -0
  1330. swe_mux-0.1.0/tests/fixtures/detection/v1/opencode-compaction.json +90 -0
  1331. swe_mux-0.1.0/tests/fixtures/detection/v1/opencode-hook-lifecycle.json +167 -0
  1332. swe_mux-0.1.0/tests/fixtures/detection/v1/opencode-new-session.json +133 -0
  1333. swe_mux-0.1.0/tests/fixtures/detection/v1/opencode-tool-turn.json +136 -0
  1334. swe_mux-0.1.0/tests/fixtures/detection/v1/pi-compaction.json +25 -0
  1335. swe_mux-0.1.0/tests/fixtures/detection/v1/pi-hook-lifecycle.json +30 -0
  1336. swe_mux-0.1.0/tests/fixtures/detection/v1/pi-plain-turn.json +25 -0
  1337. swe_mux-0.1.0/tests/fixtures/detection/v1/pi-pty-working-fallback.json +29 -0
  1338. swe_mux-0.1.0/tests/fixtures/detection/v1/pi-tool-turn.json +27 -0
  1339. swe_mux-0.1.0/tests/fixtures/detection/v1/pi-unknown-record-drift.json +26 -0
  1340. swe_mux-0.1.0/tests/fixtures/detection/v1/promotion-and-exit.json +30 -0
  1341. swe_mux-0.1.0/tests/fixtures/legacy_db/mux_db.sql +552 -0
  1342. swe_mux-0.1.0/tests/fixtures/pty_tails/background-wait.bin +1 -0
  1343. swe_mux-0.1.0/tests/fixtures/pty_tails/idle-footer.bin +1 -0
  1344. swe_mux-0.1.0/tests/fixtures/pty_tails/model-picker.txt +6 -0
  1345. swe_mux-0.1.0/tests/fixtures/pty_tails/omp-approval-pending.txt +4 -0
  1346. swe_mux-0.1.0/tests/fixtures/pty_tails/omp-idle-thinking-level.txt +2 -0
  1347. swe_mux-0.1.0/tests/fixtures/pty_tails/omp-idle.txt +3 -0
  1348. swe_mux-0.1.0/tests/fixtures/pty_tails/omp-model-picker.txt +6 -0
  1349. swe_mux-0.1.0/tests/fixtures/pty_tails/omp-session-tree.txt +4 -0
  1350. swe_mux-0.1.0/tests/fixtures/pty_tails/parallel-tool-completion-idle-repaint.txt +7 -0
  1351. swe_mux-0.1.0/tests/fixtures/pty_tails/permission-dialog-parallel-redraw.txt +23 -0
  1352. swe_mux-0.1.0/tests/fixtures/pty_tails/permission-dialog.bin +1 -0
  1353. swe_mux-0.1.0/tests/fixtures/pty_tails/pi-idle-footer.txt +3 -0
  1354. swe_mux-0.1.0/tests/fixtures/pty_tails/pi-working-spinner.txt +4 -0
  1355. swe_mux-0.1.0/tests/fixtures/pty_tails/prose-false-positive.txt +3 -0
  1356. swe_mux-0.1.0/tests/fixtures/pty_tails/regions.json +30 -0
  1357. swe_mux-0.1.0/tests/fixtures/pty_tails/trust-dialog.bin +18 -0
  1358. swe_mux-0.1.0/tests/fixtures/pty_tails/working-spinner.bin +1 -0
  1359. swe_mux-0.1.0/tests/fixtures/ssh-boundaries-v1.json +67 -0
  1360. swe_mux-0.1.0/tests/fixtures/telemetry/v1/claude.json +11 -0
  1361. swe_mux-0.1.0/tests/fixtures/telemetry/v1/codex.json +13 -0
  1362. swe_mux-0.1.0/tests/fixtures/telemetry/v1/omp.json +65 -0
  1363. swe_mux-0.1.0/tests/fixtures/transcripts/v1/claude.jsonl +2 -0
  1364. swe_mux-0.1.0/tests/fixtures/transcripts/v1/codex.jsonl +5 -0
  1365. swe_mux-0.1.0/tests/fixtures/usage/ccusage-by-agent-v20.json +56 -0
  1366. swe_mux-0.1.0/tests/fixtures/usage/claude-v17.json +17 -0
  1367. swe_mux-0.1.0/tests/fixtures/usage/codex-v0.json +13 -0
  1368. swe_mux-0.1.0/tests/fixtures/usage/codex-v20.json +34 -0
  1369. swe_mux-0.1.0/tests/host_paths.py +29 -0
  1370. swe_mux-0.1.0/tests/support/__init__.py +1 -0
  1371. swe_mux-0.1.0/tests/support/claude_transcript.py +116 -0
  1372. swe_mux-0.1.0/tests/support/detection_replay.py +785 -0
  1373. swe_mux-0.1.0/tests/support/fake_supervisor.py +164 -0
  1374. swe_mux-0.1.0/tests/support/legacy_database.py +273 -0
  1375. swe_mux-0.1.0/tests/support/live_daemon.py +176 -0
  1376. swe_mux-0.1.0/tests/support/live_facts.py +84 -0
  1377. swe_mux-0.1.0/tests/support/settle.py +68 -0
  1378. swe_mux-0.1.0/tests/support/status_capture.py +301 -0
  1379. swe_mux-0.1.0/tests/test_adapters.py +866 -0
  1380. swe_mux-0.1.0/tests/test_agent_context.py +392 -0
  1381. swe_mux-0.1.0/tests/test_agent_environment.py +583 -0
  1382. swe_mux-0.1.0/tests/test_agent_launcher_reporting.py +264 -0
  1383. swe_mux-0.1.0/tests/test_agent_lifecycle.py +746 -0
  1384. swe_mux-0.1.0/tests/test_agent_messaging.py +1128 -0
  1385. swe_mux-0.1.0/tests/test_agent_messaging_interject.py +339 -0
  1386. swe_mux-0.1.0/tests/test_agent_skills.py +426 -0
  1387. swe_mux-0.1.0/tests/test_approval_api.py +378 -0
  1388. swe_mux-0.1.0/tests/test_approval_decisions.py +221 -0
  1389. swe_mux-0.1.0/tests/test_approval_keystroke.py +249 -0
  1390. swe_mux-0.1.0/tests/test_approvals.py +411 -0
  1391. swe_mux-0.1.0/tests/test_assistant.py +3345 -0
  1392. swe_mux-0.1.0/tests/test_attention_ranking.py +641 -0
  1393. swe_mux-0.1.0/tests/test_auto_delivery.py +1157 -0
  1394. swe_mux-0.1.0/tests/test_automation_phase6.py +2471 -0
  1395. swe_mux-0.1.0/tests/test_background_tasks.py +334 -0
  1396. swe_mux-0.1.0/tests/test_bounded_subprocess.py +342 -0
  1397. swe_mux-0.1.0/tests/test_branch.py +531 -0
  1398. swe_mux-0.1.0/tests/test_budget_shape.py +353 -0
  1399. swe_mux-0.1.0/tests/test_bundle_locks.py +94 -0
  1400. swe_mux-0.1.0/tests/test_change_map_endpoint.py +658 -0
  1401. swe_mux-0.1.0/tests/test_claude_models.py +53 -0
  1402. swe_mux-0.1.0/tests/test_cli.py +320 -0
  1403. swe_mux-0.1.0/tests/test_cli_profiles.py +57 -0
  1404. swe_mux-0.1.0/tests/test_cli_state.py +511 -0
  1405. swe_mux-0.1.0/tests/test_cli_version_probe.py +166 -0
  1406. swe_mux-0.1.0/tests/test_clipboard_history.py +372 -0
  1407. swe_mux-0.1.0/tests/test_code_graph.py +475 -0
  1408. swe_mux-0.1.0/tests/test_code_graph_detectors.py +165 -0
  1409. swe_mux-0.1.0/tests/test_code_graph_trunk_refresh.py +238 -0
  1410. swe_mux-0.1.0/tests/test_codex_provisional_binding.py +222 -0
  1411. swe_mux-0.1.0/tests/test_codex_subagent_identity.py +244 -0
  1412. swe_mux-0.1.0/tests/test_composer_input.py +292 -0
  1413. swe_mux-0.1.0/tests/test_config_service.py +1099 -0
  1414. swe_mux-0.1.0/tests/test_config_validation_tables.py +107 -0
  1415. swe_mux-0.1.0/tests/test_configurator.py +480 -0
  1416. swe_mux-0.1.0/tests/test_configurator_endpoint.py +471 -0
  1417. swe_mux-0.1.0/tests/test_configurator_mcp.py +350 -0
  1418. swe_mux-0.1.0/tests/test_conpty_integration.py +187 -0
  1419. swe_mux-0.1.0/tests/test_console_contention.py +194 -0
  1420. swe_mux-0.1.0/tests/test_console_contention_session.py +379 -0
  1421. swe_mux-0.1.0/tests/test_control_plane_api.py +932 -0
  1422. swe_mux-0.1.0/tests/test_control_plane_enablement.py +1103 -0
  1423. swe_mux-0.1.0/tests/test_conversation_discovery.py +253 -0
  1424. swe_mux-0.1.0/tests/test_conversation_rollover.py +1480 -0
  1425. swe_mux-0.1.0/tests/test_core.py +689 -0
  1426. swe_mux-0.1.0/tests/test_custom_llm_endpoint.py +539 -0
  1427. swe_mux-0.1.0/tests/test_daemon_restart.py +234 -0
  1428. swe_mux-0.1.0/tests/test_delivery_readiness_evidence.py +529 -0
  1429. swe_mux-0.1.0/tests/test_delivery_readiness_interject.py +208 -0
  1430. swe_mux-0.1.0/tests/test_delivery_readiness_promotion.py +198 -0
  1431. swe_mux-0.1.0/tests/test_desktop.py +501 -0
  1432. swe_mux-0.1.0/tests/test_detection_replay.py +383 -0
  1433. swe_mux-0.1.0/tests/test_deterministic_consumers.py +710 -0
  1434. swe_mux-0.1.0/tests/test_device_presence.py +157 -0
  1435. swe_mux-0.1.0/tests/test_diagnosability.py +675 -0
  1436. swe_mux-0.1.0/tests/test_doctor.py +225 -0
  1437. swe_mux-0.1.0/tests/test_doctor_local.py +563 -0
  1438. swe_mux-0.1.0/tests/test_edge_tts_provider.py +414 -0
  1439. swe_mux-0.1.0/tests/test_events_ws.py +330 -0
  1440. swe_mux-0.1.0/tests/test_file_manager.py +39 -0
  1441. swe_mux-0.1.0/tests/test_first_use_assets.py +322 -0
  1442. swe_mux-0.1.0/tests/test_fleet_phase7.py +478 -0
  1443. swe_mux-0.1.0/tests/test_frontend_automation_contract.py +137 -0
  1444. swe_mux-0.1.0/tests/test_frontend_claude_width_contract.py +100 -0
  1445. swe_mux-0.1.0/tests/test_frontend_control_plane_contract.py +87 -0
  1446. swe_mux-0.1.0/tests/test_frontend_network_usage_contract.py +23 -0
  1447. swe_mux-0.1.0/tests/test_frontend_operational_telemetry_contract.py +123 -0
  1448. swe_mux-0.1.0/tests/test_frontend_phase3_contract.py +703 -0
  1449. swe_mux-0.1.0/tests/test_frontend_phase4_contract.py +963 -0
  1450. swe_mux-0.1.0/tests/test_frontend_phase5_contract.py +195 -0
  1451. swe_mux-0.1.0/tests/test_frontend_profile_contract.py +156 -0
  1452. swe_mux-0.1.0/tests/test_frontend_provider_accounts_contract.py +165 -0
  1453. swe_mux-0.1.0/tests/test_frontend_storage_usage_contract.py +16 -0
  1454. swe_mux-0.1.0/tests/test_frontend_theme_contract.py +87 -0
  1455. swe_mux-0.1.0/tests/test_frontend_ui_scale_contract.py +203 -0
  1456. swe_mux-0.1.0/tests/test_frontend_usage_phase5_contract.py +128 -0
  1457. swe_mux-0.1.0/tests/test_ghost_windows.py +409 -0
  1458. swe_mux-0.1.0/tests/test_git_attribution.py +198 -0
  1459. swe_mux-0.1.0/tests/test_git_drawer.py +244 -0
  1460. swe_mux-0.1.0/tests/test_git_init.py +283 -0
  1461. swe_mux-0.1.0/tests/test_git_landing_attribution.py +376 -0
  1462. swe_mux-0.1.0/tests/test_git_operations.py +309 -0
  1463. swe_mux-0.1.0/tests/test_git_overview_cache.py +387 -0
  1464. swe_mux-0.1.0/tests/test_git_phase4.py +784 -0
  1465. swe_mux-0.1.0/tests/test_git_provenance.py +1580 -0
  1466. swe_mux-0.1.0/tests/test_git_provenance_backfill.py +273 -0
  1467. swe_mux-0.1.0/tests/test_git_review.py +864 -0
  1468. swe_mux-0.1.0/tests/test_global_notes.py +98 -0
  1469. swe_mux-0.1.0/tests/test_grants.py +587 -0
  1470. swe_mux-0.1.0/tests/test_harness_adapter_matrix.py +177 -0
  1471. swe_mux-0.1.0/tests/test_harness_name_literals.py +332 -0
  1472. swe_mux-0.1.0/tests/test_harness_registry.py +752 -0
  1473. swe_mux-0.1.0/tests/test_history_duplicate_repair.py +236 -0
  1474. swe_mux-0.1.0/tests/test_history_metadata.py +141 -0
  1475. swe_mux-0.1.0/tests/test_history_orphaned_runs.py +107 -0
  1476. swe_mux-0.1.0/tests/test_history_phase4.py +350 -0
  1477. swe_mux-0.1.0/tests/test_history_scan.py +244 -0
  1478. swe_mux-0.1.0/tests/test_history_search_budget.py +88 -0
  1479. swe_mux-0.1.0/tests/test_history_v2.py +820 -0
  1480. swe_mux-0.1.0/tests/test_hook_client_decisions.py +146 -0
  1481. swe_mux-0.1.0/tests/test_hook_client_identity.py +154 -0
  1482. swe_mux-0.1.0/tests/test_hook_spool.py +199 -0
  1483. swe_mux-0.1.0/tests/test_install_smoke.py +117 -0
  1484. swe_mux-0.1.0/tests/test_keybindings.py +157 -0
  1485. swe_mux-0.1.0/tests/test_kokoro_tts.py +491 -0
  1486. swe_mux-0.1.0/tests/test_land_api.py +663 -0
  1487. swe_mux-0.1.0/tests/test_land_classify.py +287 -0
  1488. swe_mux-0.1.0/tests/test_land_queue.py +2174 -0
  1489. swe_mux-0.1.0/tests/test_launch_profiles.py +454 -0
  1490. swe_mux-0.1.0/tests/test_leaf_names.py +76 -0
  1491. swe_mux-0.1.0/tests/test_license_audit.py +524 -0
  1492. swe_mux-0.1.0/tests/test_lifecycle_and_logging.py +158 -0
  1493. swe_mux-0.1.0/tests/test_lineage_view.py +146 -0
  1494. swe_mux-0.1.0/tests/test_live_agent_conformance.py +641 -0
  1495. swe_mux-0.1.0/tests/test_live_automations.py +451 -0
  1496. swe_mux-0.1.0/tests/test_live_edge_tts.py +54 -0
  1497. swe_mux-0.1.0/tests/test_live_git_attribution.py +210 -0
  1498. swe_mux-0.1.0/tests/test_live_mcp_control.py +371 -0
  1499. swe_mux-0.1.0/tests/test_llm_endpoint_capabilities.py +423 -0
  1500. swe_mux-0.1.0/tests/test_llm_provider_api.py +560 -0
  1501. swe_mux-0.1.0/tests/test_llm_schemas.py +133 -0
  1502. swe_mux-0.1.0/tests/test_mcp.py +1641 -0
  1503. swe_mux-0.1.0/tests/test_mcp_code_graph.py +157 -0
  1504. swe_mux-0.1.0/tests/test_mcp_consumer_hardening.py +823 -0
  1505. swe_mux-0.1.0/tests/test_mcp_memory.py +670 -0
  1506. swe_mux-0.1.0/tests/test_mcp_project_actions.py +445 -0
  1507. swe_mux-0.1.0/tests/test_mcp_scan_timeline.py +726 -0
  1508. swe_mux-0.1.0/tests/test_mcp_tools.py +624 -0
  1509. swe_mux-0.1.0/tests/test_meta_hooks_phase4.py +76 -0
  1510. swe_mux-0.1.0/tests/test_migration_compatibility.py +360 -0
  1511. swe_mux-0.1.0/tests/test_nested_worktrees.py +113 -0
  1512. swe_mux-0.1.0/tests/test_network_usage.py +141 -0
  1513. swe_mux-0.1.0/tests/test_note_save_loop.py +112 -0
  1514. swe_mux-0.1.0/tests/test_observation.py +3000 -0
  1515. swe_mux-0.1.0/tests/test_opencode_transcript.py +277 -0
  1516. swe_mux-0.1.0/tests/test_openrouter_phase6.py +1404 -0
  1517. swe_mux-0.1.0/tests/test_operational_telemetry_phase2.py +1765 -0
  1518. swe_mux-0.1.0/tests/test_package_map_shape.py +108 -0
  1519. swe_mux-0.1.0/tests/test_perf_caches.py +356 -0
  1520. swe_mux-0.1.0/tests/test_phase3_daily_workflow.py +283 -0
  1521. swe_mux-0.1.0/tests/test_phase5_6.py +513 -0
  1522. swe_mux-0.1.0/tests/test_phase77_behavioral.py +650 -0
  1523. swe_mux-0.1.0/tests/test_phonics.py +66 -0
  1524. swe_mux-0.1.0/tests/test_pi_opencode_adapters.py +542 -0
  1525. swe_mux-0.1.0/tests/test_platform_seams.py +719 -0
  1526. swe_mux-0.1.0/tests/test_preview_rewriting.py +135 -0
  1527. swe_mux-0.1.0/tests/test_processes_phase4.py +1950 -0
  1528. swe_mux-0.1.0/tests/test_processes_snapshot_grouping.py +199 -0
  1529. swe_mux-0.1.0/tests/test_profiles.py +324 -0
  1530. swe_mux-0.1.0/tests/test_project_actions.py +337 -0
  1531. swe_mux-0.1.0/tests/test_project_actions_v2.py +925 -0
  1532. swe_mux-0.1.0/tests/test_project_card.py +490 -0
  1533. swe_mux-0.1.0/tests/test_project_config_writes.py +233 -0
  1534. swe_mux-0.1.0/tests/test_project_context.py +124 -0
  1535. swe_mux-0.1.0/tests/test_project_files.py +660 -0
  1536. swe_mux-0.1.0/tests/test_project_init_scripts.py +190 -0
  1537. swe_mux-0.1.0/tests/test_project_resource_actions.py +184 -0
  1538. swe_mux-0.1.0/tests/test_project_scope.py +113 -0
  1539. swe_mux-0.1.0/tests/test_project_watcher.py +128 -0
  1540. swe_mux-0.1.0/tests/test_projects_reliability.py +711 -0
  1541. swe_mux-0.1.0/tests/test_prompt_queue.py +999 -0
  1542. swe_mux-0.1.0/tests/test_prompt_queue_interject.py +185 -0
  1543. swe_mux-0.1.0/tests/test_prompt_queue_policy_migration.py +95 -0
  1544. swe_mux-0.1.0/tests/test_provider_accounts.py +1120 -0
  1545. swe_mux-0.1.0/tests/test_pty_backend_windows.py +65 -0
  1546. swe_mux-0.1.0/tests/test_pty_supervisor.py +1034 -0
  1547. swe_mux-0.1.0/tests/test_pty_tail_modern.py +262 -0
  1548. swe_mux-0.1.0/tests/test_pty_ws.py +1449 -0
  1549. swe_mux-0.1.0/tests/test_push.py +575 -0
  1550. swe_mux-0.1.0/tests/test_readiness_watch.py +362 -0
  1551. swe_mux-0.1.0/tests/test_recent_files.py +210 -0
  1552. swe_mux-0.1.0/tests/test_redeploy_endpoint.py +1144 -0
  1553. swe_mux-0.1.0/tests/test_release_readiness.py +568 -0
  1554. swe_mux-0.1.0/tests/test_resume_run_adoption.py +565 -0
  1555. swe_mux-0.1.0/tests/test_resumed_transcript_binding.py +226 -0
  1556. swe_mux-0.1.0/tests/test_route_modules.py +167 -0
  1557. swe_mux-0.1.0/tests/test_scan_timeline.py +1303 -0
  1558. swe_mux-0.1.0/tests/test_scheduled_resume.py +747 -0
  1559. swe_mux-0.1.0/tests/test_schedules.py +580 -0
  1560. swe_mux-0.1.0/tests/test_schedules_api.py +363 -0
  1561. swe_mux-0.1.0/tests/test_screen_mode.py +188 -0
  1562. swe_mux-0.1.0/tests/test_security_phase5.py +659 -0
  1563. swe_mux-0.1.0/tests/test_serve_route_ownership.py +163 -0
  1564. swe_mux-0.1.0/tests/test_session_attachments.py +149 -0
  1565. swe_mux-0.1.0/tests/test_session_control.py +594 -0
  1566. swe_mux-0.1.0/tests/test_session_identity.py +596 -0
  1567. swe_mux-0.1.0/tests/test_session_loop_ownership.py +142 -0
  1568. swe_mux-0.1.0/tests/test_session_notes.py +330 -0
  1569. swe_mux-0.1.0/tests/test_session_read_state.py +386 -0
  1570. swe_mux-0.1.0/tests/test_session_recovery.py +904 -0
  1571. swe_mux-0.1.0/tests/test_session_reliability.py +754 -0
  1572. swe_mux-0.1.0/tests/test_session_skills_api.py +450 -0
  1573. swe_mux-0.1.0/tests/test_session_titles.py +89 -0
  1574. swe_mux-0.1.0/tests/test_session_transcript_api.py +213 -0
  1575. swe_mux-0.1.0/tests/test_session_watch.py +821 -0
  1576. swe_mux-0.1.0/tests/test_settings_atomic.py +307 -0
  1577. swe_mux-0.1.0/tests/test_settings_bundle.py +133 -0
  1578. swe_mux-0.1.0/tests/test_settings_hot_apply.py +150 -0
  1579. swe_mux-0.1.0/tests/test_settings_patch.py +259 -0
  1580. swe_mux-0.1.0/tests/test_settings_store.py +219 -0
  1581. swe_mux-0.1.0/tests/test_settings_store_edits.py +138 -0
  1582. swe_mux-0.1.0/tests/test_shim_console_handoff.py +241 -0
  1583. swe_mux-0.1.0/tests/test_spawn_contract.py +358 -0
  1584. swe_mux-0.1.0/tests/test_spawn_probe.py +113 -0
  1585. swe_mux-0.1.0/tests/test_spawn_stage.py +116 -0
  1586. swe_mux-0.1.0/tests/test_spend_label_matrix.py +167 -0
  1587. swe_mux-0.1.0/tests/test_standing_activity.py +1603 -0
  1588. swe_mux-0.1.0/tests/test_startup_gate.py +365 -0
  1589. swe_mux-0.1.0/tests/test_static_preview.py +519 -0
  1590. swe_mux-0.1.0/tests/test_status_capture.py +203 -0
  1591. swe_mux-0.1.0/tests/test_status_contract.py +850 -0
  1592. swe_mux-0.1.0/tests/test_status_timeline.py +564 -0
  1593. swe_mux-0.1.0/tests/test_storage_usage.py +130 -0
  1594. swe_mux-0.1.0/tests/test_store_hardening.py +790 -0
  1595. swe_mux-0.1.0/tests/test_subprocess_correlation.py +213 -0
  1596. swe_mux-0.1.0/tests/test_supervisor_client_guards.py +453 -0
  1597. swe_mux-0.1.0/tests/test_supervisor_client_liveness.py +248 -0
  1598. swe_mux-0.1.0/tests/test_supervisor_client_transport.py +232 -0
  1599. swe_mux-0.1.0/tests/test_supervisor_protocol.py +855 -0
  1600. swe_mux-0.1.0/tests/test_terminal_arbitration.py +193 -0
  1601. swe_mux-0.1.0/tests/test_text_safety.py +98 -0
  1602. swe_mux-0.1.0/tests/test_timer_resolution.py +58 -0
  1603. swe_mux-0.1.0/tests/test_transcript_branches.py +372 -0
  1604. swe_mux-0.1.0/tests/test_transcript_conversation.py +449 -0
  1605. swe_mux-0.1.0/tests/test_transcript_fork.py +265 -0
  1606. swe_mux-0.1.0/tests/test_transcript_forward_slice.py +195 -0
  1607. swe_mux-0.1.0/tests/test_ui_build.py +75 -0
  1608. swe_mux-0.1.0/tests/test_update_check.py +651 -0
  1609. swe_mux-0.1.0/tests/test_update_install.py +974 -0
  1610. swe_mux-0.1.0/tests/test_usage_phase4.py +183 -0
  1611. swe_mux-0.1.0/tests/test_verify_progress.py +172 -0
  1612. swe_mux-0.1.0/tests/test_verify_release_artifact.py +628 -0
  1613. swe_mux-0.1.0/tests/test_verify_release_unit.py +1021 -0
  1614. swe_mux-0.1.0/tests/test_voice.py +2664 -0
  1615. swe_mux-0.1.0/tests/test_windows_reaper.py +43 -0
  1616. swe_mux-0.1.0/tests/test_worktree_files.py +102 -0
  1617. swe_mux-0.1.0/tests/test_worktree_graveyard.py +405 -0
  1618. swe_mux-0.1.0/tests/test_worktree_preflight.py +94 -0
  1619. swe_mux-0.1.0/tests/test_worktree_setup.py +70 -0
  1620. swe_mux-0.1.0/tests/test_worktree_spawn.py +189 -0
  1621. swe_mux-0.1.0/tests/test_worktree_status.py +50 -0
  1622. swe_mux-0.1.0/tests/test_worktree_unborn_head.py +77 -0
  1623. swe_mux-0.1.0/tests/test_wsl_bridge.py +238 -0
  1624. swe_mux-0.1.0/tests/test_wsl_bridge_setup.py +212 -0
  1625. swe_mux-0.1.0/tools/fetch_smart_turn.py +54 -0
  1626. swe_mux-0.1.0/tools/linux_acceptance.sh +110 -0
  1627. swe_mux-0.1.0/tools/linux_agent_acceptance.sh +118 -0
  1628. swe_mux-0.1.0/tools/linux_container_verify.sh +76 -0
  1629. swe_mux-0.1.0/tools/perf_snapshot.py +283 -0
  1630. swe_mux-0.1.0/tools/pty_latency_bench.py +182 -0
  1631. swe_mux-0.1.0/tools/pty_probe.py +163 -0
  1632. swe_mux-0.1.0/tools/smart_turn_golden.py +115 -0
  1633. swe_mux-0.1.0/tools/wsl_dev_setup.sh +446 -0
  1634. swe_mux-0.1.0/trailer/.gitignore +6 -0
  1635. swe_mux-0.1.0/trailer/README.md +83 -0
  1636. swe_mux-0.1.0/trailer/assets/swe-mux-icon.png +0 -0
  1637. swe_mux-0.1.0/trailer/capture_live_ui.py +400 -0
  1638. swe_mux-0.1.0/trailer/explore_live_ui.py +208 -0
  1639. swe_mux-0.1.0/trailer/inspect_live_ui.py +74 -0
  1640. swe_mux-0.1.0/trailer/render.py +1336 -0
  1641. swe_mux-0.1.0/trailer/render_feature_cut.py +822 -0
  1642. swe_mux-0.1.0/trailer/requirements.txt +3 -0
  1643. swe_mux-0.1.0/trailer/storyboard.md +35 -0
  1644. swe_mux-0.1.0/uv.lock +3249 -0
@@ -0,0 +1,689 @@
1
+ # Documentation routing
2
+
3
+ - Changing process/session lifecycle or package boundaries: `design/architecture.md`,
4
+ `design/features/sessions.md`, `design/features/backends.md`,
5
+ `design/features/delivery-readiness.md`
6
+ - Changing what survives a crash rather than a restart - the durable session registry, terminal
7
+ checkpoints, cold sessions, or whether an ended pane stays readable:
8
+ `design/features/session-recovery.md`, `design/features/sessions.md`, `design/data-model.md`,
9
+ `design/interfaces.md`, `technical/backend/packages.md`, `technical/backend/sqlite.md`,
10
+ `technical/frontend/packages.md`.
11
+ The rule the split exists to enforce: the PTY supervisor is the *primary* recovery path and stays
12
+ near-frozen, so nothing here may be written from the supervisor process - a change there reaps
13
+ every live session (`development/archive/SESSION_PRESERVING_RELOAD.md` §8).
14
+ - Changing the harness registry, descriptors, capability levels, adapter families, or adding a
15
+ harness: `design/features/backends.md`; completed abstraction record:
16
+ `development/archive/HARNESS_ABSTRACTION_AND_OMP.md`; per-surface parity classification and
17
+ the open enforcement gaps: `development/archive/HARNESS_PARITY_AUDIT_2026-08-11.md`;
18
+ per-candidate parity study for CLIs not yet in the registry, and the sequencing that consumes
19
+ it: `development/HARNESS_EXPANSION_CANDIDATES.md`, `development/ROADMAP.md` Phase 12
20
+ - Changing the configurator agent - its generated inventory, its shipped guides, the gated
21
+ MCP family, the launcher, or `default_harness`: `design/features/configurator.md`, plus
22
+ `design/features/mux-mcp.md` for anything touching the tool contract.
23
+ The rule the split exists to enforce: **nothing structural in that inventory may be
24
+ hand-written.** Every section is derived from the registry that owns it, and the settings
25
+ constraints are quoted from `_validate` by probing it rather than transcribed - a
26
+ hand-maintained table beside a validator is a second validator, and the copy is what drifts.
27
+ The second rule is packaging: the guides live under `src/swe_mux/assets/` because that is
28
+ what the wheel and the PyInstaller bundle both carry, and `.docs/` is in neither. A guide
29
+ moved into `.docs/` reads correctly from source and is silently absent for every user of
30
+ the frozen app, which is the entire audience.
31
+ The third rule governs **writes to a document this process cannot validate** (the
32
+ per-device settings store, five of whose seven domains are the browser's schema):
33
+ the write takes path-scoped operations, never a document, so everything it did not name
34
+ is untouched by construction - the only safety available where validation is not - and it
35
+ is guarded by a content digest the caller must have read plus a backup of the previous
36
+ file. Whole-document replacement is the obvious way to give an agent this power and is the
37
+ wrong one: nothing downstream can tell a mangled rail from an intended one, so the failure
38
+ is silent and total.
39
+ And the rule the *misattribution* taught (2026-08-24): every answer carries which Project
40
+ the caller is standing in, and every per-Project fact is resolved to a Project **name**.
41
+ A configurator launched into a foreign Project cannot derive its own Project id, so one
42
+ override in a blob keyed by bare UUIDs reads as "this one" - which produced a confident,
43
+ specific, wrong warning about another Project's rail button.
44
+ - Adding a tool to the mux MCP surface, or changing who may see one: `design/features/mux-mcp.md`,
45
+ `src/swe_mux/mcp_contract.py`. A tool visible to a subset of sessions is listed *and*
46
+ dispatched behind the same check (`design/features/configurator.md`, "The gate") - a tool
47
+ advertised and then refused teaches an agent that the surface lies to it.
48
+ - Changing Project/Group registration, ownership, ordering, or sidebar visibility:
49
+ `design/features/projects.md`, `design/data-model.md`, `design/interfaces.md`
50
+ - Changing Project notes, the global Scratchpad, files, ignores, or watches:
51
+ `design/features/project-resources.md`, `design/data-model.md`, `design/interfaces.md`
52
+ - Changing Agent Context discovery, root instruction sync/restore, or its drawer surface:
53
+ `design/features/agent-context.md`, `design/features/ui.md`, `design/interfaces.md`,
54
+ `technical/backend/packages.md`, `technical/frontend/packages.md`
55
+ - Changing the session Agent Environment inventory, safety boundaries, or drawer surface:
56
+ `design/features/agent-environment.md`, `design/features/ui.md`, `design/interfaces.md`,
57
+ `technical/backend/packages.md`, `technical/frontend/packages.md`; runtime inventory research
58
+ and planned collection strategy: `development/AGENT_ENVIRONMENT_RUNTIME_INVENTORY.md`.
59
+ The rule the split exists to enforce: **opening the tab probes nothing**, and the one
60
+ control that does reach a server (per-server Fetch tools, `src/swe_mux/mcp_tools.py`) is
61
+ reached only by an explicit press. Everything it returns carries the evidence tier that
62
+ produced it and those tiers are never collapsed into "connected" - a `parallel_probe` is a
63
+ *separate* runtime with its own connection and authentication state, so its health is not
64
+ the health of the CLI in the terminal, and for Claude it is strictly weaker than that CLI's
65
+ own `/mcp` because dialling configuration reaches neither account connectors nor plugin
66
+ gating. Two consequences follow. An empty catalog must say which kind of empty it is
67
+ ("not probed", "not reported by this session", "connected and published nothing" are
68
+ different facts that render identically otherwise), and an HTTP server carrying credentials
69
+ is reported rather than dialled, because a probe would spend a credential the user handed to
70
+ their CLI and not to this drawer.
71
+ - Changing trusted task imports, the Project Run menu, or task launch:
72
+ `design/features/project-actions.md`, `design/features/projects.md`, `design/interfaces.md`,
73
+ `technical/backend/packages.md`, `technical/frontend/packages.md`.
74
+ **`.swe-mux/` and `.vscode/` are untracked as of 2026-08-28** and `.gitignore` now ignores
75
+ each of them whole. Nothing under either - including the repository-authored
76
+ `actions.toml`, `project-context.md`, and `prompts/`, which used to be deliberate
77
+ exceptions - is carried in the repository any more; they are per-machine state. Read any
78
+ doc that names those paths as describing the *format* a checkout may carry, never as a
79
+ claim that this repository supplies one: a fresh clone declares no actions, imports no VS
80
+ Code tasks, and starts with no project context.
81
+ The rule that untracking forced, and the one to keep: **a test whose subject is a
82
+ git-ignored path must distinguish "absent" from "broken".**
83
+ `tests/test_project_actions_v2.py::test_this_repository_ships_actions_that_parse` reads the
84
+ repository's own `.swe-mux/actions.toml` off disk, so it skips with a reason where there is
85
+ no such file (a clone, CI) and still fails where one exists and does not parse - which is
86
+ the only case that costs anyone anything. Collapsing those two into one green result is the
87
+ regression to watch for, and it is what an `except` around the read would silently do.
88
+ The suite was audited for others of this class by recording every git-ignored path any of
89
+ the 5454 tests actually reads (2026-08-28). The only other one is
90
+ `doctor_local._frontend_check` probing `src/swe_mux/static/index.html`, which is already
91
+ written this way on purpose: the bundle is gitignored build output, so the check reports
92
+ "source checkout, not built" rather than failing, and
93
+ `test_doctor_local.py::test_every_category_the_daemon_report_emits_is_covered_or_declared_unchecked`
94
+ asserts only that a category comes back either way.
95
+ - Changing panes, tabs, splits, drag/drop, or the mobile workspace projection:
96
+ `design/features/workspace-layout.md`, `technical/frontend/workspace-state.md`
97
+ - Changing browser chrome, sidebar interaction, settings, focus, or overlays:
98
+ `design/features/ui.md`, `technical/frontend/packages.md`
99
+ - Adding or moving an OpenRouter model setting, or changing how one is chosen or priced:
100
+ `design/features/ui.md`, `technical/frontend/packages.md`, plus the owning feature's doc
101
+ (`design/features/scan-timeline.md`, `design/features/voice.md`,
102
+ `design/features/assistant.md`, `design/features/automation.md`).
103
+ The rule, **reversed 2026-08-25**: every model setting is edited in Settings -> Accounts ->
104
+ Models, rendered from `MODEL_ROUTES` by `ModelRoutingSummary`, and each feature tab keeps a
105
+ read-only row naming its resolved model with a link back.
106
+ The old rule put each control beside the feature it configured, on the grounds that a feature
107
+ is set up in one pass.
108
+ That optimised the wrong axis: changing *endpoint* is the operation that touches all seven at
109
+ once, and under it the split meant four tabs of hunting to find out whether anything had
110
+ broken, with no screen anywhere answering "what does this install call, and does the endpoint
111
+ I just switched to even have it".
112
+ Two controls writing one config key is still forbidden, which is why the feature tabs show
113
+ these read-only rather than duplicating the picker.
114
+ Whether a blank value is legal is still the distinction that matters: an **override** falls
115
+ through to the cheap model, a **pin** is refused by the control (`required`), and the two must
116
+ never render the same.
117
+ Note that the guard tests here assert a *loop*, not seven static controls
118
+ (`modelRouting.test.ts`, `settingsCoverage.test.ts` - which counts membership of
119
+ `MODEL_ROUTES` as the control, because a generated key appears literally in no source).
120
+ - Adding a surface that goes inert behind a switch, changing how one reaches that switch
121
+ (the deep link, the scroll-and-flash arrival, the `data-setting` marks), or adding a
122
+ switch a gate may turn on: `design/features/setting-links.md`, `design/features/ui.md`,
123
+ `technical/frontend/packages.md`; per-Project opt-ins themselves:
124
+ `design/features/automation-enablement.md`.
125
+ The rule the design turns on: a gate **grants** in place and can only ever turn something
126
+ **on**, so many surfaces may switch a thing on while exactly one editor may switch it off -
127
+ that asymmetry is what makes a write reachable from a drawer pane safe. Two things follow
128
+ and are enforced rather than trusted: the grantable keys are closed sets checked against
129
+ `Config` and `PROJECT_CONFIG_FIELDS` at import (`src/swe_mux/grants.py`), and every
130
+ grantable Project field must have a control in the Projects registry
131
+ (`frontend/test/settingTargets.test.ts`) - four authority fields once shipped enforced and
132
+ reachable only by hand-editing a committed TOML file, which is the failure that test
133
+ exists to prevent recurring.
134
+ - Changing what shows or hides the mobile soft keyboard: `design/features/ui.md`,
135
+ `technical/frontend/packages.md`; open ask against the vendored note editor:
136
+ `development/CONTINUITY_TOUCH_KEYBOARD_ASK.md`
137
+ - Changing terminal input ownership across devices, the PTY WebSocket frames, or how a
138
+ shared PTY is sized: `design/features/terminal-input.md`, `design/interfaces.md`,
139
+ `design/features/sessions.md`, `design/features/ui.md`,
140
+ `technical/backend/packages.md`, `technical/frontend/packages.md`; investigating delayed
141
+ terminal input: `development/TERMINAL_INPUT_INCIDENT_RUNBOOK.md`
142
+ - Changing device presence (what counts as "in use", the heartbeat, the leading device):
143
+ `design/features/device-presence.md`, `design/interfaces.md`,
144
+ `design/features/notifications.md`, `design/features/terminal-input.md`
145
+ - Changing the utility drawer (tabs, their segments and sections, which of them are drawn,
146
+ recursive desktop dock/launcher), Action rail placement, or where
147
+ inserted text lands: `design/features/ui.md`, `design/features/workspace-layout.md`,
148
+ `technical/frontend/workspace-state.md`, `technical/frontend/packages.md`;
149
+ completed custom drawer layout implementation record:
150
+ `development/archive/UTILITY_DRAWER_LAYOUT_IMPLEMENTATION.md`.
151
+ The rule the segment registry exists to enforce: a surface folded into another tab keeps its
152
+ own palette command and voice phrase, because a segment reached only by clicking has neither -
153
+ so segments and sections are registered in `drawerSegments.ts` rather than held in a tab's
154
+ local state, their selection persists per Project beside the tab's, and every retired command
155
+ and tab id migrates forward (`keybindings.py`, `drawerLayout.ts`) rather than being dropped.
156
+ - Changing the Resources dialog (its four segments - processes, bandwidth, storage, fleet
157
+ activity - or what any of them measures): `design/features/ui.md`,
158
+ `design/features/processes-and-previews.md`, `design/features/remote-access.md`,
159
+ `design/features/operational-telemetry.md`, `technical/frontend/packages.md`.
160
+ The rule it turns on: the drawer's Processes *tab* is not made redundant by the dialog's
161
+ Processes segment - a modal covers the terminal, and the tab exists to answer "what is this
162
+ session running" beside it - which is the same watch-here/act-there split the prompt Queue
163
+ has with the Fleet Queue.
164
+ - Changing the Usage dialog (its four segments - overview, agents, automation, quota - or how
165
+ any spend figure is drawn): `design/features/usage.md`, `design/features/ui.md`,
166
+ `design/features/automation.md`, `design/features/budgets.md`,
167
+ `technical/frontend/packages.md`.
168
+ The rule it turns on: **the three pots are never summed, and every figure carries its
169
+ basis**. Agent spend is a subscription reconstructed from transcripts and is an estimate,
170
+ automation spend is a metered key billed by the call, and quota is a share of a provider
171
+ window and is not money - so no surface computes a total across them, and a figure drawn
172
+ without its basis is the bug. Its corollary is the one that already shipped wrong once:
173
+ agent spend has *two denominators* (ccusage over every transcript, and
174
+ `provider_cost_dimensions` over only observed runs), so the subset is labelled by its
175
+ denominator everywhere it appears and never presented as the agent total.
176
+ - Changing agent-skill discovery (which CLI directories are scanned, the metadata read from
177
+ them, or how the Actions tab lists them): `design/features/ui.md`, `design/interfaces.md`,
178
+ `technical/backend/packages.md`, `technical/frontend/packages.md`
179
+ - Changing clipboard capture, the clipboard-history ring/panel, or where inserted text lands:
180
+ `design/features/ui.md`, `design/interfaces.md`, `design/data-model.md`,
181
+ `technical/frontend/packages.md`, `technical/backend/packages.md`,
182
+ `technical/backend/sqlite.md`, `design/features/remote-access.md`
183
+ - Changing Windows desktop packaging, WebView, tray, login startup, or daemon shutdown:
184
+ `design/features/desktop-shell.md`, `design/architecture.md`, `design/interfaces.md`,
185
+ `design/features/remote-access.md`, `technical/backend/packages.md`
186
+ - **Adding, removing, or upgrading any dependency** - Python or frontend:
187
+ `packaging/license_audit.py` (the allowlist and the closure walk),
188
+ `THIRD-PARTY-NOTICES.md` and `packaging/third_party_licenses.json` (both generated,
189
+ never hand-edited), `design/features/desktop-shell.md`, `CONTRIBUTING.md`.
190
+ The rule the gate exists to enforce: **a dependency's declared license does not describe
191
+ what its wheel ships.** PyAV declares BSD-3-Clause and links GPL x264/x265; sherpa-onnx
192
+ declares Apache-2.0 and statically links espeak-ng. So the check has two halves that must
193
+ both stay alive - `license_audit.py --check` reads the resolved closure's metadata and runs
194
+ in the verification gate, and `build_desktop.verify_bundle_licenses` reads the built tree
195
+ for the payloads by artifact name. Neither substitutes for the other.
196
+ GPL and AGPL may never enter. LGPL needs an `ALLOWLIST` entry *and* must ship as
197
+ replaceable source under `_internal/<pkg>/`, which is why `pystray` and `num2words` sit in
198
+ the spec's `collect_all` loop. No espeak-ng in any form, which is a dependency-review rule
199
+ rather than a preference (`development/ROADMAP.md` Phase 10.5 holds the measurements).
200
+ After any dependency change: `uv sync --extra desktop --extra voice-local` then
201
+ `uv run python packaging/license_audit.py --write`, and commit both generated files.
202
+ Both extras, because the closure walk is defined over `DISTRIBUTED_EXTRAS` and
203
+ `--write` reads licenses out of what is actually installed. `voice-local` is
204
+ optional to install and mandatory to build from: `num2words` reaches the closure
205
+ through it, so `build_desktop.verify_build_extras_installed` and the
206
+ `redeploy_desktop` preflight both refuse a build without it rather than shipping
207
+ a bundle whose `_internal/num2words/` is missing.
208
+ - Changing the project's own license, trademark posture, contribution terms, or how swe-mux
209
+ describes its relationship to the agent vendors: `LICENSE`, `NOTICE`, `TRADEMARK.md`,
210
+ `CONTRIBUTING.md`, `README.md`, `site/index.html`,
211
+ `design/features/provider-accounts.md` ("Scope and terms"),
212
+ `development/ROADMAP.md` Phase 10.5 (the recorded decisions and why MIT, AGPL, and a CLA
213
+ were each rejected). Contributions arrive under a DCO sign-off, not a CLA; that choice is
214
+ what makes relicensing the core impossible later, and it is deliberate.
215
+ - Changing reusable prompt templates: `design/features/prompt-library.md`,
216
+ `design/interfaces.md`, `design/data-model.md`
217
+ - Changing the prompt queue (message model, states, head-of-line, send-next, stranding,
218
+ Queue tab, send-to-agent senders, new-session seed staging):
219
+ `design/features/prompt-queue.md`, `design/features/delivery-readiness.md`,
220
+ `design/interfaces.md`, `design/data-model.md`, `technical/backend/packages.md`,
221
+ `technical/frontend/packages.md`
222
+ - Changing gated auto-delivery (the per-conversation default/override, stability window, quiet hours,
223
+ emergency pause, item scheduling/expiry, the consecutive-send cap and what clears it, mid-turn
224
+ delivery, the reply window and what counts as evidence for it, or the promotion criteria):
225
+ `design/features/auto-delivery.md`, `design/features/prompt-queue.md`,
226
+ `design/features/delivery-readiness.md`, `design/features/agent-messaging.md`,
227
+ `design/features/land-queue.md`,
228
+ `design/interfaces.md`, `design/data-model.md`
229
+ - Changing who may stage a queue message **armed** - the Phase 5 floor, `solicited_by`, or
230
+ which non-human senders the auto-delivery controller will act on:
231
+ `design/features/agent-messaging.md`, `design/features/auto-delivery.md`,
232
+ `design/features/land-queue.md`, `design/data-model.md`,
233
+ `technical/backend/packages/agent-surfaces.md`, `technical/backend/sqlite.md`.
234
+ The rule the design turns on: arming is **never** the sender's claim, and there are exactly
235
+ two forms of receiver authorization - the target's standing `accept_agent_messages` grant,
236
+ and a per-message `solicited_by` naming a request the target itself made. The floor ("a
237
+ non-human sender's write ends at a human") is about *unsolicited* writes, so answering a
238
+ request the receiver explicitly made narrows it rather than eroding it - and the narrowing
239
+ is only legitimate while it stays exactly as wide as the request: the requester alone, a
240
+ fixed daemon-authored template, the run that asked, a per-request cap, and off with the
241
+ authority that accepted the request. Arming is still not delivery, and refusing to arm is
242
+ never refusing the message.
243
+ - Changing agent-to-agent messages, the fleet queue (the app-wide authorship view, served
244
+ by the older-named `/api/queue/mailbox`), sender provenance, or drafted spawn requests:
245
+ `design/features/agent-messaging.md`, `design/features/mux-mcp.md`,
246
+ `design/features/observations.md`, `design/features/prompt-queue.md`,
247
+ `design/features/ui.md`, `design/interfaces.md`, `design/data-model.md`
248
+ - Changing root-session or quota-reset sounds: `design/features/notifications.md`,
249
+ `design/features/voice.md`
250
+ - Changing web push, which device a notification reaches, or the notification preference
251
+ shape: `design/features/notifications.md`, `design/features/device-presence.md`,
252
+ `design/interfaces.md`, `technical/backend/packages.md`,
253
+ `technical/frontend/packages.md`
254
+ - Changing managed-harness account capture, switching, or quota polling:
255
+ `design/features/provider-accounts.md`, `design/features/backends.md`
256
+ - Changing history, transcripts, or cross-vendor review: `design/features/history.md`,
257
+ `design/interfaces.md`
258
+ - Changing how a transcript is linearized - which records count as the conversation, what a
259
+ retry or `/rewind` leaves behind, or anything reading `parentUuid`:
260
+ `design/features/transcript-branches.md`, `design/features/history.md`,
261
+ `design/interfaces.md`, `technical/backend/packages.md`.
262
+ The rule the split exists to enforce: a Claude transcript is an append-only DAG, so the
263
+ indexing projection drops the branches the conversation left and the human reader marks
264
+ them - and neither may reconstruct the live branch from the parent chain alone, because a
265
+ parallel tool batch parents each result to its own call and a chain walk would drop every
266
+ result but the last.
267
+ - Changing Git status, comparison, diff review, first-time repository initialization, or worktree tooling:
268
+ `design/features/git.md`, `design/features/project-resources.md`, `design/interfaces.md`,
269
+ `technical/backend/packages.md`, `technical/frontend/packages.md`,
270
+ `technical/frontend/workspace-state.md`.
271
+ Two rules worktree *removal* turns on. The deletion is moved off the request - the checkout
272
+ is renamed into `<git-common-dir>/swe-mux-graveyard` and purged in the background - and that
273
+ location is load-bearing rather than tidy: outside every working tree (a buried checkout in
274
+ `git status` would raise dirty counts and make the land queue refuse that checkout), inside
275
+ `.git` so no watcher walks the purge, and never in `git worktree list`. What drops the
276
+ registration is `git worktree remove` on the original path, never `git worktree prune`,
277
+ which is global and would take every other checkout whose directory is merely missing. The
278
+ rename is *declined* wherever it would change what the removal means (locked, submodules,
279
+ unclean without force), so Git's own refusals stay Git's. And the "removing" indication is a
280
+ property of the **list**, never of a row: a row's own state stops when the row is collapsed,
281
+ and the removal's response ends it too early on both paths, so only the refreshed inventory
282
+ no longer listing the checkout ends it.
283
+ - Changing the land queue (its pipeline steps, preconditions, the verification gate, its
284
+ approval or its editor, what a running gate reports, the grant, the Land control on a Map
285
+ row, or the landing strip at the head of that map): `design/features/land-queue.md`,
286
+ `design/features/git.md`, `design/features/project-actions.md`,
287
+ `design/features/setting-links.md`, `design/features/ui.md`,
288
+ `design/features/prompt-queue.md`, `design/features/automation-enablement.md`,
289
+ `design/features/mux-mcp.md`, `design/interfaces.md`, `design/data-model.md`,
290
+ `technical/backend/packages.md`, `technical/backend/sqlite.md`,
291
+ `technical/frontend/packages.md`.
292
+ The rule the design turns on: the pipeline executes a *fixed* git vocabulary and never
293
+ decides anything - fast-forward-only is what makes the trunk step safe for a machine,
294
+ because Git refuses it on divergence and refuses to overwrite local changes, so the
295
+ pipeline cannot lose work by construction. A conflict and a failed gate both need
296
+ intelligence and both belong to the branch's own agent, so they leave as a bounded
297
+ deterministic message rather than being resolved here. And the verification command is
298
+ *not* a Project Action: an action's cwd is bounded by the Project root and deliberately
299
+ denied the sibling-worktree widening, so it borrows only the exact-content approval,
300
+ which is what stops an agent approving the command its own land runs - editing the
301
+ command and approving it stay two acts against two routes, and a write can never produce
302
+ an approved command because the approval is a digest over the bytes it just moved.
303
+ *Which* gate runs is decided by a `classify` step, and it stays on the executing side of
304
+ the same line: matching paths against a **closed** documentation allowlist is a total
305
+ function with no model, heuristic, or configuration in it, so it is not a decision -
306
+ what would cross the line is judging whether a change "looks risky". Everything it
307
+ cannot answer with certainty answers "the full gate", including a rename between two
308
+ documents; and the classification is recorded on **both** outcomes, with the skipped
309
+ `verify` step still present in the trail and the class persisted on the row, because a
310
+ documentation-only land never enters `verifying` and would otherwise read exactly like
311
+ one that passed three minutes of pytest.
312
+ A *second* way to skip it obeys the same audit rule: a request comes in one of two
313
+ **kinds**, and the kind decides exactly one thing - whether the fast-forward happens.
314
+ A `verify` request runs every earlier step identically, which is what makes its verdict
315
+ the verdict a land would have produced, and that verdict is kept against the git
316
+ **tree** it ran over and the **digest** of the command that ran (the tree, not the
317
+ commit: a reconcile over an unchanged trunk makes a new commit over identical content,
318
+ which is exactly the case a commit key would miss). A later land over the same content
319
+ skips the gate and records the reuse *with its key*, so it is checkable rather than
320
+ asserted; a moved trunk yields a new tree and the gate runs again, which is correct.
321
+ Only a run the queue executed is ever kept - an agent's own shell run is self-reported
322
+ and has a file-swap loophole (run modified bytes, restore the approved file) - and that
323
+ same asymmetry is why a green self-run does not let an agent land itself: the gate is
324
+ the expensive part, not the authoritative one, and landing outside the queue puts a
325
+ second writer on the primary checkout, skips the per-mutation preconditions, and leaves
326
+ the audit and provenance with a hole where that land was.
327
+ A second rule governs what a *running* gate may say: every signal is observed or absent,
328
+ never estimated. A step number counts markers the gate itself printed, a step *total*
329
+ exists only where a byte-identical run has already passed and is withdrawn the moment a
330
+ run overruns it, a line count is stated as evidence of output rather than as progress,
331
+ and no percentage is derived at either end - the steps of this repository's own gate take
332
+ 45s and 3s in one run, so a denominator drawn as a proportion would be fiction, and a
333
+ wrong number is acted on where an absent one is not.
334
+ The reading is in memory and dies with the process; only the *plan* is durable, because
335
+ it is a measurement of bytes rather than of a run.
336
+ A third rule governs *where* landing is drawn: it has no surface of its own, and each
337
+ part lives once, decided by what it is a property of. A worktree row owns the act and
338
+ nothing else, because a row is repeated per checkout and a Project-wide fact drawn there
339
+ is drawn N times - which is what the verification block did under every expansion before
340
+ it moved. A compact strip at the head of the map owns the queue, the verification
341
+ command, and the grants; a blocked row *opens* it rather than drawing a second copy of
342
+ its control. Retiring the Land segment did not delete its palette command, its voice
343
+ phrases, a stored selection, or a keybinding - all four migrate onto Map and the rows
344
+ stay forever (`drawerSegments.ts`, `drawerLayout.ts`, `keybindings.py`).
345
+ Two consequences of that strip always speaking while folded. Its headline picks the most interesting
346
+ row, so a bounced request must stop speaking once a *later* request for its branch got
347
+ an answer - nothing closes the old row and the redo is a new id, so without the rule the
348
+ strip reports a branch as returned-to-agent forever; and it is derived at the reading
349
+ rather than written back, because the trail is an audit that must go on saying the
350
+ handback happened. And the verification section's copyable setup prompt for another
351
+ repository ends by telling the receiving agent it cannot approve what it wrote - the
352
+ daemon enforces that regardless, but a prompt that omitted it would send an agent to do
353
+ work whose last step it is not allowed to take, without saying so.
354
+ - Changing attention ranking, the interrupt budget, the four delivery channels, breakpoint
355
+ detection, the absence digest, mined demotion rules, or model narration:
356
+ `design/features/attention-ranking.md`, `design/features/deterministic-consumers.md`,
357
+ `design/features/fleet-intelligence.md`, `design/features/automation-enablement.md`,
358
+ `design/interfaces.md`, `design/data-model.md`, `technical/backend/packages.md`,
359
+ `technical/backend/sqlite.md`, `technical/frontend/packages.md`
360
+ - Changing automation, observers, attention, or legacy hooks:
361
+ `design/features/automation.md`, `design/features/fleet-intelligence.md`,
362
+ `design/features/meta-hooks.md`, `design/features/delivery-readiness.md`.
363
+ The rule the presentation turns on: the pipeline produces exactly two things - an attention
364
+ item or a run note. Run notes keep exactly one home (Activity → Findings); attention items
365
+ have two surfaces (the Alerts drawer tab and the Automation dashboard's Activity tab), and
366
+ the second is the SAME `AttentionInbox` component over the same endpoints, so mirroring is
367
+ done with components, never copies - the rule `AutomationSpendView` already carries for
368
+ spend (Usage ↔ Automation → Usage). The dashboard is three tabs (Policy | Usage |
369
+ Activity) and its Policy matrix is the ONE editor that may turn an automation off in
370
+ either scope - the install-wide ceiling (`automation_global_allow` + the dedicated
371
+ switches) and every Project opt-in - which is what keeps every grant gate additive-only.
372
+ The install limits live behind the Policy tab's Limits & budgets disclosure; Settings →
373
+ Automation only shows status and links there.
374
+ - Changing session status detection, the transition ledger, the state watchdog,
375
+ awaiting sub-reasons, the detection golden corpus, or status-health diagnostics:
376
+ `design/features/status-detection.md`, `design/features/delivery-readiness.md`
377
+ - Changing control-plane approvals (the per-conversation mode, the allow rules, the
378
+ never-auto-approved floor, the decision hook, or the approval strip):
379
+ `design/features/approvals.md`, `design/features/status-detection.md`,
380
+ `design/features/backends.md`, `design/interfaces.md`, `design/data-model.md`,
381
+ `technical/backend/packages.md`, `technical/frontend/packages.md`.
382
+ The rule the design exists to enforce: a decision is made from the harness's structured
383
+ permission request, never from the PTY screen, and the floor in `approvals.py` is checked
384
+ before the mode so no configuration can reach past it. `deny` is deliberately not a
385
+ decision mux ever makes.
386
+ - Changing the durable status timeline (its table, sink, layer readings, or the
387
+ state-log/diagnostic-bundle endpoints) or the incident investigation procedure:
388
+ `design/features/status-detection.md`, `design/interfaces.md`, `design/data-model.md`,
389
+ `technical/backend/sqlite.md`, `technical/backend/packages.md`,
390
+ `development/STATUS_INCIDENT_RUNBOOK.md`
391
+ - Changing background-loop supervision, per-loop cost accounting, event-loop lag sampling,
392
+ or the performance investigation procedure: `development/PERFORMANCE_RUNBOOK.md`,
393
+ `technical/backend/packages.md`, `design/interfaces.md`
394
+ - Changing what a `daemon.log` line carries, how a request is correlated across it, or how a
395
+ raised exception becomes an HTTP status: `technical/backend/packages/daemon-runtime.md`
396
+ (`logsetup.py`, `errors.py`, `http_support.py`, the middleware chain), `design/interfaces.md`
397
+ ("Error shapes every route shares").
398
+ Three rules the split exists to enforce. **A field a call site passes must reach the sink**:
399
+ the format string used to drop every `extra=` keyword, so instrumentation written years apart
400
+ produced nothing, and anything added to `LOG_FORMAT` or to a handler's formatter has to keep
401
+ `StructuredFormatter`. **The correlation filter goes on handlers, never on a logger**:
402
+ `Logger.handle` consults only the filters of the logger the call was made on, so one on root
403
+ looks armed and stamps nothing a submodule logs. And **a deliberate refusal and a bug must
404
+ not be the same answer**: `errors.NotFound` is the 404, a bare `KeyError` or `TypeError` is a
405
+ 500 with a traceback, and a 404 body names the *kind* of thing that was missing and never
406
+ echoes the key the caller sent.
407
+ - Changing what the daemon does before it can serve - adding a startup phase, moving one
408
+ behind the listener, or changing what health says while the runtime is being built:
409
+ `development/PERFORMANCE_RUNBOOK.md` (§Startup latency), `design/architecture.md`
410
+ (invariant 15), `design/interfaces.md`, `design/features/desktop-shell.md`,
411
+ `technical/backend/packages/daemon-runtime.md`, `technical/backend/sqlite.md`.
412
+ Two rules the split exists to enforce. **A bound listener is not a ready daemon**: health
413
+ answers 503 with the phase in flight until the runtime exists, and every consumer decides on
414
+ readiness rather than reachability - a 200 during the build would have the tray, the redeploy
415
+ wait, and the browser's post-restart reload each declare a daemon usable that cannot answer a
416
+ single request. And **nothing may run unlogged for minutes**: a phase is named and timed *and*
417
+ reported while it is still running, because both silent stretches of the 226.6s start this was
418
+ built for were work in flight, which a completion line would never have shown. Anything that
419
+ blocks the event loop on this path defeats both, so it goes in a thread.
420
+ Measure before moving a phase: the obvious suspect (a 2.73 GB `mux.db`) was innocent and the
421
+ real cost was a per-store integrity probe nobody had timed.
422
+ - Changing HTTP/WebSocket traffic accounting, response compression, static precompression,
423
+ or browser polling cadence: `design/features/remote-access.md`, `design/interfaces.md`,
424
+ `design/features/processes-and-previews.md`, `development/PERFORMANCE_RUNBOOK.md`,
425
+ `technical/backend/packages.md`, `technical/frontend/packages.md`
426
+ - Changing scheduled runs (the triggers and their wall-clock/DST arithmetic, the missed-window
427
+ policy, the fire guards, the resume action and its target kinds, the Schedule drawer tab, or
428
+ where a definition is stored):
429
+ `design/features/scheduled-runs.md`, `design/features/automation-enablement.md`,
430
+ `design/features/prompt-queue.md`, `design/features/history.md`, `design/features/ui.md`,
431
+ `design/interfaces.md`, `design/data-model.md`, `technical/backend/packages.md`,
432
+ `technical/backend/sqlite.md`, `technical/frontend/packages.md`.
433
+ The rule the design turns on: a schedule is a *user-authored deferred press of a button the
434
+ author could have pressed themselves*, so it goes through the ordinary spawn path, the
435
+ ordinary resume path (`session_resume.py`, shared with the History Resume button) and the
436
+ ordinary prompt queue, and never grows a second authority; a resume names its conversation by
437
+ history *run* id rather than session id, because a session is exactly the thing that drifts;
438
+ and the definitions stay machine-local, because a schedule committed to a repository would
439
+ arm itself in every clone and worktree.
440
+ - Changing per-project automation opt-in, the enablement dependency graph, or its toggle
441
+ surface: `design/features/automation-enablement.md`,
442
+ `design/features/project-resources.md`, `design/data-model.md`, `design/interfaces.md`
443
+ - Changing the model-free control-plane detectors (loop/stall, declared-vs-verified,
444
+ doc debt, provenance) or the annotation anchor/evidence schema:
445
+ `design/features/deterministic-consumers.md`, `design/features/tier0-facts.md`,
446
+ `design/data-model.md`, `technical/backend/packages.md`
447
+ - Changing Tier 0 deterministic fact capture or its source pointers/fingerprints:
448
+ `design/features/tier0-facts.md`, `design/data-model.md`,
449
+ `technical/backend/packages.md`, `technical/backend/sqlite.md`
450
+ - Changing the code-structure graph (tree-sitter engine, import resolution, the
451
+ graph tables, blast-radius/navigation/context/test-gap MCP tools, the
452
+ blast-radius/dead-code/god-node/import-cycle annotations, the doc-debt reach
453
+ refinement, or the per-session change map): `design/features/code-graph.md`,
454
+ `design/features/mux-mcp.md`, `design/features/deterministic-consumers.md`,
455
+ `design/features/automation-enablement.md`, `design/features/desktop-shell.md`
456
+ (grammar bundling), `design/interfaces.md`
457
+ - Changing the user-owned Project context card (its fixed file, editor, bounds, revision contract, setup prompt, or scan prefix): `design/features/project-card.md`, `design/features/automation-enablement.md`, `design/data-model.md`, `design/interfaces.md`, `technical/backend/packages.md`, `technical/frontend/packages.md`
458
+ - Changing the scan timeline, per-run scan grant, rollover boundary, scan budgets, source
459
+ rehydration, dead-end extraction, or the agent-readable scan surface
460
+ (`scan_timeline`/`scan_search`, the record projection, the digest bounds):
461
+ `design/features/scan-timeline.md`, `design/features/mux-mcp.md`,
462
+ `design/features/automation-enablement.md`, `design/features/automation.md`,
463
+ `design/data-model.md`, `design/interfaces.md`, `technical/backend/packages.md`,
464
+ `technical/backend/sqlite.md`, `technical/frontend/packages.md`.
465
+ Two rules the split exists to enforce: `ScanTimelineService.liveness()` is the single owner
466
+ of the enablement/liveness block, because a scanner stopped by a budget cap and a quiet
467
+ session both return an empty tail and two implementations would eventually disagree about
468
+ which one you are looking at; and no scan or backfill trigger is reachable from MCP, because
469
+ a read costs nothing while a scan spends the human's gated budget.
470
+ - Changing the agent MCP surface (endpoint, tools, per-session tokens, CLI registration):
471
+ `design/features/mux-mcp.md`, `design/interfaces.md`, `technical/backend/packages.md`
472
+ - Changing session-settle watches (`watch_session`, the fire rules, the settle hold, the
473
+ notice template, or the per-watcher bounds): `design/features/mux-mcp.md`,
474
+ `design/features/prompt-queue.md`, `design/features/status-detection.md`,
475
+ `design/interfaces.md`, `design/data-model.md`,
476
+ `technical/backend/packages/agent-surfaces.md`.
477
+ The rule the design turns on: a watch is a **read that matures into exactly one bounded
478
+ message**, addressed to the session that armed it, so it needs no grant and no opt-in -
479
+ and the moment a watch could address a third session, or act instead of report, it stops
480
+ being that and needs the authority model interrupt/end already have. Two consequences are
481
+ load-bearing and neither is optional: the timeout always fires, because a watch that
482
+ quietly evaporates is indistinguishable from a worker that hung; and `idle` alone is
483
+ never reported as finished, because `awaiting` and idle-with-running-background-work are
484
+ the two states that render identically and mean the opposite.
485
+ - Changing the observation inbox: `design/features/observations.md`, `design/interfaces.md`,
486
+ `design/data-model.md`
487
+ - Changing preview screenshot capture or the region selector:
488
+ `design/features/processes-and-previews.md`, `design/interfaces.md`
489
+ - Changing processes, listeners, Preview ownership/proxying, or Preview tab lifetime:
490
+ `design/features/processes-and-previews.md`, `design/features/remote-access.md`,
491
+ `technical/backend/packages.md`, `technical/frontend/workspace-state.md`
492
+ - Changing static document previews (serving a page from the checkout, its entry allowlist,
493
+ its served directory, or where it is launched from): the same four, plus
494
+ `design/features/project-resources.md` for the file-browser and file-tab entry points and
495
+ `design/interfaces.md` for the `POST /previews` static body.
496
+ The rule it turns on: a static preview is a second *kind* on the one registry, never a
497
+ second viewer - so anything that reads a registration must branch on `kind` and not on
498
+ whether a session id happens to be empty.
499
+ - Changing headless-browser ghost-window detection, the sweep predicate, or its remediation:
500
+ `design/features/ghost-windows.md`, `technical/backend/packages.md`
501
+ - Changing durable process/quota/reset/compaction/tool evidence or retention:
502
+ `design/features/operational-telemetry.md`, `design/data-model.md`, `design/interfaces.md`
503
+ - Changing launch profiles (shell or agent), profile resolution, or reserved harness argv: `design/features/launch-profiles.md`
504
+ - Evaluating or changing host-OS support, Windows shell compatibility, WSL behavior,
505
+ platform packaging, or the external compatibility matrix:
506
+ `development/CROSS_PLATFORM_FINDINGS.md`, `design/features/launch-profiles.md`,
507
+ `design/features/backends.md`, `design/features/project-actions.md`,
508
+ `development/ROADMAP.md`
509
+ - Changing anything behind a platform seam - pseudoterminal allocation, process-tree
510
+ ownership, path identity, where secrets rest, or where the data directory lives:
511
+ `technical/backend/packages.md` (the per-module map), `development/ROADMAP.md` Phase 10.
512
+ The rule the seams exist to enforce: `host_platform.py` answers *which host this is* and
513
+ nothing else, while whether a capability exists is answered by the module that owns it -
514
+ a capability can be absent on a supported platform, and conflating the two is how a port
515
+ starts claiming parity it does not have.
516
+ Verify a change on both hosts, not one: `tools/linux_container_verify.sh` runs the suite
517
+ on Linux from a Windows host with only Docker, and `.worktree-verify` runs the two
518
+ `--platform` mypy passes so each host's implementation is typechecked wherever the gate runs.
519
+ - Changing the WSL agent bridge (distro-side discovery, path translation, the bridge script,
520
+ the WSL listener, or its firewall rule): `src/swe_mux/wsl_bridge.py`,
521
+ `design/features/backends.md`, `development/ROADMAP.md` Phase 10.
522
+ Its failure mode is silence by construction - a bridged agent that cannot reach the daemon
523
+ runs perfectly and simply never reports - so any change must keep the reachability probe
524
+ and the `reasons` it produces, and must never let "not checked" render as available.
525
+ - Changing a spending cap, adding one, or changing what a cap is denominated in:
526
+ `design/features/budgets.md`, plus the owning feature's doc
527
+ (`design/features/automation.md`, `design/features/scan-timeline.md`,
528
+ `design/features/assistant.md`, `design/features/voice.md`,
529
+ `design/features/attention-ranking.md`, `design/features/project-card.md`),
530
+ `design/data-model.md`, `design/interfaces.md`, `design/features/setting-links.md`.
531
+ Two rules the split exists to enforce. Every cap is `{tokens?, usd?, mode}` edited through one
532
+ control, and migration maps a pre-existing cap onto the mode matching the unit it already
533
+ enforced - so a config written by the previous build enforces exactly what it enforced before,
534
+ and adding a cap without giving it the choice is the regression to watch for. And a dollar cap
535
+ cannot bind against a provider that reports no cost: absent cost is unknown, never zero, so the
536
+ ledger records it as unmeasured (`cost_known`), every total drawn over it reads as a floor, and
537
+ the token axis is the honest backstop. Rate limits and per-call ceilings are deliberately *not*
538
+ budgets: they count acts and bound one request, never a period's spend.
539
+ - Changing usage analytics: `design/features/usage.md`
540
+ - Changing read aloud or hands-free conversation: `design/features/voice.md`;
541
+ completed voice-interaction phases and their decisions:
542
+ `development/archive/VOICE_INTERACTION_ROADMAP.md`
543
+ - Changing a TTS provider, provider package boundary, voice discovery, or synthesis output:
544
+ `design/features/voice.md`, `design/interfaces.md`,
545
+ `technical/backend/packages/voice-and-assistant.md`,
546
+ `technical/frontend/packages/voice-and-assistant.md`, `design/features/desktop-shell.md`, and
547
+ the dependency/license routing entry in this file.
548
+ - Changing the Mux assistant (the chat surface, the tool bridge, the trust policy, the
549
+ voice fallback tiers, or its dialogs/actions): `design/features/assistant.md`,
550
+ `design/features/voice.md`, `design/interfaces.md`, `technical/backend/packages.md`,
551
+ `technical/frontend/packages.md`; the plan: `development/ROADMAP.md` Phase 10.6.
552
+ The rule the design enforces: the model proposes names, deterministic code resolves and
553
+ executes through existing paths, and the consequential-action confirmation floor is not
554
+ configurable.
555
+ A second rule governs what is *said*: a turn is one speech stream fed progressively as the model writes and batched into natural audio segments by the daemon,
556
+ as the model writes it, a confirmation card is announced once by the daemon-built line and
557
+ everything the model says afterwards is display-only, and an identical proposal is answered
558
+ with the existing action rather than a second card - because a confirmation is never a turn,
559
+ so nothing in the message log records that the operator already said yes.
560
+ A third rule governs what a turn can *get done*: it has a round budget it is told about and
561
+ asked to batch against, running out of rounds is announced rather than silent, and anything
562
+ the operator says while a turn runs is queued (and merged with the next fragment) rather than
563
+ refused - a refusal had nowhere to go and simply lost what they said.
564
+ A card is announced **once per card**, never per event, and its cancel window moves **once**:
565
+ extending re-emits the card and a device announces a card when it sees one, so a second
566
+ extension closes that into a loop that talks over the operator with no way to stop it
567
+ (2026-08-20). Announcing joins the stream already speaking; only a spoken verdict interrupts.
568
+ - Changing listeners, Tailscale, browser security, or remote operation:
569
+ `design/features/remote-access.md`
570
+ - Planning remaining work: `development/ROADMAP.md`; control-plane plan + completion
571
+ checklist (start at §9): `development/CONTROL_PLANE_ROADMAP.md`; the completed
572
+ audit-remediation programme and the decisions its twelve packages recorded:
573
+ `development/archive/ROADMAP_V2.md` (source findings:
574
+ `development/CODE_QUALITY_AUDIT_2026-08-23.md`).
575
+ Two things there are still forward-looking rather than history: § S12 holds the C901
576
+ step-down plan that `pyproject.toml` and the root `CLAUDE.md` both point at, and § S12.2
577
+ names `component-jsx` and `composition-root` as the source-text test debt a renderer
578
+ harness is the way off.
579
+ - Changing launch marketing material - blog/post drafts, the positioning line, or the venue
580
+ checklist: `marketing/README.md` (index + rules) and `development/ROADMAP.md` Phase 11.
581
+ The rule the drafts carry: every claim must be true of the shipped artifact on the day it
582
+ posts, `[verify]` markers are re-measured before publishing, and the positioning line is
583
+ one string used verbatim everywhere.
584
+ - Changing what an **installed** copy looks like from the operator's side - an install, upgrade,
585
+ or uninstall path; what an uninstall leaves behind; where the data directory or any file under
586
+ it lives; what `mux doctor` answers in either mode, including its exit codes; a recovery
587
+ procedure for a daemon that will not start, sessions that look lost, or a missing frontend
588
+ bundle; or what is worth backing up: `development/OPERATOR_LIFECYCLE.md`, plus the source of
589
+ the fact you changed - `src/swe_mux/config.py` (`default_data_dir`, the data-dir children),
590
+ `src/swe_mux/doctor.py` and `src/swe_mux/doctor_local.py` (the two reports),
591
+ `src/swe_mux/cli.py` (the exit-code contract), `pyproject.toml` (extras, entry points,
592
+ `requires-python`), `README.md`, `RELEASING.md`, `SECURITY.md`.
593
+ Two rules that document carries. **Every command, path, flag, and exit code in it is verified
594
+ against the repository rather than plausible** - it is read by someone whose install is already
595
+ broken, so a command that does not exist costs them the one thing they came for. And **it states
596
+ what is not yet true rather than describing an intention**: swe-mux is not on a package index
597
+ yet, so the `uv tool`/`pipx` commands are documented from `pyproject.toml` metadata and marked
598
+ as unexercised, and the platform matrix is read out of `.github/workflows/ci.yml` rather than
599
+ out of any prose summary.
600
+ Note that the *validation* half of Phase 11's item ("Validate `uv tool install swe-mux` and
601
+ `pipx install swe-mux`") needs PyPI and a clean machine and stays with the operator
602
+ (`development/RELEASE_MANUAL_TASKS.md` § 6); only the documentation half lives here.
603
+ - Changing backend package ownership or shared SQLite behavior:
604
+ `technical/backend/packages.md`, `technical/backend/sqlite.md`
605
+
606
+ # Audio (voice) system — quick reference
607
+
608
+ Full detail: `design/features/voice.md`. Two independent halves in one `VoiceService`
609
+ (`src/swe_mux/voice.py`):
610
+
611
+ - **Read aloud (TTS):** `turn_ended` (auto, 1s debounce) or manual → last-turn slice →
612
+ `summary` (OpenRouter cheap model, budgeted under `builtin:voice-summary`) or `verbatim`
613
+ (`speechify`, no LLM) → OS voice (SAPI), local Kokoro-82M, or explicit experimental
614
+ external Edge TTS → WAV/MP3 clips in `<data_dir>/voice/` + `voice_clips` SQLite.
615
+ Edge is never bundled: `edge_tts_provider.py` runs the shipped Apache bridge under an isolated
616
+ managed or operator-supplied Python containing the LGPL client, requires a versioned
617
+ service/privacy acknowledgement before text leaves the machine, and exposes only explicit
618
+ install/probe/catalog-refresh network operations.
619
+ The managed install is user-gesture-gated, `uv`-driven, staged and bridge-verified before its
620
+ atomic activation under `<data_dir>/integrations/edge-tts/current`; its phases are cached status,
621
+ not a request held open.
622
+ One immutable `TtsProfile` owns every segment in a stream, and provider-aware
623
+ `synthesis_key` reuse prevents an old provider, voice, prosody, model, or lexicon from
624
+ satisfying a newly configured request.
625
+ Words the Kokoro repair ladder can only spell out letter by letter are fixable with a
626
+ `tts_kokoro_lexicon` respelling (Settings → Voice; hot-applied), and each spell-out is recorded
627
+ durably (`spelled_words.json`, surfaced as `kokoro_spelled_words` by `GET /api/voice`) with a one-tap respell there.
628
+ A respelling must itself be pronounceable (the editor checks each row via
629
+ `POST /api/voice/lexicon/check` and auditions via `GET /api/voice/lexicon/preview`);
630
+ exact sounds use misaki's `[word](/phonemes/)` form, atomic in the ladder.
631
+ Automatic and manual read-aloud keeps ordinary replies in one coherent clip and returns a complete opening sentence for longer streams before tracked background tasks synthesize the remaining clips.
632
+ Trusted application speech opens around a natural 120-character boundary with a 200-character hard ceiling, then combines later complete sentences up to 420 characters.
633
+ Those segments are **rows, not clips**: `stream_id`/`segment_index`/`segment_count` (schema 3) make one reply one entry everywhere a person looks (`clip_groups`/`group_snapshot`, growing live as its segments land), a completed stream is joined into a single file under a new id with the segments kept servable for ten minutes, eviction and deletion take whole streams, and pre-schema-3 rows are discarded by the migration because they cannot be reassembled.
634
+ The assistant opens an empty acknowledgement-only application stream, appends raw sentence fragments without waiting for synthesis, and lets the daemon batch accumulated text once while the preceding clip encodes; one worker per stream keeps clip indices monotonic, and `voice_stream_closed` marks the end.
635
+ Browser playback uses one active singleton audio element plus one standby preload element; measured handoff diagnostics distinguish synthesis starvation from browser media delay, and confirmed speech hard-stops and suppresses the whole current stream.
636
+ Read aloud is **one policy in three ordered layers**: the `tts_enabled` master (off = nothing generates *or* plays, enforced on the auto path, `generate`, and `speak` alike), per-session `voice_mode` (does *this session* generate), and the device autoplay toggle plus a global focus rule — the focused session plays here and every other session **holds** its clip, surfaced as `▶ n held` on that pane's strip and in the command palette rather than spoken over the operator. Settings → Voice renders the three as one numbered block and owns the master; the voice panel's `tts` tab is the operational surface for layers 2 and 3 and for the global clip list, ordered by the *source message's* arrival (`voice_clips.source_ts`/`message_anchor`) rather than by synthesis time.
637
+ Failures are typed `VoiceError` and never touch the PTY/history/transcripts.
638
+ - **Conversation (STT):** browser capture through an `AudioWorklet` → 512-sample 16 kHz frames →
639
+ **Silero VAD** (`sileroVad.ts`, lazy ~11 MB WASM runtime + ~2.3 MB ONNX model assets; energy detector as fallback) → the
640
+ frame-counted endpoint gate (`speechGate.ts`: 352 ms tail, speculative decode at 160 ms) →
641
+ `voice/transcribe` → faster-whisper, **two decode profiles** (`command` = `small.en` greedy,
642
+ `dictation` = `turbo` with beam 5 above 3 s), decoded from memory with no disk write →
643
+ wake-word + command-phrase **suffix**, which a speculative transcript can use to short-circuit the remaining tail → one workspace-level draft targeting the focused Agent or text surface.
644
+ App-owned Talk state renders in the focused pane's floating voice overlay, with a fixed top fallback when no terminal pane is visible.
645
+ It names the target, supports an exact-target pin, keeps the draft across focus changes, and retains a device-local user/Mux history.
646
+ Dynamic navigation, direct spawn, typed fleet/help/reply queries, and guarded approvals resolve through voice aliases on the ordinary command registry.
647
+ With a running session focused, that registry also exposes terminal copy/paste, explicitly voiced safe rail keys, and configured agent skill/slash rail items through `railVoice.ts`.
648
+ It excludes attachments, keyboard mode, composer-clearing keys, arbitrary prompt/text macros, and destructive rail actions.
649
+ Those commands execute through the mounted terminal owner and report its acknowledgement instead of assuming a PTY action succeeded.
650
+ Spoken navigation uses live hierarchical indexes without requiring a prior list: `Project N` follows visible sidebar order, bare `Session N` follows the selected Project's sidebar session order, `next/previous session` traverses that same Project-scoped order without wrapping, and `Project N Session N` resolves both coordinates atomically.
651
+ Spoken lists retain those canonical addresses, speak five explicitly separated items at a time, and keep five-minute device-local paging context for next/repeat/detail follow-ups.
652
+ Playback leaves capture open; possible speech immediately ducks app audio, waits three frames for echo to drain, then three accepted frames on the quiet mic stop the whole stream before transcription and continue as ordinary dictation or wake-word command input. Rejected echo restores playback. Bare `Mux, stop` stops playback without releasing Talk.
653
+ Agent Send and Append use the mounted terminal's acknowledged xterm path, so Send appends to an existing composer, waits 180 ms for bracketed-paste commit, and then uses the same carriage return as the visible mobile control.
654
+ Note, Scratchpad, Markdown, and Queue-composer Send and Append only insert at the caret without staging or delivering a queue item.
655
+ Voice Comms pins one Agent, prepends a short-response protocol once per run, and temporarily enables automatic verbatim playback until restored.
656
+ Capture always decodes through session-free `/api/voice/transcribe`.
657
+ Wake words and the phrase→action map are user-configurable (`voice_wake_words` /
658
+ `voice_commands` in config, editable in Settings → Voice; `buildVoiceMatcher` compiles them).
659
+ Fixed action set: `send`/`append`/`cancel`/`undo`/`mute`/`read`/`summary`/`verbatim`/`interrupt`/
660
+ `help`/`standby`/`resume`/`hold`/`proceed`/`comms_on`/`comms_off`/`stop`. `standby` keeps the mic on but ignores everything except a
661
+ `resume`/`stop` command; `stop` releases the mic. `hold`/`proceed` are the chat-mode
662
+ brainstorm pair: plain speech buffers instead of becoming assistant turns until "go ahead"
663
+ releases it as one consolidated turn (bare exact phrases "hold on"/"go ahead" also work);
664
+ `voice_chat_patience_ms` separately lengthens the chat-addressee endpoint tail while
665
+ wake-worded commands keep short-circuiting it, and an open assistant confirmation card
666
+ suspends it entirely (a closed question is being answered, not composed).
667
+ A completeness heuristic (`utteranceCompleteness.ts`, pure) runs BEFORE a chat turn is
668
+ dispatched: an utterance ending mid-clause on a dangling conjunction, preposition, or article
669
+ earns exactly one adaptive patience extension instead of submitting, and the held fragment
670
+ merges into the next utterance, submits alone when the extension expires, or folds into a
671
+ brainstorm hold. One deferral per utterance, so the wait is bounded structurally; the model is
672
+ never instructed to return nothing; queue-merge stays the safety net; and every deferral is
673
+ reported to `POST /api/voice/deferral-diagnostic` with its trigger token so the
674
+ false-positive rate is measurable before anyone tunes the word lists. Hold `Ctrl+Alt+Space` for push-to-talk with
675
+ no endpointing. `GET/POST/DELETE /api/voice/stt-latency` is the end-of-speech-to-action stage
676
+ breakdown (also in `daemon.log`), read in Settings → Voice beside the wake-word tester.
677
+ `POST /api/voice/barge-in-diagnostic` validates and logs confirmed/rejected browser sidechain probes.
678
+ A capture frame watchdog (`CaptureFrameWatchdog`, `conversation.ts`) separates a dead capture from a quiet room: no raw blocks for 5 s renders the `stalled` phase (never `listening`), attempts `context.resume()`, and posts a bounded report to `POST /api/voice/capture-diagnostic` (stall = WARNING in `daemon.log`).
679
+ `voiceQueries.ts` adds the non-configurable deterministic query grammar for help, scoped fleet lists/status, numbered navigation, and one-shot summary/verbatim reply reading.
680
+ Routing is three tiers: this deterministic grammar, a conservative fuzzy pass (`voiceFuzzy.ts`), and — only on no-match, only when enabled — the Mux assistant (`design/features/assistant.md`), whose replies render in the voice panel's `chat` mode and speak through the application-speech path.
681
+
682
+ **Mobile mic needs HTTPS (secure context).** swe-mux runs **Tailscale Serve on 443**
683
+ (`https://<device>.ts.net/`) proxying to the daemon's loopback port — auto-started at boot
684
+ (`_auto_enable_mobile_voice`), idempotent. Serve is on 443 **not** the swe-mux port because the
685
+ daemon binds its port on the tailnet IP directly for the plain-HTTP fallback (same-port Serve
686
+ would collide). The phone must resolve the `.ts.net` name over MagicDNS ("Use Tailscale DNS" on;
687
+ Android Private DNS off/automatic); the cert is hostname-bound so the raw 100.x IP can't do
688
+ HTTPS. If mobile voice breaks, first confirm a daemon is listening on the real config port and
689
+ `tailscale serve status` proxies to it. Tailscale/Serve code: `tailscale.py`, `__main__.py`.