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.
- swe_mux-0.1.0/.docs/CLAUDE.md +689 -0
- swe_mux-0.1.0/.docs/design/00_OVERVIEW.md +123 -0
- swe_mux-0.1.0/.docs/design/architecture.md +190 -0
- swe_mux-0.1.0/.docs/design/data-model.md +640 -0
- swe_mux-0.1.0/.docs/design/features/agent-context.md +152 -0
- swe_mux-0.1.0/.docs/design/features/agent-environment.md +176 -0
- swe_mux-0.1.0/.docs/design/features/agent-messaging.md +374 -0
- swe_mux-0.1.0/.docs/design/features/approvals.md +326 -0
- swe_mux-0.1.0/.docs/design/features/assistant.md +392 -0
- swe_mux-0.1.0/.docs/design/features/attention-ranking.md +164 -0
- swe_mux-0.1.0/.docs/design/features/auto-delivery.md +304 -0
- swe_mux-0.1.0/.docs/design/features/automation-enablement.md +304 -0
- swe_mux-0.1.0/.docs/design/features/automation.md +547 -0
- swe_mux-0.1.0/.docs/design/features/backends.md +863 -0
- swe_mux-0.1.0/.docs/design/features/budgets.md +160 -0
- swe_mux-0.1.0/.docs/design/features/code-graph.md +193 -0
- swe_mux-0.1.0/.docs/design/features/configurator.md +329 -0
- swe_mux-0.1.0/.docs/design/features/delivery-readiness.md +381 -0
- swe_mux-0.1.0/.docs/design/features/desktop-shell.md +386 -0
- swe_mux-0.1.0/.docs/design/features/deterministic-consumers.md +293 -0
- swe_mux-0.1.0/.docs/design/features/device-presence.md +82 -0
- swe_mux-0.1.0/.docs/design/features/fleet-intelligence.md +98 -0
- swe_mux-0.1.0/.docs/design/features/ghost-windows.md +114 -0
- swe_mux-0.1.0/.docs/design/features/git.md +640 -0
- swe_mux-0.1.0/.docs/design/features/history.md +315 -0
- swe_mux-0.1.0/.docs/design/features/land-queue.md +612 -0
- swe_mux-0.1.0/.docs/design/features/launch-profiles.md +181 -0
- swe_mux-0.1.0/.docs/design/features/meta-hooks.md +52 -0
- swe_mux-0.1.0/.docs/design/features/mux-mcp.md +574 -0
- swe_mux-0.1.0/.docs/design/features/notifications.md +174 -0
- swe_mux-0.1.0/.docs/design/features/observations.md +57 -0
- swe_mux-0.1.0/.docs/design/features/operational-telemetry.md +235 -0
- swe_mux-0.1.0/.docs/design/features/processes-and-previews.md +616 -0
- swe_mux-0.1.0/.docs/design/features/project-actions.md +330 -0
- swe_mux-0.1.0/.docs/design/features/project-card.md +81 -0
- swe_mux-0.1.0/.docs/design/features/project-resources.md +697 -0
- swe_mux-0.1.0/.docs/design/features/projects.md +337 -0
- swe_mux-0.1.0/.docs/design/features/prompt-library.md +103 -0
- swe_mux-0.1.0/.docs/design/features/prompt-queue.md +302 -0
- swe_mux-0.1.0/.docs/design/features/provider-accounts.md +288 -0
- swe_mux-0.1.0/.docs/design/features/remote-access.md +234 -0
- swe_mux-0.1.0/.docs/design/features/scan-timeline.md +317 -0
- swe_mux-0.1.0/.docs/design/features/scheduled-runs.md +203 -0
- swe_mux-0.1.0/.docs/design/features/session-recovery.md +222 -0
- swe_mux-0.1.0/.docs/design/features/sessions.md +578 -0
- swe_mux-0.1.0/.docs/design/features/setting-links.md +300 -0
- swe_mux-0.1.0/.docs/design/features/status-detection.md +1082 -0
- swe_mux-0.1.0/.docs/design/features/terminal-input.md +445 -0
- swe_mux-0.1.0/.docs/design/features/tier0-facts.md +155 -0
- swe_mux-0.1.0/.docs/design/features/transcript-branches.md +86 -0
- swe_mux-0.1.0/.docs/design/features/ui.md +3373 -0
- swe_mux-0.1.0/.docs/design/features/usage.md +130 -0
- swe_mux-0.1.0/.docs/design/features/voice.md +1268 -0
- swe_mux-0.1.0/.docs/design/features/workspace-layout.md +311 -0
- swe_mux-0.1.0/.docs/design/interfaces.md +2793 -0
- swe_mux-0.1.0/.docs/development/AGENT_ENVIRONMENT_RUNTIME_INVENTORY.md +295 -0
- swe_mux-0.1.0/.docs/development/CODE_QUALITY_AUDIT_2026-08-23.md +152 -0
- swe_mux-0.1.0/.docs/development/CONTINUITY_TOUCH_KEYBOARD_ASK.md +120 -0
- swe_mux-0.1.0/.docs/development/CONTROL_PLANE_ROADMAP.md +1801 -0
- swe_mux-0.1.0/.docs/development/CROSS_PLATFORM_FINDINGS.md +397 -0
- swe_mux-0.1.0/.docs/development/HARNESS_EXPANSION_CANDIDATES.md +660 -0
- swe_mux-0.1.0/.docs/development/NEW_USER_RELEASE_READINESS.md +194 -0
- swe_mux-0.1.0/.docs/development/OPERATOR_LIFECYCLE.md +482 -0
- swe_mux-0.1.0/.docs/development/PERFORMANCE_RUNBOOK.md +365 -0
- swe_mux-0.1.0/.docs/development/PLUGIN_SYSTEM_FINDINGS.md +108 -0
- swe_mux-0.1.0/.docs/development/RELEASE_MANUAL_TASKS.md +291 -0
- swe_mux-0.1.0/.docs/development/ROADMAP.md +5152 -0
- swe_mux-0.1.0/.docs/development/STATUS_INCIDENT_RUNBOOK.md +189 -0
- swe_mux-0.1.0/.docs/development/TERMINAL_INPUT_INCIDENT_RUNBOOK.md +96 -0
- swe_mux-0.1.0/.docs/development/USABILITY_AUDIT_2026-08-20.md +519 -0
- swe_mux-0.1.0/.docs/development/archive/AGENT_MUX_SPEC.md +356 -0
- swe_mux-0.1.0/.docs/development/archive/GIT_DIFF_REVIEW_IMPLEMENTATION.md +610 -0
- swe_mux-0.1.0/.docs/development/archive/HARDENING_AUDIT_2026-07-27.md +912 -0
- swe_mux-0.1.0/.docs/development/archive/HARNESS_ABSTRACTION_AND_OMP.md +482 -0
- swe_mux-0.1.0/.docs/development/archive/HARNESS_PARITY_AUDIT_2026-08-11.md +258 -0
- swe_mux-0.1.0/.docs/development/archive/NOTIFICATION_SCOPING_PROPOSAL.md +113 -0
- swe_mux-0.1.0/.docs/development/archive/PROJECT_CARD_GENERATED_DESIGN.md +129 -0
- swe_mux-0.1.0/.docs/development/archive/ROADMAP.md +1719 -0
- swe_mux-0.1.0/.docs/development/archive/ROADMAP_V2.md +729 -0
- swe_mux-0.1.0/.docs/development/archive/SESSION_PRESERVING_RELOAD.md +430 -0
- swe_mux-0.1.0/.docs/development/archive/STATUS_DETECTION_V2_PLAN.md +310 -0
- swe_mux-0.1.0/.docs/development/archive/UTILITY_DRAWER_LAYOUT_IMPLEMENTATION.md +531 -0
- swe_mux-0.1.0/.docs/development/archive/VOICE_INTERACTION_ROADMAP.md +302 -0
- swe_mux-0.1.0/.docs/marketing/README.md +50 -0
- swe_mux-0.1.0/.docs/marketing/blog/01-launch.md +66 -0
- swe_mux-0.1.0/.docs/marketing/blog/02-session-preserving-runtime.md +62 -0
- swe_mux-0.1.0/.docs/marketing/blog/03-land-queue.md +54 -0
- swe_mux-0.1.0/.docs/marketing/blog/04-status-detection.md +57 -0
- swe_mux-0.1.0/.docs/marketing/blog/05-phone-fleet.md +49 -0
- swe_mux-0.1.0/.docs/marketing/blog/06-no-server-updates.md +50 -0
- swe_mux-0.1.0/.docs/marketing/posts/alternativeto.md +29 -0
- swe_mux-0.1.0/.docs/marketing/posts/awesome-list-prs.md +30 -0
- swe_mux-0.1.0/.docs/marketing/posts/bluesky-linkedin.md +35 -0
- swe_mux-0.1.0/.docs/marketing/posts/discord-claude-developers.md +23 -0
- swe_mux-0.1.0/.docs/marketing/posts/lobsters.md +19 -0
- swe_mux-0.1.0/.docs/marketing/posts/newsletter-submissions.md +50 -0
- swe_mux-0.1.0/.docs/marketing/posts/product-hunt.md +46 -0
- swe_mux-0.1.0/.docs/marketing/posts/reddit-soft-launch.md +66 -0
- swe_mux-0.1.0/.docs/marketing/posts/reddit-tier2.md +90 -0
- swe_mux-0.1.0/.docs/marketing/posts/show-hn.md +50 -0
- swe_mux-0.1.0/.docs/marketing/posts/x-thread.md +67 -0
- swe_mux-0.1.0/.docs/marketing/posts/youtube-outreach.md +33 -0
- swe_mux-0.1.0/.docs/technical/00_INDEX.md +31 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/agent-surfaces.md +218 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/automation-and-control-plane.md +130 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/daemon-runtime.md +276 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/git-and-landing.md +151 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/harnesses.md +75 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/history-and-observation.md +104 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/platform.md +133 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/processes-and-devices.md +91 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/projects-and-worktrees.md +209 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/pty-and-sessions.md +201 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/routes.md +290 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/runtime-rules.md +214 -0
- swe_mux-0.1.0/.docs/technical/backend/packages/voice-and-assistant.md +124 -0
- swe_mux-0.1.0/.docs/technical/backend/packages.md +61 -0
- swe_mux-0.1.0/.docs/technical/backend/sqlite.md +394 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/actions-and-clipboard.md +227 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/agent-inspection.md +88 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/composition.md +168 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/git-and-history.md +247 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/layout-and-chrome.md +192 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/metering.md +79 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/notes-and-files.md +119 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/queue-and-alerts.md +103 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/settings-and-gates.md +194 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/sidebar-and-projects.md +136 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/terminal.md +154 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages/voice-and-assistant.md +131 -0
- swe_mux-0.1.0/.docs/technical/frontend/packages.md +99 -0
- swe_mux-0.1.0/.docs/technical/frontend/workspace-state.md +402 -0
- swe_mux-0.1.0/.gitattributes +54 -0
- swe_mux-0.1.0/.githooks/pre-commit +3 -0
- swe_mux-0.1.0/.githooks/pre-push +13 -0
- swe_mux-0.1.0/.github/DISCUSSION_TEMPLATE/ideas.yml +117 -0
- swe_mux-0.1.0/.github/workflows/ci.yml +322 -0
- swe_mux-0.1.0/.github/workflows/ideas.yml +93 -0
- swe_mux-0.1.0/.github/workflows/pages.yml +87 -0
- swe_mux-0.1.0/.github/workflows/release.yml +372 -0
- swe_mux-0.1.0/.gitignore +152 -0
- swe_mux-0.1.0/.worktree-setup +32 -0
- swe_mux-0.1.0/.worktree-verify +63 -0
- swe_mux-0.1.0/AGENTS.md +141 -0
- swe_mux-0.1.0/CHANGELOG.md +191 -0
- swe_mux-0.1.0/CLAUDE.md +338 -0
- swe_mux-0.1.0/CONTRIBUTING.md +146 -0
- swe_mux-0.1.0/LICENSE +202 -0
- swe_mux-0.1.0/NOTICE +27 -0
- swe_mux-0.1.0/PKG-INFO +199 -0
- swe_mux-0.1.0/README.md +145 -0
- swe_mux-0.1.0/RELEASING.md +206 -0
- swe_mux-0.1.0/SECURITY.md +146 -0
- swe_mux-0.1.0/THIRD-PARTY-NOTICES.md +293 -0
- swe_mux-0.1.0/TRADEMARK.md +49 -0
- swe_mux-0.1.0/frontend/...trashtsc-out.txt +2 -0
- swe_mux-0.1.0/frontend/action-editor-harness.html +3 -0
- swe_mux-0.1.0/frontend/automation-cost-harness.html +3 -0
- swe_mux-0.1.0/frontend/change-map-harness.html +3 -0
- swe_mux-0.1.0/frontend/command-rail-harness.html +3 -0
- swe_mux-0.1.0/frontend/drawer-surfaces-harness.html +3 -0
- swe_mux-0.1.0/frontend/dropdown-harness.html +3 -0
- swe_mux-0.1.0/frontend/files-tab-harness.html +3 -0
- swe_mux-0.1.0/frontend/git-diff-harness.html +3 -0
- swe_mux-0.1.0/frontend/git-land-harness.html +3 -0
- swe_mux-0.1.0/frontend/git-map-harness.html +3 -0
- swe_mux-0.1.0/frontend/git-map-range-harness.html +3 -0
- swe_mux-0.1.0/frontend/git-map-select-harness.html +3 -0
- swe_mux-0.1.0/frontend/git-row-layout-harness.html +3 -0
- swe_mux-0.1.0/frontend/git-setup-harness.html +3 -0
- swe_mux-0.1.0/frontend/grant-gate-harness.html +3 -0
- swe_mux-0.1.0/frontend/hidden-note-editor-harness.html +3 -0
- swe_mux-0.1.0/frontend/history-harness.html +3 -0
- swe_mux-0.1.0/frontend/index.html +26 -0
- swe_mux-0.1.0/frontend/jump-latest-harness.html +20 -0
- swe_mux-0.1.0/frontend/lazy-surfaces-harness.html +3 -0
- swe_mux-0.1.0/frontend/notes-tab-harness.html +3 -0
- swe_mux-0.1.0/frontend/package-lock.json +3073 -0
- swe_mux-0.1.0/frontend/package.json +69 -0
- swe_mux-0.1.0/frontend/palette-harness.html +3 -0
- swe_mux-0.1.0/frontend/pane-harness.html +3 -0
- swe_mux-0.1.0/frontend/playwright.renderer.config.ts +33 -0
- swe_mux-0.1.0/frontend/process-fleet-harness.html +3 -0
- swe_mux-0.1.0/frontend/processes-tab-harness.html +3 -0
- swe_mux-0.1.0/frontend/prompt-editor-harness.html +3 -0
- swe_mux-0.1.0/frontend/public/icons/apple-touch-icon.png +0 -0
- swe_mux-0.1.0/frontend/public/icons/icon-192.png +0 -0
- swe_mux-0.1.0/frontend/public/icons/icon-512.png +0 -0
- swe_mux-0.1.0/frontend/public/icons/icon-maskable-512.png +0 -0
- swe_mux-0.1.0/frontend/public/manifest.webmanifest +17 -0
- swe_mux-0.1.0/frontend/public/notification-sounds/LICENSE.orca.txt +24 -0
- swe_mux-0.1.0/frontend/public/notification-sounds/blip.mp3 +0 -0
- swe_mux-0.1.0/frontend/public/notification-sounds/blop.mp3 +0 -0
- swe_mux-0.1.0/frontend/public/notification-sounds/bong.mp3 +0 -0
- swe_mux-0.1.0/frontend/public/notification-sounds/ding.mp3 +0 -0
- swe_mux-0.1.0/frontend/public/notification-sounds/sonar.mp3 +0 -0
- swe_mux-0.1.0/frontend/public/notification-sounds/thump.mp3 +0 -0
- swe_mux-0.1.0/frontend/public/notification-sounds/two-tone.mp3 +0 -0
- swe_mux-0.1.0/frontend/public/sw.js +40 -0
- swe_mux-0.1.0/frontend/queue-readiness-harness.html +3 -0
- swe_mux-0.1.0/frontend/quota-grid-harness.html +3 -0
- swe_mux-0.1.0/frontend/rail-dropup-harness.html +3 -0
- swe_mux-0.1.0/frontend/rail-overflow-harness.html +3 -0
- swe_mux-0.1.0/frontend/redeploy-chip-harness.html +3 -0
- swe_mux-0.1.0/frontend/renderer-harness.html +20 -0
- swe_mux-0.1.0/frontend/resource-layout-harness.html +3 -0
- swe_mux-0.1.0/frontend/resources-harness.html +3 -0
- swe_mux-0.1.0/frontend/scan-timeline-harness.html +3 -0
- swe_mux-0.1.0/frontend/schedule-harness.html +3 -0
- swe_mux-0.1.0/frontend/scripts/compress-static.mjs +52 -0
- swe_mux-0.1.0/frontend/scripts/patch-xterm-requestmode.mjs +52 -0
- swe_mux-0.1.0/frontend/scripts/patch-xterm-webgl.mjs +67 -0
- swe_mux-0.1.0/frontend/scripts/smart-turn-bench.mts +161 -0
- swe_mux-0.1.0/frontend/scripts/verify-acceptance.mjs +107 -0
- swe_mux-0.1.0/frontend/scripts/verify-bundle.mjs +44 -0
- swe_mux-0.1.0/frontend/session-row-harness.html +3 -0
- swe_mux-0.1.0/frontend/setting-reveal-harness.html +3 -0
- swe_mux-0.1.0/frontend/settings-harness.html +3 -0
- swe_mux-0.1.0/frontend/sidebar-groups-harness.html +3 -0
- swe_mux-0.1.0/frontend/smart-turn-lab.html +26 -0
- swe_mux-0.1.0/frontend/src/ActionEditorModal.tsx +28 -0
- swe_mux-0.1.0/frontend/src/ActionsTab.tsx +169 -0
- swe_mux-0.1.0/frontend/src/AgentContextTab.tsx +604 -0
- swe_mux-0.1.0/frontend/src/AgentEnvironmentTab.tsx +381 -0
- swe_mux-0.1.0/frontend/src/App.tsx +8213 -0
- swe_mux-0.1.0/frontend/src/ApprovalChip.tsx +257 -0
- swe_mux-0.1.0/frontend/src/AssistantPanel.tsx +446 -0
- swe_mux-0.1.0/frontend/src/AttentionInbox.tsx +146 -0
- swe_mux-0.1.0/frontend/src/AutomationDashboard.tsx +236 -0
- swe_mux-0.1.0/frontend/src/AutomationMatrix.tsx +328 -0
- swe_mux-0.1.0/frontend/src/AutomationPolicyView.tsx +109 -0
- swe_mux-0.1.0/frontend/src/AutomationSpendView.tsx +152 -0
- swe_mux-0.1.0/frontend/src/BranchPicker.tsx +175 -0
- swe_mux-0.1.0/frontend/src/BudgetControl.tsx +146 -0
- swe_mux-0.1.0/frontend/src/ChangeMapPane.tsx +583 -0
- swe_mux-0.1.0/frontend/src/ClipboardDropup.tsx +90 -0
- swe_mux-0.1.0/frontend/src/ClipboardPanel.tsx +268 -0
- swe_mux-0.1.0/frontend/src/CodeEditor.tsx +184 -0
- swe_mux-0.1.0/frontend/src/ConnectPhone.tsx +48 -0
- swe_mux-0.1.0/frontend/src/ContinuityBanner.tsx +15 -0
- swe_mux-0.1.0/frontend/src/ConversationControl.tsx +1470 -0
- swe_mux-0.1.0/frontend/src/DelimitedTextViewer.tsx +80 -0
- swe_mux-0.1.0/frontend/src/DirectoryPicker.tsx +75 -0
- swe_mux-0.1.0/frontend/src/DrawerSegmentControl.tsx +57 -0
- swe_mux-0.1.0/frontend/src/Dropdown.tsx +412 -0
- swe_mux-0.1.0/frontend/src/EdgeTtsSettings.tsx +145 -0
- swe_mux-0.1.0/frontend/src/EndedPaneBanner.tsx +51 -0
- swe_mux-0.1.0/frontend/src/FindingsPane.tsx +271 -0
- swe_mux-0.1.0/frontend/src/FleetActivityView.tsx +104 -0
- swe_mux-0.1.0/frontend/src/FleetQueue.tsx +403 -0
- swe_mux-0.1.0/frontend/src/GitDiffView.tsx +70 -0
- swe_mux-0.1.0/frontend/src/GitFileRow.tsx +66 -0
- swe_mux-0.1.0/frontend/src/GitLandBar.tsx +622 -0
- swe_mux-0.1.0/frontend/src/GitLandRow.tsx +172 -0
- swe_mux-0.1.0/frontend/src/GitReviewModal.tsx +169 -0
- swe_mux-0.1.0/frontend/src/GitSessionLinks.tsx +106 -0
- swe_mux-0.1.0/frontend/src/GitTab.tsx +1035 -0
- swe_mux-0.1.0/frontend/src/GrantGate.tsx +263 -0
- swe_mux-0.1.0/frontend/src/GuidedTutorial.tsx +184 -0
- swe_mux-0.1.0/frontend/src/HarnessSetup.tsx +117 -0
- swe_mux-0.1.0/frontend/src/HistoryBrowser.tsx +438 -0
- swe_mux-0.1.0/frontend/src/ImageViewer.tsx +59 -0
- swe_mux-0.1.0/frontend/src/InteractionHud.tsx +62 -0
- swe_mux-0.1.0/frontend/src/LazyChangeMap.tsx +33 -0
- swe_mux-0.1.0/frontend/src/LazyCodeEditor.tsx +32 -0
- swe_mux-0.1.0/frontend/src/LazyGitDiff.tsx +16 -0
- swe_mux-0.1.0/frontend/src/MenuGroup.tsx +124 -0
- swe_mux-0.1.0/frontend/src/ModelName.tsx +14 -0
- swe_mux-0.1.0/frontend/src/ModelPicker.tsx +194 -0
- swe_mux-0.1.0/frontend/src/ModelRoutingSummary.tsx +95 -0
- swe_mux-0.1.0/frontend/src/NetworkUsageModal.tsx +109 -0
- swe_mux-0.1.0/frontend/src/NotesTab.tsx +498 -0
- swe_mux-0.1.0/frontend/src/NotificationPushSettings.tsx +199 -0
- swe_mux-0.1.0/frontend/src/NotificationSoundSettings.tsx +3 -0
- swe_mux-0.1.0/frontend/src/Notifications.tsx +173 -0
- swe_mux-0.1.0/frontend/src/Observations.tsx +162 -0
- swe_mux-0.1.0/frontend/src/PreviewPane.tsx +164 -0
- swe_mux-0.1.0/frontend/src/ProcessFleetView.tsx +345 -0
- swe_mux-0.1.0/frontend/src/ProcessesTab.tsx +71 -0
- swe_mux-0.1.0/frontend/src/ProjectContextEditor.tsx +89 -0
- swe_mux-0.1.0/frontend/src/ProjectNoteEditor.tsx +508 -0
- swe_mux-0.1.0/frontend/src/ProjectResource.tsx +1587 -0
- swe_mux-0.1.0/frontend/src/ProjectRunMenu.tsx +327 -0
- swe_mux-0.1.0/frontend/src/ProjectsManager.tsx +440 -0
- swe_mux-0.1.0/frontend/src/PromptLibrary.tsx +212 -0
- swe_mux-0.1.0/frontend/src/PromptTemplateEditor.tsx +298 -0
- swe_mux-0.1.0/frontend/src/PromptsDropup.tsx +112 -0
- swe_mux-0.1.0/frontend/src/PromptsTab.tsx +393 -0
- swe_mux-0.1.0/frontend/src/ProviderAccounts.tsx +248 -0
- swe_mux-0.1.0/frontend/src/QueuePane.tsx +972 -0
- swe_mux-0.1.0/frontend/src/QuotaAnalytics.tsx +212 -0
- swe_mux-0.1.0/frontend/src/RailDropup.tsx +137 -0
- swe_mux-0.1.0/frontend/src/RailEditor.tsx +896 -0
- swe_mux-0.1.0/frontend/src/RailOverflowPopover.tsx +118 -0
- swe_mux-0.1.0/frontend/src/RailPad.tsx +652 -0
- swe_mux-0.1.0/frontend/src/RailRepeatKey.tsx +107 -0
- swe_mux-0.1.0/frontend/src/RailScroller.tsx +240 -0
- swe_mux-0.1.0/frontend/src/RailStrip.tsx +70 -0
- swe_mux-0.1.0/frontend/src/RedeployChip.tsx +66 -0
- swe_mux-0.1.0/frontend/src/ResourceUsage.tsx +128 -0
- swe_mux-0.1.0/frontend/src/ResourcesModal.tsx +123 -0
- swe_mux-0.1.0/frontend/src/ScanSpendStatus.tsx +41 -0
- swe_mux-0.1.0/frontend/src/ScanTimelineTab.tsx +316 -0
- swe_mux-0.1.0/frontend/src/ScheduleTab.tsx +617 -0
- swe_mux-0.1.0/frontend/src/SendToAgentPicker.tsx +326 -0
- swe_mux-0.1.0/frontend/src/SessionRowBody.tsx +166 -0
- swe_mux-0.1.0/frontend/src/SessionRowLive.tsx +57 -0
- swe_mux-0.1.0/frontend/src/SessionRowSettings.tsx +393 -0
- swe_mux-0.1.0/frontend/src/SettingLink.tsx +37 -0
- swe_mux-0.1.0/frontend/src/Settings.tsx +2640 -0
- swe_mux-0.1.0/frontend/src/SkillsDropup.tsx +111 -0
- swe_mux-0.1.0/frontend/src/StateIndicator.tsx +78 -0
- swe_mux-0.1.0/frontend/src/StorageUsageModal.tsx +114 -0
- swe_mux-0.1.0/frontend/src/TerminalDraftComposer.tsx +65 -0
- swe_mux-0.1.0/frontend/src/TerminalPane.tsx +4074 -0
- swe_mux-0.1.0/frontend/src/ThemePicker.tsx +123 -0
- swe_mux-0.1.0/frontend/src/TranscriptTab.tsx +739 -0
- swe_mux-0.1.0/frontend/src/TranscriptToolCalls.tsx +16 -0
- swe_mux-0.1.0/frontend/src/UpdateBanner.tsx +65 -0
- swe_mux-0.1.0/frontend/src/UsageDashboardView.tsx +222 -0
- swe_mux-0.1.0/frontend/src/UsageModal.tsx +126 -0
- swe_mux-0.1.0/frontend/src/UsageModelBreakdown.tsx +95 -0
- swe_mux-0.1.0/frontend/src/UsageOverview.tsx +128 -0
- swe_mux-0.1.0/frontend/src/UtilityDrawer.tsx +848 -0
- swe_mux-0.1.0/frontend/src/VoiceCommandsButton.tsx +48 -0
- swe_mux-0.1.0/frontend/src/VoiceLatencyReport.tsx +55 -0
- swe_mux-0.1.0/frontend/src/VoiceReadTab.tsx +330 -0
- swe_mux-0.1.0/frontend/src/WakeWordTester.tsx +151 -0
- swe_mux-0.1.0/frontend/src/WorkloadTelemetry.tsx +72 -0
- swe_mux-0.1.0/frontend/src/WslBridgePanel.tsx +72 -0
- swe_mux-0.1.0/frontend/src/agentContext.ts +112 -0
- swe_mux-0.1.0/frontend/src/agentEnvironment.ts +204 -0
- swe_mux-0.1.0/frontend/src/agentTargets.ts +77 -0
- swe_mux-0.1.0/frontend/src/alertPrefs.ts +79 -0
- swe_mux-0.1.0/frontend/src/api.ts +88 -0
- swe_mux-0.1.0/frontend/src/approvals.ts +139 -0
- swe_mux-0.1.0/frontend/src/assistant.ts +465 -0
- swe_mux-0.1.0/frontend/src/assistantSpeech.ts +285 -0
- swe_mux-0.1.0/frontend/src/attention.ts +92 -0
- swe_mux-0.1.0/frontend/src/audioFrames.ts +113 -0
- swe_mux-0.1.0/frontend/src/automationCost.ts +306 -0
- swe_mux-0.1.0/frontend/src/branchPoints.ts +148 -0
- swe_mux-0.1.0/frontend/src/branchSeed.ts +52 -0
- swe_mux-0.1.0/frontend/src/changeMap.ts +534 -0
- swe_mux-0.1.0/frontend/src/changeMapLayout.worker.ts +72 -0
- swe_mux-0.1.0/frontend/src/clipboardHistory.ts +317 -0
- swe_mux-0.1.0/frontend/src/codeLanguage.ts +192 -0
- swe_mux-0.1.0/frontend/src/codeTheme.ts +136 -0
- swe_mux-0.1.0/frontend/src/coldSession.ts +87 -0
- swe_mux-0.1.0/frontend/src/commandLine.ts +81 -0
- swe_mux-0.1.0/frontend/src/commandRail.ts +1486 -0
- swe_mux-0.1.0/frontend/src/commands.ts +83 -0
- swe_mux-0.1.0/frontend/src/composerInsertion.ts +80 -0
- swe_mux-0.1.0/frontend/src/composerText.ts +139 -0
- swe_mux-0.1.0/frontend/src/configurator.ts +123 -0
- swe_mux-0.1.0/frontend/src/consoleContention.ts +56 -0
- swe_mux-0.1.0/frontend/src/continuityStatus.ts +24 -0
- swe_mux-0.1.0/frontend/src/conversation.ts +789 -0
- swe_mux-0.1.0/frontend/src/conversationDraft.ts +47 -0
- swe_mux-0.1.0/frontend/src/conversationTarget.ts +83 -0
- swe_mux-0.1.0/frontend/src/delimitedText.ts +161 -0
- swe_mux-0.1.0/frontend/src/deliveryReadiness.ts +252 -0
- swe_mux-0.1.0/frontend/src/devicePresence.ts +147 -0
- swe_mux-0.1.0/frontend/src/deviceSettings.ts +177 -0
- swe_mux-0.1.0/frontend/src/dismissStack.ts +180 -0
- swe_mux-0.1.0/frontend/src/dotShapes.ts +59 -0
- swe_mux-0.1.0/frontend/src/dragReorder.ts +112 -0
- swe_mux-0.1.0/frontend/src/drawerLayout.ts +673 -0
- swe_mux-0.1.0/frontend/src/drawerNotes.ts +108 -0
- swe_mux-0.1.0/frontend/src/drawerSegments.ts +248 -0
- swe_mux-0.1.0/frontend/src/drawerTabOrder.ts +43 -0
- swe_mux-0.1.0/frontend/src/drawerTabs.ts +137 -0
- swe_mux-0.1.0/frontend/src/drawerTransient.ts +24 -0
- swe_mux-0.1.0/frontend/src/drawerVisibility.ts +119 -0
- swe_mux-0.1.0/frontend/src/dropdownOptions.ts +192 -0
- swe_mux-0.1.0/frontend/src/dropdownPlacement.ts +141 -0
- swe_mux-0.1.0/frontend/src/earcons.ts +49 -0
- swe_mux-0.1.0/frontend/src/editorText.ts +3 -0
- swe_mux-0.1.0/frontend/src/eventRefresh.ts +50 -0
- swe_mux-0.1.0/frontend/src/fileClipboard.ts +81 -0
- swe_mux-0.1.0/frontend/src/fileSearchLimit.ts +47 -0
- swe_mux-0.1.0/frontend/src/fleetCommands.ts +115 -0
- swe_mux-0.1.0/frontend/src/fleetLayouts.ts +118 -0
- swe_mux-0.1.0/frontend/src/fleetRefresh.ts +206 -0
- swe_mux-0.1.0/frontend/src/fleetStatus.ts +96 -0
- swe_mux-0.1.0/frontend/src/fuzzyText.ts +69 -0
- swe_mux-0.1.0/frontend/src/gitLand.ts +770 -0
- swe_mux-0.1.0/frontend/src/gitReview.ts +172 -0
- swe_mux-0.1.0/frontend/src/gitSetup.ts +25 -0
- swe_mux-0.1.0/frontend/src/gitTabCache.ts +67 -0
- swe_mux-0.1.0/frontend/src/gitWorktrees.ts +1003 -0
- swe_mux-0.1.0/frontend/src/grants.ts +243 -0
- swe_mux-0.1.0/frontend/src/harnessIcons.tsx +78 -0
- swe_mux-0.1.0/frontend/src/harnessRegistry.ts +365 -0
- swe_mux-0.1.0/frontend/src/harnessRegistrySeed.ts +240 -0
- swe_mux-0.1.0/frontend/src/historyDetail.ts +133 -0
- swe_mux-0.1.0/frontend/src/humanPresence.ts +46 -0
- swe_mux-0.1.0/frontend/src/inputBackend.ts +53 -0
- swe_mux-0.1.0/frontend/src/inputOwnership.ts +182 -0
- swe_mux-0.1.0/frontend/src/insertTarget.ts +152 -0
- swe_mux-0.1.0/frontend/src/installSwitches.ts +56 -0
- swe_mux-0.1.0/frontend/src/keybindingsStore.ts +21 -0
- swe_mux-0.1.0/frontend/src/keyboardReserve.ts +161 -0
- swe_mux-0.1.0/frontend/src/keys.ts +16 -0
- swe_mux-0.1.0/frontend/src/kokoroVoices.ts +36 -0
- swe_mux-0.1.0/frontend/src/landSetupPrompt.ts +84 -0
- swe_mux-0.1.0/frontend/src/landState.ts +134 -0
- swe_mux-0.1.0/frontend/src/layout.ts +462 -0
- swe_mux-0.1.0/frontend/src/layoutBox.ts +86 -0
- swe_mux-0.1.0/frontend/src/layoutWriter.ts +102 -0
- swe_mux-0.1.0/frontend/src/lineageView.ts +93 -0
- swe_mux-0.1.0/frontend/src/liveness.ts +175 -0
- swe_mux-0.1.0/frontend/src/llmProvider.ts +191 -0
- swe_mux-0.1.0/frontend/src/main.tsx +22 -0
- swe_mux-0.1.0/frontend/src/menuPosition.ts +55 -0
- swe_mux-0.1.0/frontend/src/mobileGestures.ts +496 -0
- swe_mux-0.1.0/frontend/src/mobileInput.ts +184 -0
- swe_mux-0.1.0/frontend/src/mobileKeyboard.ts +467 -0
- swe_mux-0.1.0/frontend/src/mobileTerminalDraft.ts +139 -0
- swe_mux-0.1.0/frontend/src/mobileTerminalIme.ts +33 -0
- swe_mux-0.1.0/frontend/src/mobileVoice.ts +30 -0
- swe_mux-0.1.0/frontend/src/mobileWorkspace.ts +45 -0
- swe_mux-0.1.0/frontend/src/modalFocus.ts +73 -0
- swe_mux-0.1.0/frontend/src/modelDisplay.ts +58 -0
- swe_mux-0.1.0/frontend/src/modelFilter.ts +49 -0
- swe_mux-0.1.0/frontend/src/modelPricing.ts +166 -0
- swe_mux-0.1.0/frontend/src/modelRouting.ts +171 -0
- swe_mux-0.1.0/frontend/src/networkUsage.ts +70 -0
- swe_mux-0.1.0/frontend/src/noteEditGuard.ts +206 -0
- swe_mux-0.1.0/frontend/src/noteEditorSettings.ts +243 -0
- swe_mux-0.1.0/frontend/src/noteFind.ts +87 -0
- swe_mux-0.1.0/frontend/src/noteOutline.ts +160 -0
- swe_mux-0.1.0/frontend/src/noteRailIcons.ts +44 -0
- swe_mux-0.1.0/frontend/src/noteSaveQueue.ts +0 -0
- swe_mux-0.1.0/frontend/src/noteScroll.ts +123 -0
- swe_mux-0.1.0/frontend/src/noteSelection.ts +171 -0
- swe_mux-0.1.0/frontend/src/noteTabs.ts +69 -0
- swe_mux-0.1.0/frontend/src/notificationPrefs.ts +66 -0
- swe_mux-0.1.0/frontend/src/operationalTelemetry.ts +111 -0
- swe_mux-0.1.0/frontend/src/pasteTrace.ts +150 -0
- swe_mux-0.1.0/frontend/src/pathNames.ts +8 -0
- swe_mux-0.1.0/frontend/src/pendingInput.ts +28 -0
- swe_mux-0.1.0/frontend/src/pendingSession.ts +52 -0
- swe_mux-0.1.0/frontend/src/pointerDragClaim.ts +55 -0
- swe_mux-0.1.0/frontend/src/previewCapture.ts +46 -0
- swe_mux-0.1.0/frontend/src/previewLinks.ts +12 -0
- swe_mux-0.1.0/frontend/src/processFleet.ts +230 -0
- swe_mux-0.1.0/frontend/src/processFleetFeed.ts +196 -0
- swe_mux-0.1.0/frontend/src/processRows.ts +215 -0
- swe_mux-0.1.0/frontend/src/processTree.ts +37 -0
- swe_mux-0.1.0/frontend/src/projectAutomations.ts +118 -0
- swe_mux-0.1.0/frontend/src/projectConfig.ts +199 -0
- swe_mux-0.1.0/frontend/src/projectConfigState.ts +144 -0
- swe_mux-0.1.0/frontend/src/projectCreate.ts +154 -0
- swe_mux-0.1.0/frontend/src/projectGroups.ts +43 -0
- swe_mux-0.1.0/frontend/src/projectOptions.ts +40 -0
- swe_mux-0.1.0/frontend/src/projectRecency.ts +15 -0
- swe_mux-0.1.0/frontend/src/projectResourceCreate.ts +7 -0
- swe_mux-0.1.0/frontend/src/projectSort.ts +337 -0
- swe_mux-0.1.0/frontend/src/promptLibraryEvents.ts +14 -0
- swe_mux-0.1.0/frontend/src/promptRail.ts +148 -0
- swe_mux-0.1.0/frontend/src/promptTemplates.ts +61 -0
- swe_mux-0.1.0/frontend/src/promptTitles.ts +98 -0
- swe_mux-0.1.0/frontend/src/providerAccountDisplay.ts +104 -0
- swe_mux-0.1.0/frontend/src/push.ts +110 -0
- swe_mux-0.1.0/frontend/src/queueApi.ts +456 -0
- swe_mux-0.1.0/frontend/src/railClearance.ts +108 -0
- swe_mux-0.1.0/frontend/src/railDensity.ts +79 -0
- swe_mux-0.1.0/frontend/src/railDrag.ts +325 -0
- swe_mux-0.1.0/frontend/src/railIcons.tsx +540 -0
- swe_mux-0.1.0/frontend/src/railKeyRepeat.ts +131 -0
- swe_mux-0.1.0/frontend/src/railLayout.ts +372 -0
- swe_mux-0.1.0/frontend/src/railModifiers.ts +175 -0
- swe_mux-0.1.0/frontend/src/railOverflow.ts +165 -0
- swe_mux-0.1.0/frontend/src/railOverlayPlacement.ts +97 -0
- swe_mux-0.1.0/frontend/src/railPadGesture.ts +704 -0
- swe_mux-0.1.0/frontend/src/railReattach.ts +321 -0
- swe_mux-0.1.0/frontend/src/railScope.ts +436 -0
- swe_mux-0.1.0/frontend/src/railVoice.ts +85 -0
- swe_mux-0.1.0/frontend/src/recentFiles.ts +57 -0
- swe_mux-0.1.0/frontend/src/redeployProgress.ts +380 -0
- swe_mux-0.1.0/frontend/src/remoteConnection.tsx +104 -0
- swe_mux-0.1.0/frontend/src/resourceSaveIndicator.ts +25 -0
- swe_mux-0.1.0/frontend/src/resourceTooling.ts +79 -0
- swe_mux-0.1.0/frontend/src/resourceTotals.ts +66 -0
- swe_mux-0.1.0/frontend/src/resumeCommand.ts +36 -0
- swe_mux-0.1.0/frontend/src/schedules.ts +470 -0
- swe_mux-0.1.0/frontend/src/serverClock.ts +59 -0
- swe_mux-0.1.0/frontend/src/sessionAttention.ts +257 -0
- swe_mux-0.1.0/frontend/src/sessionFocusHistory.ts +69 -0
- swe_mux-0.1.0/frontend/src/sessionJoin.ts +116 -0
- swe_mux-0.1.0/frontend/src/sessionKills.ts +166 -0
- swe_mux-0.1.0/frontend/src/sessionNames.ts +37 -0
- swe_mux-0.1.0/frontend/src/sessionProcesses.ts +42 -0
- swe_mux-0.1.0/frontend/src/sessionRowConfig.ts +565 -0
- swe_mux-0.1.0/frontend/src/sessionRowFields.ts +1085 -0
- swe_mux-0.1.0/frontend/src/sessionRowPrefs.ts +224 -0
- swe_mux-0.1.0/frontend/src/sessionSnapshots.ts +82 -0
- swe_mux-0.1.0/frontend/src/sessionSounds.ts +132 -0
- swe_mux-0.1.0/frontend/src/sessionStatus.ts +200 -0
- swe_mux-0.1.0/frontend/src/settingReveal.ts +180 -0
- swe_mux-0.1.0/frontend/src/settingTargets.ts +263 -0
- swe_mux-0.1.0/frontend/src/settingsDraft.ts +37 -0
- swe_mux-0.1.0/frontend/src/settingsSave.ts +58 -0
- swe_mux-0.1.0/frontend/src/settingsSearch.ts +273 -0
- swe_mux-0.1.0/frontend/src/settingsTabs.ts +215 -0
- swe_mux-0.1.0/frontend/src/sidebarProjects.ts +94 -0
- swe_mux-0.1.0/frontend/src/sidebarResize.ts +39 -0
- swe_mux-0.1.0/frontend/src/sidebarSearch.ts +304 -0
- swe_mux-0.1.0/frontend/src/sileroVad.ts +109 -0
- swe_mux-0.1.0/frontend/src/skills.ts +136 -0
- swe_mux-0.1.0/frontend/src/smartTurn.ts +133 -0
- swe_mux-0.1.0/frontend/src/smartTurnFeatures.ts +307 -0
- swe_mux-0.1.0/frontend/src/smartTurnLab.tsx +335 -0
- swe_mux-0.1.0/frontend/src/speechGate.ts +166 -0
- swe_mux-0.1.0/frontend/src/spokenListContext.ts +53 -0
- swe_mux-0.1.0/frontend/src/staticPreview.ts +21 -0
- swe_mux-0.1.0/frontend/src/style.css +5619 -0
- swe_mux-0.1.0/frontend/src/systemBack.ts +113 -0
- swe_mux-0.1.0/frontend/src/terminalActions.ts +124 -0
- swe_mux-0.1.0/frontend/src/terminalAttachments.ts +38 -0
- swe_mux-0.1.0/frontend/src/terminalCaretPlacement.ts +687 -0
- swe_mux-0.1.0/frontend/src/terminalClipboard.ts +168 -0
- swe_mux-0.1.0/frontend/src/terminalHealth.ts +144 -0
- swe_mux-0.1.0/frontend/src/terminalInputDiagnostics.ts +248 -0
- swe_mux-0.1.0/frontend/src/terminalKeys.ts +46 -0
- swe_mux-0.1.0/frontend/src/terminalLetterbox.ts +81 -0
- swe_mux-0.1.0/frontend/src/terminalPaneMemo.ts +83 -0
- swe_mux-0.1.0/frontend/src/terminalProtocol.ts +39 -0
- swe_mux-0.1.0/frontend/src/terminalRenderDiagnostics.ts +67 -0
- swe_mux-0.1.0/frontend/src/terminalRenderPause.ts +79 -0
- swe_mux-0.1.0/frontend/src/terminalRenderer.ts +89 -0
- swe_mux-0.1.0/frontend/src/terminalViewport.ts +637 -0
- swe_mux-0.1.0/frontend/src/terminalWheelPacing.ts +140 -0
- swe_mux-0.1.0/frontend/src/theme.ts +95 -0
- swe_mux-0.1.0/frontend/src/transcriptAudio.ts +115 -0
- swe_mux-0.1.0/frontend/src/transcriptView.ts +387 -0
- swe_mux-0.1.0/frontend/src/tutorial.ts +100 -0
- swe_mux-0.1.0/frontend/src/types.ts +458 -0
- swe_mux-0.1.0/frontend/src/uiBuild.ts +24 -0
- swe_mux-0.1.0/frontend/src/uiCommand.ts +58 -0
- swe_mux-0.1.0/frontend/src/uiScale.ts +186 -0
- swe_mux-0.1.0/frontend/src/updateCheck.ts +134 -0
- swe_mux-0.1.0/frontend/src/usageAnalytics.ts +192 -0
- swe_mux-0.1.0/frontend/src/usagePots.ts +102 -0
- swe_mux-0.1.0/frontend/src/usageSegments.ts +60 -0
- swe_mux-0.1.0/frontend/src/utteranceCompleteness.ts +314 -0
- swe_mux-0.1.0/frontend/src/utteranceDeferral.ts +287 -0
- swe_mux-0.1.0/frontend/src/viewHistory.ts +195 -0
- swe_mux-0.1.0/frontend/src/viewState.ts +117 -0
- swe_mux-0.1.0/frontend/src/vite-env.d.ts +1 -0
- swe_mux-0.1.0/frontend/src/voice.ts +746 -0
- swe_mux-0.1.0/frontend/src/voiceCaptureWorklet.ts +65 -0
- swe_mux-0.1.0/frontend/src/voiceCommandReference.ts +141 -0
- swe_mux-0.1.0/frontend/src/voiceComms.ts +13 -0
- swe_mux-0.1.0/frontend/src/voiceConversationHistory.ts +72 -0
- swe_mux-0.1.0/frontend/src/voiceDock.ts +190 -0
- swe_mux-0.1.0/frontend/src/voiceFuzzy.ts +108 -0
- swe_mux-0.1.0/frontend/src/voiceGroups.ts +111 -0
- swe_mux-0.1.0/frontend/src/voiceIntents.ts +94 -0
- swe_mux-0.1.0/frontend/src/voiceLatency.ts +158 -0
- swe_mux-0.1.0/frontend/src/voiceLaunch.ts +36 -0
- swe_mux-0.1.0/frontend/src/voiceMode.ts +43 -0
- swe_mux-0.1.0/frontend/src/voiceNavigation.ts +67 -0
- swe_mux-0.1.0/frontend/src/voiceQueries.ts +309 -0
- swe_mux-0.1.0/frontend/src/wakeWordTest.ts +94 -0
- swe_mux-0.1.0/frontend/src/warmPanes.ts +79 -0
- swe_mux-0.1.0/frontend/src/wheelScroll.ts +32 -0
- swe_mux-0.1.0/frontend/src/workspaceTabs.ts +15 -0
- swe_mux-0.1.0/frontend/src/worktreeLaunch.ts +30 -0
- swe_mux-0.1.0/frontend/src/worktreeRemoval.ts +199 -0
- swe_mux-0.1.0/frontend/src/worktreeSelection.ts +95 -0
- swe_mux-0.1.0/frontend/src/wslBridge.ts +78 -0
- swe_mux-0.1.0/frontend/test/actionsDrawer.test.ts +181 -0
- swe_mux-0.1.0/frontend/test/agentContext.test.ts +61 -0
- swe_mux-0.1.0/frontend/test/agentEnvironment.test.ts +106 -0
- swe_mux-0.1.0/frontend/test/agentTargets.test.ts +87 -0
- swe_mux-0.1.0/frontend/test/all.ts +214 -0
- swe_mux-0.1.0/frontend/test/approvals.test.ts +153 -0
- swe_mux-0.1.0/frontend/test/assistantConfirm.test.ts +77 -0
- swe_mux-0.1.0/frontend/test/assistantEvents.test.ts +146 -0
- swe_mux-0.1.0/frontend/test/assistantNewConversation.test.ts +166 -0
- swe_mux-0.1.0/frontend/test/assistantSpeech.test.ts +189 -0
- swe_mux-0.1.0/frontend/test/attention.test.ts +65 -0
- swe_mux-0.1.0/frontend/test/audioFrames.test.ts +70 -0
- swe_mux-0.1.0/frontend/test/automationCost.test.ts +194 -0
- swe_mux-0.1.0/frontend/test/branchPoints.test.ts +127 -0
- swe_mux-0.1.0/frontend/test/budgetControl.test.ts +82 -0
- swe_mux-0.1.0/frontend/test/bundleSplit.test.ts +130 -0
- swe_mux-0.1.0/frontend/test/changeMap.test.ts +326 -0
- swe_mux-0.1.0/frontend/test/clipboardHistory.test.ts +157 -0
- swe_mux-0.1.0/frontend/test/commandLine.test.ts +90 -0
- swe_mux-0.1.0/frontend/test/commandRail.test.ts +461 -0
- swe_mux-0.1.0/frontend/test/composerInsertion.test.ts +89 -0
- swe_mux-0.1.0/frontend/test/composerText.test.ts +176 -0
- swe_mux-0.1.0/frontend/test/configurator.test.ts +74 -0
- swe_mux-0.1.0/frontend/test/conversation.test.ts +200 -0
- swe_mux-0.1.0/frontend/test/conversationDraft.test.ts +66 -0
- swe_mux-0.1.0/frontend/test/conversationTarget.test.ts +103 -0
- swe_mux-0.1.0/frontend/test/conversationToggle.test.ts +115 -0
- swe_mux-0.1.0/frontend/test/delimitedText.test.ts +41 -0
- swe_mux-0.1.0/frontend/test/deliveryReadiness.test.ts +167 -0
- swe_mux-0.1.0/frontend/test/devicePresence.test.ts +58 -0
- swe_mux-0.1.0/frontend/test/directoryPicker.test.ts +15 -0
- swe_mux-0.1.0/frontend/test/dismissStack.test.ts +203 -0
- swe_mux-0.1.0/frontend/test/dragReorder.test.ts +114 -0
- swe_mux-0.1.0/frontend/test/drawerLayout.test.ts +277 -0
- swe_mux-0.1.0/frontend/test/drawerNotes.test.ts +79 -0
- swe_mux-0.1.0/frontend/test/drawerSegments.test.ts +233 -0
- swe_mux-0.1.0/frontend/test/drawerTabOrder.test.ts +73 -0
- swe_mux-0.1.0/frontend/test/drawerTabs.test.ts +175 -0
- swe_mux-0.1.0/frontend/test/drawerTransient.test.ts +29 -0
- swe_mux-0.1.0/frontend/test/drawerVisibility.test.ts +98 -0
- swe_mux-0.1.0/frontend/test/dropdown.test.ts +152 -0
- swe_mux-0.1.0/frontend/test/endedPaneBanner.test.ts +105 -0
- swe_mux-0.1.0/frontend/test/eventRefresh.test.ts +30 -0
- swe_mux-0.1.0/frontend/test/fileClipboard.test.ts +85 -0
- swe_mux-0.1.0/frontend/test/fileSearchLimit.test.ts +47 -0
- swe_mux-0.1.0/frontend/test/findings.test.ts +149 -0
- swe_mux-0.1.0/frontend/test/fleetCommands.test.ts +129 -0
- swe_mux-0.1.0/frontend/test/fleetLayouts.test.ts +171 -0
- swe_mux-0.1.0/frontend/test/fleetRefresh.test.ts +231 -0
- swe_mux-0.1.0/frontend/test/fleetStatus.test.ts +42 -0
- swe_mux-0.1.0/frontend/test/gitLand.test.ts +805 -0
- swe_mux-0.1.0/frontend/test/gitReview.test.ts +68 -0
- swe_mux-0.1.0/frontend/test/gitSetup.test.ts +15 -0
- swe_mux-0.1.0/frontend/test/gitTabCache.test.ts +70 -0
- swe_mux-0.1.0/frontend/test/gitWorktrees.test.ts +660 -0
- swe_mux-0.1.0/frontend/test/grants.test.ts +194 -0
- swe_mux-0.1.0/frontend/test/harnessRegistry.test.ts +240 -0
- swe_mux-0.1.0/frontend/test/historyBrowser.test.ts +147 -0
- swe_mux-0.1.0/frontend/test/inputBackend.test.ts +99 -0
- swe_mux-0.1.0/frontend/test/inputOwnership.test.ts +133 -0
- swe_mux-0.1.0/frontend/test/insertionRefusal.test.ts +33 -0
- swe_mux-0.1.0/frontend/test/keyboardReserve.test.ts +120 -0
- swe_mux-0.1.0/frontend/test/kokoroVoices.test.ts +18 -0
- swe_mux-0.1.0/frontend/test/layout.test.ts +281 -0
- swe_mux-0.1.0/frontend/test/layoutBox.test.ts +86 -0
- swe_mux-0.1.0/frontend/test/layoutWriter.test.ts +202 -0
- swe_mux-0.1.0/frontend/test/lineageView.test.ts +90 -0
- swe_mux-0.1.0/frontend/test/liveness.test.ts +303 -0
- swe_mux-0.1.0/frontend/test/llmProvider.test.ts +226 -0
- swe_mux-0.1.0/frontend/test/menuPosition.test.ts +109 -0
- swe_mux-0.1.0/frontend/test/mobileGestures.test.ts +446 -0
- swe_mux-0.1.0/frontend/test/mobileInput.test.ts +129 -0
- swe_mux-0.1.0/frontend/test/mobileKeyboard.test.ts +372 -0
- swe_mux-0.1.0/frontend/test/mobileTerminalDraft.test.ts +97 -0
- swe_mux-0.1.0/frontend/test/mobileTerminalIme.test.ts +33 -0
- swe_mux-0.1.0/frontend/test/mobileVoice.test.ts +14 -0
- swe_mux-0.1.0/frontend/test/mobileWorkspace.test.ts +55 -0
- swe_mux-0.1.0/frontend/test/modelDisplay.test.ts +54 -0
- swe_mux-0.1.0/frontend/test/modelPicker.test.ts +47 -0
- swe_mux-0.1.0/frontend/test/modelPricing.test.ts +108 -0
- swe_mux-0.1.0/frontend/test/modelRouting.test.ts +137 -0
- swe_mux-0.1.0/frontend/test/networkUsage.test.ts +39 -0
- swe_mux-0.1.0/frontend/test/noteEditGuard.test.ts +141 -0
- swe_mux-0.1.0/frontend/test/noteEditor.test.ts +535 -0
- swe_mux-0.1.0/frontend/test/noteEditorSettings.test.ts +118 -0
- swe_mux-0.1.0/frontend/test/noteFind.test.ts +86 -0
- swe_mux-0.1.0/frontend/test/noteOutline.test.ts +150 -0
- swe_mux-0.1.0/frontend/test/noteScroll.test.ts +153 -0
- swe_mux-0.1.0/frontend/test/noteSelection.test.ts +118 -0
- swe_mux-0.1.0/frontend/test/noteTabs.test.ts +54 -0
- swe_mux-0.1.0/frontend/test/notificationPrefs.test.ts +37 -0
- swe_mux-0.1.0/frontend/test/pasteTrace.test.ts +109 -0
- swe_mux-0.1.0/frontend/test/pendingInput.test.ts +36 -0
- swe_mux-0.1.0/frontend/test/pendingSession.test.ts +45 -0
- swe_mux-0.1.0/frontend/test/phase3Workflow.test.ts +90 -0
- swe_mux-0.1.0/frontend/test/pointerDragClaim.test.ts +46 -0
- swe_mux-0.1.0/frontend/test/previewCapture.test.ts +55 -0
- swe_mux-0.1.0/frontend/test/previewLinks.test.ts +10 -0
- swe_mux-0.1.0/frontend/test/processFleet.test.ts +160 -0
- swe_mux-0.1.0/frontend/test/processRows.test.ts +112 -0
- swe_mux-0.1.0/frontend/test/processTree.test.ts +26 -0
- swe_mux-0.1.0/frontend/test/projectConfig.test.ts +121 -0
- swe_mux-0.1.0/frontend/test/projectCreate.test.ts +102 -0
- swe_mux-0.1.0/frontend/test/projectGroups.test.ts +80 -0
- swe_mux-0.1.0/frontend/test/projectResourceCreate.test.ts +22 -0
- swe_mux-0.1.0/frontend/test/projectSort.test.ts +272 -0
- swe_mux-0.1.0/frontend/test/promptRail.test.ts +92 -0
- swe_mux-0.1.0/frontend/test/providerAccounts.test.ts +107 -0
- swe_mux-0.1.0/frontend/test/queueApi.test.ts +155 -0
- swe_mux-0.1.0/frontend/test/queuePane.test.ts +50 -0
- swe_mux-0.1.0/frontend/test/railClearance.test.ts +66 -0
- swe_mux-0.1.0/frontend/test/railDensity.test.ts +145 -0
- swe_mux-0.1.0/frontend/test/railGlassContrast.test.ts +136 -0
- swe_mux-0.1.0/frontend/test/railKeyRepeat.test.ts +149 -0
- swe_mux-0.1.0/frontend/test/railLayout.test.ts +249 -0
- swe_mux-0.1.0/frontend/test/railModifiers.test.ts +125 -0
- swe_mux-0.1.0/frontend/test/railOverflow.test.ts +284 -0
- swe_mux-0.1.0/frontend/test/railPadGesture.test.ts +911 -0
- swe_mux-0.1.0/frontend/test/railPadModel.test.ts +413 -0
- swe_mux-0.1.0/frontend/test/railScope.test.ts +412 -0
- swe_mux-0.1.0/frontend/test/railVoice.test.ts +79 -0
- swe_mux-0.1.0/frontend/test/randomId.test.ts +17 -0
- swe_mux-0.1.0/frontend/test/recentFiles.test.ts +51 -0
- swe_mux-0.1.0/frontend/test/redeployProgress.test.ts +300 -0
- swe_mux-0.1.0/frontend/test/renderer/action-editor-touch.spec.ts +131 -0
- swe_mux-0.1.0/frontend/test/renderer/action-editor.spec.ts +116 -0
- swe_mux-0.1.0/frontend/test/renderer/actionEditorHarness.tsx +43 -0
- swe_mux-0.1.0/frontend/test/renderer/automation-cost-layout.spec.ts +255 -0
- swe_mux-0.1.0/frontend/test/renderer/automationCostHarness.tsx +148 -0
- swe_mux-0.1.0/frontend/test/renderer/change-map-layout.spec.ts +322 -0
- swe_mux-0.1.0/frontend/test/renderer/changeMapHarness.tsx +154 -0
- swe_mux-0.1.0/frontend/test/renderer/command-rail-keys.spec.ts +129 -0
- swe_mux-0.1.0/frontend/test/renderer/command-rail-pad.spec.ts +773 -0
- swe_mux-0.1.0/frontend/test/renderer/commandRailHarness.tsx +222 -0
- swe_mux-0.1.0/frontend/test/renderer/decrqm.spec.ts +26 -0
- swe_mux-0.1.0/frontend/test/renderer/drawer-surfaces.spec.ts +116 -0
- swe_mux-0.1.0/frontend/test/renderer/drawerSurfacesHarness.tsx +143 -0
- swe_mux-0.1.0/frontend/test/renderer/dropdown.spec.ts +198 -0
- swe_mux-0.1.0/frontend/test/renderer/dropdown.ts +22 -0
- swe_mux-0.1.0/frontend/test/renderer/dropdownHarness.tsx +65 -0
- swe_mux-0.1.0/frontend/test/renderer/files-tab.spec.ts +138 -0
- swe_mux-0.1.0/frontend/test/renderer/filesTabHarness.tsx +127 -0
- swe_mux-0.1.0/frontend/test/renderer/git-diff-view.spec.ts +42 -0
- swe_mux-0.1.0/frontend/test/renderer/git-land.spec.ts +311 -0
- swe_mux-0.1.0/frontend/test/renderer/git-map-layout.spec.ts +136 -0
- swe_mux-0.1.0/frontend/test/renderer/git-map-range.spec.ts +126 -0
- swe_mux-0.1.0/frontend/test/renderer/git-map-select.spec.ts +94 -0
- swe_mux-0.1.0/frontend/test/renderer/git-row-layout.spec.ts +128 -0
- swe_mux-0.1.0/frontend/test/renderer/git-setup.spec.ts +39 -0
- swe_mux-0.1.0/frontend/test/renderer/gitDiffHarness.tsx +28 -0
- swe_mux-0.1.0/frontend/test/renderer/gitLandHarness.tsx +131 -0
- swe_mux-0.1.0/frontend/test/renderer/gitMapHarness.tsx +110 -0
- swe_mux-0.1.0/frontend/test/renderer/gitMapRangeHarness.tsx +91 -0
- swe_mux-0.1.0/frontend/test/renderer/gitMapSelectHarness.tsx +106 -0
- swe_mux-0.1.0/frontend/test/renderer/gitRowLayoutHarness.tsx +140 -0
- swe_mux-0.1.0/frontend/test/renderer/gitSetupHarness.tsx +65 -0
- swe_mux-0.1.0/frontend/test/renderer/grant-gate.spec.ts +84 -0
- swe_mux-0.1.0/frontend/test/renderer/grantGateHarness.tsx +81 -0
- swe_mux-0.1.0/frontend/test/renderer/harness.ts +604 -0
- swe_mux-0.1.0/frontend/test/renderer/hidden-note-editor.spec.ts +54 -0
- swe_mux-0.1.0/frontend/test/renderer/hiddenNoteEditorHarness.tsx +46 -0
- swe_mux-0.1.0/frontend/test/renderer/history-layout.spec.ts +181 -0
- swe_mux-0.1.0/frontend/test/renderer/historyHarness.tsx +39 -0
- swe_mux-0.1.0/frontend/test/renderer/jump-latest.spec.ts +44 -0
- swe_mux-0.1.0/frontend/test/renderer/jumpLatest.ts +159 -0
- swe_mux-0.1.0/frontend/test/renderer/lazy-surfaces.spec.ts +116 -0
- swe_mux-0.1.0/frontend/test/renderer/lazySurfacesHarness.tsx +70 -0
- swe_mux-0.1.0/frontend/test/renderer/model-picker.spec.ts +303 -0
- swe_mux-0.1.0/frontend/test/renderer/notes-tab-actions.spec.ts +110 -0
- swe_mux-0.1.0/frontend/test/renderer/notesTabHarness.tsx +66 -0
- swe_mux-0.1.0/frontend/test/renderer/palette-gating.spec.ts +59 -0
- swe_mux-0.1.0/frontend/test/renderer/paletteHarness.tsx +89 -0
- swe_mux-0.1.0/frontend/test/renderer/pane-layout.spec.ts +176 -0
- swe_mux-0.1.0/frontend/test/renderer/paneHarness.tsx +60 -0
- swe_mux-0.1.0/frontend/test/renderer/process-fleet-layout.spec.ts +150 -0
- swe_mux-0.1.0/frontend/test/renderer/processFleetHarness.tsx +88 -0
- swe_mux-0.1.0/frontend/test/renderer/processes-tab-parity.spec.ts +130 -0
- swe_mux-0.1.0/frontend/test/renderer/processesTabHarness.tsx +110 -0
- swe_mux-0.1.0/frontend/test/renderer/prompt-editor.spec.ts +92 -0
- swe_mux-0.1.0/frontend/test/renderer/promptEditorHarness.tsx +93 -0
- swe_mux-0.1.0/frontend/test/renderer/queue-readiness.spec.ts +111 -0
- swe_mux-0.1.0/frontend/test/renderer/queueReadinessHarness.tsx +141 -0
- swe_mux-0.1.0/frontend/test/renderer/quota-grid-layout.spec.ts +120 -0
- swe_mux-0.1.0/frontend/test/renderer/quotaGridHarness.tsx +81 -0
- swe_mux-0.1.0/frontend/test/renderer/rail-dropup.spec.ts +167 -0
- swe_mux-0.1.0/frontend/test/renderer/rail-overflow.spec.ts +450 -0
- swe_mux-0.1.0/frontend/test/renderer/railDropupHarness.tsx +86 -0
- swe_mux-0.1.0/frontend/test/renderer/railOverflowHarness.tsx +158 -0
- swe_mux-0.1.0/frontend/test/renderer/railTouch.ts +74 -0
- swe_mux-0.1.0/frontend/test/renderer/redeploy-chip.spec.ts +110 -0
- swe_mux-0.1.0/frontend/test/renderer/redeployChipHarness.tsx +54 -0
- swe_mux-0.1.0/frontend/test/renderer/resource-layout.spec.ts +22 -0
- swe_mux-0.1.0/frontend/test/renderer/resourceLayoutHarness.ts +22 -0
- swe_mux-0.1.0/frontend/test/renderer/resources-layout.spec.ts +104 -0
- swe_mux-0.1.0/frontend/test/renderer/resourcesHarness.tsx +80 -0
- swe_mux-0.1.0/frontend/test/renderer/scan-timeline-rows.spec.ts +156 -0
- swe_mux-0.1.0/frontend/test/renderer/scanTimelineHarness.tsx +110 -0
- swe_mux-0.1.0/frontend/test/renderer/schedule-layout.spec.ts +232 -0
- swe_mux-0.1.0/frontend/test/renderer/scheduleHarness.tsx +197 -0
- swe_mux-0.1.0/frontend/test/renderer/session-row-layout.spec.ts +441 -0
- swe_mux-0.1.0/frontend/test/renderer/sessionRowHarness.tsx +162 -0
- swe_mux-0.1.0/frontend/test/renderer/setting-reveal.spec.ts +125 -0
- swe_mux-0.1.0/frontend/test/renderer/settingRevealHarness.ts +79 -0
- swe_mux-0.1.0/frontend/test/renderer/settings-layout.spec.ts +339 -0
- swe_mux-0.1.0/frontend/test/renderer/settings-save.spec.ts +116 -0
- swe_mux-0.1.0/frontend/test/renderer/settingsConfigFixture.ts +480 -0
- swe_mux-0.1.0/frontend/test/renderer/settingsHarness.tsx +203 -0
- swe_mux-0.1.0/frontend/test/renderer/sidebar-groups.spec.ts +96 -0
- swe_mux-0.1.0/frontend/test/renderer/sidebarGroupsHarness.tsx +56 -0
- swe_mux-0.1.0/frontend/test/renderer/terminal-webgl.spec.ts +154 -0
- swe_mux-0.1.0/frontend/test/renderer/tutorial-steps.spec.ts +127 -0
- swe_mux-0.1.0/frontend/test/renderer/tutorialHarness.tsx +41 -0
- swe_mux-0.1.0/frontend/test/renderer/usage-layout.spec.ts +148 -0
- swe_mux-0.1.0/frontend/test/renderer/usageHarness.tsx +126 -0
- swe_mux-0.1.0/frontend/test/renderer/voice-capture.spec.ts +21 -0
- swe_mux-0.1.0/frontend/test/renderer/voice-dock.spec.ts +275 -0
- swe_mux-0.1.0/frontend/test/renderer/voice-settings.spec.ts +299 -0
- swe_mux-0.1.0/frontend/test/renderer/voiceCaptureHarness.ts +70 -0
- swe_mux-0.1.0/frontend/test/renderer/voiceDockHarness.tsx +198 -0
- swe_mux-0.1.0/frontend/test/renderer/workspace-smoke.spec.ts +67 -0
- swe_mux-0.1.0/frontend/test/resourceSaveIndicator.test.ts +16 -0
- swe_mux-0.1.0/frontend/test/resourceUsage.test.ts +104 -0
- swe_mux-0.1.0/frontend/test/resumeCommand.test.ts +29 -0
- swe_mux-0.1.0/frontend/test/scanTimeline.test.ts +202 -0
- swe_mux-0.1.0/frontend/test/schedules.test.ts +274 -0
- swe_mux-0.1.0/frontend/test/scrollbackRepaint.test.ts +92 -0
- swe_mux-0.1.0/frontend/test/serverClock.test.ts +62 -0
- swe_mux-0.1.0/frontend/test/sessionAttention.test.ts +249 -0
- swe_mux-0.1.0/frontend/test/sessionFocusHistory.test.ts +64 -0
- swe_mux-0.1.0/frontend/test/sessionJoin.test.ts +131 -0
- swe_mux-0.1.0/frontend/test/sessionKills.test.ts +287 -0
- swe_mux-0.1.0/frontend/test/sessionNames.test.ts +40 -0
- swe_mux-0.1.0/frontend/test/sessionProcesses.test.ts +78 -0
- swe_mux-0.1.0/frontend/test/sessionRowClock.test.ts +109 -0
- swe_mux-0.1.0/frontend/test/sessionRowFields.test.ts +986 -0
- swe_mux-0.1.0/frontend/test/sessionSnapshots.test.ts +67 -0
- swe_mux-0.1.0/frontend/test/sessionStatus.test.ts +320 -0
- swe_mux-0.1.0/frontend/test/settingReveal.test.ts +62 -0
- swe_mux-0.1.0/frontend/test/settingTargets.test.ts +142 -0
- swe_mux-0.1.0/frontend/test/settingsCoverage.test.ts +180 -0
- swe_mux-0.1.0/frontend/test/settingsDraft.test.ts +30 -0
- swe_mux-0.1.0/frontend/test/settingsSave.test.ts +89 -0
- swe_mux-0.1.0/frontend/test/settingsSearch.test.ts +185 -0
- swe_mux-0.1.0/frontend/test/settingsTabs.test.ts +115 -0
- swe_mux-0.1.0/frontend/test/sidebarProjects.test.ts +66 -0
- swe_mux-0.1.0/frontend/test/sidebarSearch.test.ts +223 -0
- swe_mux-0.1.0/frontend/test/skills.test.ts +122 -0
- swe_mux-0.1.0/frontend/test/smartTurnFeatures.test.ts +134 -0
- swe_mux-0.1.0/frontend/test/smartTurnGolden.json +514 -0
- swe_mux-0.1.0/frontend/test/sourceText.test.ts +161 -0
- swe_mux-0.1.0/frontend/test/speechGate.test.ts +124 -0
- swe_mux-0.1.0/frontend/test/spokenListContext.test.ts +64 -0
- swe_mux-0.1.0/frontend/test/staticPreview.test.ts +54 -0
- swe_mux-0.1.0/frontend/test/styleInvariants.test.ts +51 -0
- swe_mux-0.1.0/frontend/test/systemBack.test.ts +153 -0
- swe_mux-0.1.0/frontend/test/tabContextMenu.test.ts +132 -0
- swe_mux-0.1.0/frontend/test/terminalActions.test.ts +73 -0
- swe_mux-0.1.0/frontend/test/terminalAttachments.test.ts +53 -0
- swe_mux-0.1.0/frontend/test/terminalCaretPlacement.test.ts +403 -0
- swe_mux-0.1.0/frontend/test/terminalClipboard.test.ts +207 -0
- swe_mux-0.1.0/frontend/test/terminalHealth.test.ts +77 -0
- swe_mux-0.1.0/frontend/test/terminalInputDiagnostics.test.ts +113 -0
- swe_mux-0.1.0/frontend/test/terminalKeys.test.ts +57 -0
- swe_mux-0.1.0/frontend/test/terminalLetterbox.test.ts +57 -0
- swe_mux-0.1.0/frontend/test/terminalPaneInputBackend.test.ts +153 -0
- swe_mux-0.1.0/frontend/test/terminalProtocol.test.ts +53 -0
- swe_mux-0.1.0/frontend/test/terminalRenderDiagnostics.test.ts +73 -0
- swe_mux-0.1.0/frontend/test/terminalRenderPause.test.ts +49 -0
- swe_mux-0.1.0/frontend/test/terminalRenderer.test.ts +115 -0
- swe_mux-0.1.0/frontend/test/terminalViewport.test.ts +672 -0
- swe_mux-0.1.0/frontend/test/terminalWheelPacing.test.ts +146 -0
- swe_mux-0.1.0/frontend/test/testRegistry.test.ts +82 -0
- swe_mux-0.1.0/frontend/test/theme.test.ts +21 -0
- swe_mux-0.1.0/frontend/test/transcriptAudio.test.ts +143 -0
- swe_mux-0.1.0/frontend/test/transcriptView.test.ts +277 -0
- swe_mux-0.1.0/frontend/test/tutorial.test.ts +107 -0
- swe_mux-0.1.0/frontend/test/uiBuild.test.ts +26 -0
- swe_mux-0.1.0/frontend/test/uiBuildConfig.test.ts +16 -0
- swe_mux-0.1.0/frontend/test/uiCommand.test.ts +52 -0
- swe_mux-0.1.0/frontend/test/uiScale.test.ts +142 -0
- swe_mux-0.1.0/frontend/test/updateCheck.test.ts +113 -0
- swe_mux-0.1.0/frontend/test/usageAnalytics.test.ts +89 -0
- swe_mux-0.1.0/frontend/test/usagePots.test.ts +106 -0
- swe_mux-0.1.0/frontend/test/utteranceCompleteness.test.ts +168 -0
- swe_mux-0.1.0/frontend/test/utteranceDeferral.test.ts +262 -0
- swe_mux-0.1.0/frontend/test/viewHistory.test.ts +235 -0
- swe_mux-0.1.0/frontend/test/viewState.test.ts +132 -0
- swe_mux-0.1.0/frontend/test/voiceCommandReference.test.ts +46 -0
- swe_mux-0.1.0/frontend/test/voiceComms.test.ts +13 -0
- swe_mux-0.1.0/frontend/test/voiceConversationHistory.test.ts +57 -0
- swe_mux-0.1.0/frontend/test/voiceDock.test.ts +254 -0
- swe_mux-0.1.0/frontend/test/voiceFuzzy.test.ts +55 -0
- swe_mux-0.1.0/frontend/test/voiceGroups.test.ts +113 -0
- swe_mux-0.1.0/frontend/test/voiceIntents.test.ts +60 -0
- swe_mux-0.1.0/frontend/test/voiceLatency.test.ts +121 -0
- swe_mux-0.1.0/frontend/test/voiceNavigation.test.ts +59 -0
- swe_mux-0.1.0/frontend/test/voicePlayback.test.ts +600 -0
- swe_mux-0.1.0/frontend/test/voiceQueries.test.ts +178 -0
- swe_mux-0.1.0/frontend/test/wakeWordTest.test.ts +80 -0
- swe_mux-0.1.0/frontend/test/warmPanes.test.ts +293 -0
- swe_mux-0.1.0/frontend/test/wheelScroll.test.ts +31 -0
- swe_mux-0.1.0/frontend/test/workspaceTabs.test.ts +38 -0
- swe_mux-0.1.0/frontend/test/worktreeLaunch.test.ts +27 -0
- swe_mux-0.1.0/frontend/test/worktreeRemoval.test.ts +129 -0
- swe_mux-0.1.0/frontend/test/worktreeSelection.test.ts +112 -0
- swe_mux-0.1.0/frontend/test/wslBridge.test.ts +85 -0
- swe_mux-0.1.0/frontend/tsconfig.json +23 -0
- swe_mux-0.1.0/frontend/tsconfig.test.json +6 -0
- swe_mux-0.1.0/frontend/tutorial-harness.html +3 -0
- swe_mux-0.1.0/frontend/usage-harness.html +3 -0
- swe_mux-0.1.0/frontend/vendor/continuity-editor-0.2.36.tgz +0 -0
- swe_mux-0.1.0/frontend/vite.config.ts +76 -0
- swe_mux-0.1.0/frontend/voice-capture-harness.html +3 -0
- swe_mux-0.1.0/frontend/voice-dock-harness.html +3 -0
- swe_mux-0.1.0/mypy-platform.toml +20 -0
- swe_mux-0.1.0/packaging/build_desktop.py +440 -0
- swe_mux-0.1.0/packaging/desktop_entry.py +6 -0
- swe_mux-0.1.0/packaging/generate_frontend_registry.py +43 -0
- swe_mux-0.1.0/packaging/install_smoke.py +409 -0
- swe_mux-0.1.0/packaging/license_audit.py +734 -0
- swe_mux-0.1.0/packaging/package_desktop_release.py +105 -0
- swe_mux-0.1.0/packaging/redeploy_desktop.py +1080 -0
- swe_mux-0.1.0/packaging/rthook_av_stub.py +27 -0
- swe_mux-0.1.0/packaging/supervisor_entry.py +6 -0
- swe_mux-0.1.0/packaging/swe_mux.spec +128 -0
- swe_mux-0.1.0/packaging/swe_mux_supervisor.spec +71 -0
- swe_mux-0.1.0/packaging/third_party_licenses.json +1217 -0
- swe_mux-0.1.0/packaging/verify_release_artifact.py +628 -0
- swe_mux-0.1.0/packaging/verify_release_unit.py +1367 -0
- swe_mux-0.1.0/pyproject.toml +329 -0
- swe_mux-0.1.0/site/CNAME +1 -0
- swe_mux-0.1.0/site/README.md +626 -0
- swe_mux-0.1.0/site/acknowledgements/index.html +826 -0
- swe_mux-0.1.0/site/changelog/index.html +616 -0
- swe_mux-0.1.0/site/content/acknowledgements-prose.html +58 -0
- swe_mux-0.1.0/site/content/ideas.json +7 -0
- swe_mux-0.1.0/site/content/roadmap.html +127 -0
- swe_mux-0.1.0/site/docs/index.html +792 -0
- swe_mux-0.1.0/site/img/desktop-alerts.webp +0 -0
- swe_mux-0.1.0/site/img/desktop-git.webp +0 -0
- swe_mux-0.1.0/site/img/desktop-insight.webp +0 -0
- swe_mux-0.1.0/site/img/desktop-notes.webp +0 -0
- swe_mux-0.1.0/site/img/desktop-workspace.webp +0 -0
- swe_mux-0.1.0/site/img/logo-light.png +0 -0
- swe_mux-0.1.0/site/img/logo.png +0 -0
- swe_mux-0.1.0/site/img/mobile-alerts.webp +0 -0
- swe_mux-0.1.0/site/img/mobile-nav.webp +0 -0
- swe_mux-0.1.0/site/img/mobile-notes.webp +0 -0
- swe_mux-0.1.0/site/img/mobile-session.webp +0 -0
- swe_mux-0.1.0/site/index.html +891 -0
- swe_mux-0.1.0/site/roadmap/index.html +631 -0
- swe_mux-0.1.0/site/tools/build.py +1182 -0
- swe_mux-0.1.0/site/tools/check.mjs +202 -0
- swe_mux-0.1.0/site/tools/contrast.py +75 -0
- swe_mux-0.1.0/site/tools/ideas.py +327 -0
- swe_mux-0.1.0/site/tools/logo.py +74 -0
- swe_mux-0.1.0/site/tools/placeholders.py +296 -0
- swe_mux-0.1.0/site/tools/wordmark-source.png +0 -0
- swe_mux-0.1.0/src/swe_mux/__init__.py +3 -0
- swe_mux-0.1.0/src/swe_mux/__main__.py +318 -0
- swe_mux-0.1.0/src/swe_mux/adapters/__init__.py +111 -0
- swe_mux-0.1.0/src/swe_mux/adapters/base.py +135 -0
- swe_mux-0.1.0/src/swe_mux/adapters/claude.py +482 -0
- swe_mux-0.1.0/src/swe_mux/adapters/codex.py +416 -0
- swe_mux-0.1.0/src/swe_mux/adapters/omp.py +492 -0
- swe_mux-0.1.0/src/swe_mux/adapters/opencode.py +335 -0
- swe_mux-0.1.0/src/swe_mux/adapters/pi.py +423 -0
- swe_mux-0.1.0/src/swe_mux/adapters/shell.py +81 -0
- swe_mux-0.1.0/src/swe_mux/agent_context.py +883 -0
- swe_mux-0.1.0/src/swe_mux/agent_environment.py +1780 -0
- swe_mux-0.1.0/src/swe_mux/agent_launcher.py +685 -0
- swe_mux-0.1.0/src/swe_mux/agent_messaging.py +1211 -0
- swe_mux-0.1.0/src/swe_mux/agent_skills.py +713 -0
- swe_mux-0.1.0/src/swe_mux/app_keys.py +236 -0
- swe_mux-0.1.0/src/swe_mux/approvals.py +387 -0
- swe_mux-0.1.0/src/swe_mux/assets/configurator/automations.md +98 -0
- swe_mux-0.1.0/src/swe_mux/assets/configurator/diagnostics.md +82 -0
- swe_mux-0.1.0/src/swe_mux/assets/configurator/harnesses.md +93 -0
- swe_mux-0.1.0/src/swe_mux/assets/configurator/modifying-swe-mux.md +91 -0
- swe_mux-0.1.0/src/swe_mux/assets/configurator/orientation.md +88 -0
- swe_mux-0.1.0/src/swe_mux/assets/configurator/rail-and-actions.md +129 -0
- swe_mux-0.1.0/src/swe_mux/assets/configurator/remote.md +76 -0
- swe_mux-0.1.0/src/swe_mux/assets/configurator/settings.md +136 -0
- swe_mux-0.1.0/src/swe_mux/assets/configurator/worktrees.md +89 -0
- swe_mux-0.1.0/src/swe_mux/assets/integrations/edge_tts_bridge.py +90 -0
- swe_mux-0.1.0/src/swe_mux/assets/omp_mux_hook.ts +315 -0
- swe_mux-0.1.0/src/swe_mux/assets/opencode_mux_plugin.js +218 -0
- swe_mux-0.1.0/src/swe_mux/assets/pi_mux_hook.ts +277 -0
- swe_mux-0.1.0/src/swe_mux/assets/project-actions-schema.md +238 -0
- swe_mux-0.1.0/src/swe_mux/assistant.py +4342 -0
- swe_mux-0.1.0/src/swe_mux/attention_narration.py +175 -0
- swe_mux-0.1.0/src/swe_mux/attention_ranking.py +1073 -0
- swe_mux-0.1.0/src/swe_mux/auto_delivery.py +1044 -0
- swe_mux-0.1.0/src/swe_mux/automation.py +2730 -0
- swe_mux-0.1.0/src/swe_mux/automation_registry.py +586 -0
- swe_mux-0.1.0/src/swe_mux/automation_store.py +2692 -0
- swe_mux-0.1.0/src/swe_mux/av_stub.py +79 -0
- swe_mux-0.1.0/src/swe_mux/background_tasks.py +327 -0
- swe_mux-0.1.0/src/swe_mux/behavioral_consumers.py +572 -0
- swe_mux-0.1.0/src/swe_mux/bounded_subprocess.py +326 -0
- swe_mux-0.1.0/src/swe_mux/budget.py +360 -0
- swe_mux-0.1.0/src/swe_mux/build_support.py +58 -0
- swe_mux-0.1.0/src/swe_mux/bundle_archive.py +149 -0
- swe_mux-0.1.0/src/swe_mux/bundle_locks.py +274 -0
- swe_mux-0.1.0/src/swe_mux/bundle_metadata.py +144 -0
- swe_mux-0.1.0/src/swe_mux/claude_models.py +56 -0
- swe_mux-0.1.0/src/swe_mux/cli.py +628 -0
- swe_mux-0.1.0/src/swe_mux/cli_state.py +636 -0
- swe_mux-0.1.0/src/swe_mux/cli_version.py +137 -0
- swe_mux-0.1.0/src/swe_mux/clipboard_store.py +536 -0
- swe_mux-0.1.0/src/swe_mux/code_graph.py +1817 -0
- swe_mux-0.1.0/src/swe_mux/codex_tui.py +46 -0
- swe_mux-0.1.0/src/swe_mux/composer_input.py +300 -0
- swe_mux-0.1.0/src/swe_mux/config.py +2575 -0
- swe_mux-0.1.0/src/swe_mux/configurator.py +1112 -0
- swe_mux-0.1.0/src/swe_mux/console_contention.py +350 -0
- swe_mux-0.1.0/src/swe_mux/delivery_readiness.py +746 -0
- swe_mux-0.1.0/src/swe_mux/desktop.py +793 -0
- swe_mux-0.1.0/src/swe_mux/desktop_window_state.py +262 -0
- swe_mux-0.1.0/src/swe_mux/deterministic_consumers.py +1604 -0
- swe_mux-0.1.0/src/swe_mux/device_presence.py +193 -0
- swe_mux-0.1.0/src/swe_mux/doctor.py +902 -0
- swe_mux-0.1.0/src/swe_mux/doctor_local.py +940 -0
- swe_mux-0.1.0/src/swe_mux/edge_tts_provider.py +793 -0
- swe_mux-0.1.0/src/swe_mux/errors.py +49 -0
- swe_mux-0.1.0/src/swe_mux/event_bus.py +202 -0
- swe_mux-0.1.0/src/swe_mux/file_manager.py +83 -0
- swe_mux-0.1.0/src/swe_mux/fleet_intelligence.py +685 -0
- swe_mux-0.1.0/src/swe_mux/ghost_windows.py +282 -0
- swe_mux-0.1.0/src/swe_mux/git_init.py +342 -0
- swe_mux-0.1.0/src/swe_mux/git_monitor.py +963 -0
- swe_mux-0.1.0/src/swe_mux/git_operations.py +125 -0
- swe_mux-0.1.0/src/swe_mux/git_projects.py +140 -0
- swe_mux-0.1.0/src/swe_mux/git_provenance.py +1531 -0
- swe_mux-0.1.0/src/swe_mux/git_review.py +2055 -0
- swe_mux-0.1.0/src/swe_mux/grants.py +339 -0
- swe_mux-0.1.0/src/swe_mux/harness.py +2269 -0
- swe_mux-0.1.0/src/swe_mux/history.py +4142 -0
- swe_mux-0.1.0/src/swe_mux/history_backfill.py +236 -0
- swe_mux-0.1.0/src/swe_mux/history_scan.py +111 -0
- swe_mux-0.1.0/src/swe_mux/hook_client.py +229 -0
- swe_mux-0.1.0/src/swe_mux/host_platform.py +110 -0
- swe_mux-0.1.0/src/swe_mux/http_support.py +100 -0
- swe_mux-0.1.0/src/swe_mux/keybindings.py +316 -0
- swe_mux-0.1.0/src/swe_mux/kokoro_tts.py +656 -0
- swe_mux-0.1.0/src/swe_mux/land_classify.py +306 -0
- swe_mux-0.1.0/src/swe_mux/land_preconditions.py +306 -0
- swe_mux-0.1.0/src/swe_mux/land_queue.py +1656 -0
- swe_mux-0.1.0/src/swe_mux/land_store.py +1005 -0
- swe_mux-0.1.0/src/swe_mux/launchers.py +234 -0
- swe_mux-0.1.0/src/swe_mux/layouts.py +420 -0
- swe_mux-0.1.0/src/swe_mux/leaf_names.py +84 -0
- swe_mux-0.1.0/src/swe_mux/lifecycle.py +210 -0
- swe_mux-0.1.0/src/swe_mux/llm_endpoint.py +751 -0
- swe_mux-0.1.0/src/swe_mux/logsetup.py +307 -0
- swe_mux-0.1.0/src/swe_mux/loop_lag.py +156 -0
- swe_mux-0.1.0/src/swe_mux/mcp.py +5412 -0
- swe_mux-0.1.0/src/swe_mux/mcp_contract.py +160 -0
- swe_mux-0.1.0/src/swe_mux/mcp_tools.py +1035 -0
- swe_mux-0.1.0/src/swe_mux/meta_hooks.py +414 -0
- swe_mux-0.1.0/src/swe_mux/models.py +678 -0
- swe_mux-0.1.0/src/swe_mux/nested_job.py +94 -0
- swe_mux-0.1.0/src/swe_mux/nested_worktrees.py +153 -0
- swe_mux-0.1.0/src/swe_mux/network_usage.py +363 -0
- swe_mux-0.1.0/src/swe_mux/observation.py +5960 -0
- swe_mux-0.1.0/src/swe_mux/opencode_store.py +332 -0
- swe_mux-0.1.0/src/swe_mux/openrouter.py +1672 -0
- swe_mux-0.1.0/src/swe_mux/operational_telemetry.py +2656 -0
- swe_mux-0.1.0/src/swe_mux/path_identity.py +172 -0
- swe_mux-0.1.0/src/swe_mux/phonics.py +160 -0
- swe_mux-0.1.0/src/swe_mux/posix_firewall.py +150 -0
- swe_mux-0.1.0/src/swe_mux/posix_guardian.py +170 -0
- swe_mux-0.1.0/src/swe_mux/posix_process_group.py +257 -0
- swe_mux-0.1.0/src/swe_mux/prerequisites.py +82 -0
- swe_mux-0.1.0/src/swe_mux/preview_capture.py +342 -0
- swe_mux-0.1.0/src/swe_mux/preview_store.py +133 -0
- swe_mux-0.1.0/src/swe_mux/preview_transport.py +805 -0
- swe_mux-0.1.0/src/swe_mux/process_reaper.py +85 -0
- swe_mux-0.1.0/src/swe_mux/processes.py +2191 -0
- swe_mux-0.1.0/src/swe_mux/profiles.py +554 -0
- swe_mux-0.1.0/src/swe_mux/project_actions.py +1345 -0
- swe_mux-0.1.0/src/swe_mux/project_card.py +626 -0
- swe_mux-0.1.0/src/swe_mux/project_context.py +190 -0
- swe_mux-0.1.0/src/swe_mux/project_files.py +2305 -0
- swe_mux-0.1.0/src/swe_mux/project_init.py +62 -0
- swe_mux-0.1.0/src/swe_mux/project_scope.py +175 -0
- swe_mux-0.1.0/src/swe_mux/project_watcher.py +269 -0
- swe_mux-0.1.0/src/swe_mux/projects.py +413 -0
- swe_mux-0.1.0/src/swe_mux/prompt_library.py +366 -0
- swe_mux-0.1.0/src/swe_mux/prompt_queue.py +2598 -0
- swe_mux-0.1.0/src/swe_mux/provider_accounts.py +2115 -0
- swe_mux-0.1.0/src/swe_mux/pty_backend.py +110 -0
- swe_mux-0.1.0/src/swe_mux/pty_backend_posix.py +281 -0
- swe_mux-0.1.0/src/swe_mux/pty_backend_windows.py +241 -0
- swe_mux-0.1.0/src/swe_mux/pty_host.py +494 -0
- swe_mux-0.1.0/src/swe_mux/push.py +886 -0
- swe_mux-0.1.0/src/swe_mux/py.typed +1 -0
- swe_mux-0.1.0/src/swe_mux/readiness_watch.py +203 -0
- swe_mux-0.1.0/src/swe_mux/recent_files.py +259 -0
- swe_mux-0.1.0/src/swe_mux/reconcile.py +662 -0
- swe_mux-0.1.0/src/swe_mux/redeploy_launch.py +181 -0
- swe_mux-0.1.0/src/swe_mux/routes/__init__.py +114 -0
- swe_mux-0.1.0/src/swe_mux/routes/agent_context.py +147 -0
- swe_mux-0.1.0/src/swe_mux/routes/agent_ingress.py +424 -0
- swe_mux-0.1.0/src/swe_mux/routes/assistant.py +127 -0
- swe_mux-0.1.0/src/swe_mux/routes/attention.py +160 -0
- swe_mux-0.1.0/src/swe_mux/routes/automation.py +1203 -0
- swe_mux-0.1.0/src/swe_mux/routes/branch.py +770 -0
- swe_mux-0.1.0/src/swe_mux/routes/clipboard.py +114 -0
- swe_mux-0.1.0/src/swe_mux/routes/configurator.py +517 -0
- swe_mux-0.1.0/src/swe_mux/routes/diagnostics.py +820 -0
- swe_mux-0.1.0/src/swe_mux/routes/git.py +937 -0
- swe_mux-0.1.0/src/swe_mux/routes/grants.py +265 -0
- swe_mux-0.1.0/src/swe_mux/routes/history.py +322 -0
- swe_mux-0.1.0/src/swe_mux/routes/insights.py +541 -0
- swe_mux-0.1.0/src/swe_mux/routes/land.py +293 -0
- swe_mux-0.1.0/src/swe_mux/routes/notes.py +302 -0
- swe_mux-0.1.0/src/swe_mux/routes/observations.py +347 -0
- swe_mux-0.1.0/src/swe_mux/routes/processes.py +293 -0
- swe_mux-0.1.0/src/swe_mux/routes/project_actions.py +443 -0
- swe_mux-0.1.0/src/swe_mux/routes/project_files.py +324 -0
- swe_mux-0.1.0/src/swe_mux/routes/projects.py +718 -0
- swe_mux-0.1.0/src/swe_mux/routes/prompts.py +133 -0
- swe_mux-0.1.0/src/swe_mux/routes/pty.py +1210 -0
- swe_mux-0.1.0/src/swe_mux/routes/push.py +78 -0
- swe_mux-0.1.0/src/swe_mux/routes/queue.py +252 -0
- swe_mux-0.1.0/src/swe_mux/routes/scan_timeline.py +1105 -0
- swe_mux-0.1.0/src/swe_mux/routes/schedules.py +321 -0
- swe_mux-0.1.0/src/swe_mux/routes/sessions.py +1192 -0
- swe_mux-0.1.0/src/swe_mux/routes/settings.py +467 -0
- swe_mux-0.1.0/src/swe_mux/routes/support.py +113 -0
- swe_mux-0.1.0/src/swe_mux/routes/system.py +924 -0
- swe_mux-0.1.0/src/swe_mux/routes/terminal.py +342 -0
- swe_mux-0.1.0/src/swe_mux/routes/update.py +223 -0
- swe_mux-0.1.0/src/swe_mux/routes/usage.py +229 -0
- swe_mux-0.1.0/src/swe_mux/routes/voice.py +677 -0
- swe_mux-0.1.0/src/swe_mux/runtime_config.py +236 -0
- swe_mux-0.1.0/src/swe_mux/runtime_cwd.py +158 -0
- swe_mux-0.1.0/src/swe_mux/scan_consumers.py +399 -0
- swe_mux-0.1.0/src/swe_mux/scan_timeline.py +1765 -0
- swe_mux-0.1.0/src/swe_mux/schedule_store.py +601 -0
- swe_mux-0.1.0/src/swe_mux/scheduler.py +664 -0
- swe_mux-0.1.0/src/swe_mux/schedules.py +766 -0
- swe_mux-0.1.0/src/swe_mux/screen_mode.py +209 -0
- swe_mux-0.1.0/src/swe_mux/scrollback.py +145 -0
- swe_mux-0.1.0/src/swe_mux/secret_backends.py +320 -0
- swe_mux-0.1.0/src/swe_mux/secret_cipher_windows.py +66 -0
- swe_mux-0.1.0/src/swe_mux/secret_store.py +98 -0
- swe_mux-0.1.0/src/swe_mux/server.py +2307 -0
- swe_mux-0.1.0/src/swe_mux/session.py +7639 -0
- swe_mux-0.1.0/src/swe_mux/session_attachments.py +196 -0
- swe_mux-0.1.0/src/swe_mux/session_control.py +683 -0
- swe_mux-0.1.0/src/swe_mux/session_media.py +113 -0
- swe_mux-0.1.0/src/swe_mux/session_recovery.py +1041 -0
- swe_mux-0.1.0/src/swe_mux/session_resume.py +557 -0
- swe_mux-0.1.0/src/swe_mux/session_titles.py +97 -0
- swe_mux-0.1.0/src/swe_mux/session_watch.py +891 -0
- swe_mux-0.1.0/src/swe_mux/settings_patch.py +309 -0
- swe_mux-0.1.0/src/swe_mux/settings_store.py +365 -0
- swe_mux-0.1.0/src/swe_mux/shim_paths.py +138 -0
- swe_mux-0.1.0/src/swe_mux/spawn_contract.py +434 -0
- swe_mux-0.1.0/src/swe_mux/spawn_probe.py +179 -0
- swe_mux-0.1.0/src/swe_mux/sqlite_store.py +343 -0
- swe_mux-0.1.0/src/swe_mux/startup_phases.py +246 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ChangeMapPane-BmAMqDR-.js +312 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ChangeMapPane-BmAMqDR-.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/CodeEditor-Dk-PW5vg.js +14 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/CodeEditor-Dk-PW5vg.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/GitDiffView-DLZqjFsl.js +16 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/GitDiffView-DLZqjFsl.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/GitDiffView-T3uj2-aP.css +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/GitDiffView-T3uj2-aP.css.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/changeMapLayout.worker-D4Skptgd.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/changeMapLayout.worker-D4Skptgd.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/clike-B9uivgTg.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/clike-B9uivgTg.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/continuity_wasm_bg-CyQ8dtl-.wasm +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/continuity_wasm_bg-CyQ8dtl-.wasm.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/diff-DbItnlRl.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/dockerfile-ZL4hHokT.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/dockerfile-ZL4hHokT.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/haskell-Cw1EW3IL.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/haskell-Cw1EW3IL.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-9S1IdbBC.js +13 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-9S1IdbBC.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-B2AdifhJ.js +885 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-B2AdifhJ.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-B4cuaoWd.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-B4cuaoWd.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-BP_kv-PN.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-BP_kv-PN.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-BSsVPCRN.js +7 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-BSsVPCRN.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-BYfgxfcM.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-BYfgxfcM.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-CGm8hXwA.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-CGm8hXwA.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-CJZrhNKs.js +3 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-CJZrhNKs.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-C_sGKiLP.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-C_sGKiLP.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-Cd9jc5_X.js +2 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-Cd9jc5_X.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-D6y23oVF.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-D6y23oVF.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-DezTEy5U.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-DezTEy5U.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-MfKV3jL_.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-MfKV3jL_.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-QrZhPhw0.css +32 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-QrZhPhw0.css.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-UXl4ApE-.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-UXl4ApE-.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-qS11BjWv.js +6 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-qS11BjWv.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-sRHo1vT4.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/index-sRHo1vT4.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/lua-VAEuO923.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/lua-VAEuO923.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/nginx-DdIZxoE0.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/nginx-DdIZxoE0.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-5-bdKoo7.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-BQQNiIPt.wasm +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-BQQNiIPt.wasm.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-CJxt2Z9d.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-Rz2TxrO3.mjs +81 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ort-wasm-simd-threaded-Rz2TxrO3.mjs.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ort.bundle.min-ByP5eVXb.js +1826 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ort.bundle.min-ByP5eVXb.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/perl-CdXCOZ3F.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/perl-CdXCOZ3F.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/powershell-CFHJl5sT.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/powershell-CFHJl5sT.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/properties-C78fOPTZ.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/protobuf-ChK-085T.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/r-B6wPVr8A.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/r-B6wPVr8A.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ruby-B2Rjki9n.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/ruby-B2Rjki9n.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/shell-CjFT_Tl9.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/shell-CjFT_Tl9.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/silero_vad_v5-CsSLqjY_.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/silero_vad_v5-Dt9-bTDn.onnx +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/swift-BzpIVaGY.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/swift-BzpIVaGY.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/toml-Bm5Em-hy.js +1 -0
- swe_mux-0.1.0/src/swe_mux/static/assets/toml-Bm5Em-hy.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/icons/apple-touch-icon.png +0 -0
- swe_mux-0.1.0/src/swe_mux/static/icons/icon-192.png +0 -0
- swe_mux-0.1.0/src/swe_mux/static/icons/icon-512.png +0 -0
- swe_mux-0.1.0/src/swe_mux/static/icons/icon-maskable-512.png +0 -0
- swe_mux-0.1.0/src/swe_mux/static/index.html +29 -0
- swe_mux-0.1.0/src/swe_mux/static/index.html.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/static/manifest.webmanifest +17 -0
- swe_mux-0.1.0/src/swe_mux/static/notification-sounds/LICENSE.orca.txt +24 -0
- swe_mux-0.1.0/src/swe_mux/static/notification-sounds/blip.mp3 +0 -0
- swe_mux-0.1.0/src/swe_mux/static/notification-sounds/blop.mp3 +0 -0
- swe_mux-0.1.0/src/swe_mux/static/notification-sounds/bong.mp3 +0 -0
- swe_mux-0.1.0/src/swe_mux/static/notification-sounds/ding.mp3 +0 -0
- swe_mux-0.1.0/src/swe_mux/static/notification-sounds/sonar.mp3 +0 -0
- swe_mux-0.1.0/src/swe_mux/static/notification-sounds/thump.mp3 +0 -0
- swe_mux-0.1.0/src/swe_mux/static/notification-sounds/two-tone.mp3 +0 -0
- swe_mux-0.1.0/src/swe_mux/static/sw.js +40 -0
- swe_mux-0.1.0/src/swe_mux/static/sw.js.gz +0 -0
- swe_mux-0.1.0/src/swe_mux/status_timeline.py +512 -0
- swe_mux-0.1.0/src/swe_mux/storage_usage.py +268 -0
- swe_mux-0.1.0/src/swe_mux/subprocess_flags.py +85 -0
- swe_mux-0.1.0/src/swe_mux/supervisor.py +999 -0
- swe_mux-0.1.0/src/swe_mux/supervisor_client.py +1132 -0
- swe_mux-0.1.0/src/swe_mux/tailscale.py +665 -0
- swe_mux-0.1.0/src/swe_mux/terminal_arbitration.py +193 -0
- swe_mux-0.1.0/src/swe_mux/text_safety.py +54 -0
- swe_mux-0.1.0/src/swe_mux/tier0_store.py +736 -0
- swe_mux-0.1.0/src/swe_mux/timer_resolution.py +110 -0
- swe_mux-0.1.0/src/swe_mux/tools/__init__.py +21 -0
- swe_mux-0.1.0/src/swe_mux/tools/git_provenance_backfill.py +1731 -0
- swe_mux-0.1.0/src/swe_mux/transcript_fork.py +402 -0
- swe_mux-0.1.0/src/swe_mux/transcript_view.py +1729 -0
- swe_mux-0.1.0/src/swe_mux/tts_profiles.py +89 -0
- swe_mux-0.1.0/src/swe_mux/ui_build.py +73 -0
- swe_mux-0.1.0/src/swe_mux/update_check.py +833 -0
- swe_mux-0.1.0/src/swe_mux/update_install.py +1087 -0
- swe_mux-0.1.0/src/swe_mux/usage.py +535 -0
- swe_mux-0.1.0/src/swe_mux/verify_progress.py +230 -0
- swe_mux-0.1.0/src/swe_mux/voice.py +3584 -0
- swe_mux-0.1.0/src/swe_mux/voice_audio.py +98 -0
- swe_mux-0.1.0/src/swe_mux/voice_models.py +573 -0
- swe_mux-0.1.0/src/swe_mux/win_jobobj.py +227 -0
- swe_mux-0.1.0/src/swe_mux/windows_firewall.py +498 -0
- swe_mux-0.1.0/src/swe_mux/worktree_exec.py +203 -0
- swe_mux-0.1.0/src/swe_mux/worktree_graveyard.py +260 -0
- swe_mux-0.1.0/src/swe_mux/worktree_mutation.py +556 -0
- swe_mux-0.1.0/src/swe_mux/worktree_setup.py +169 -0
- swe_mux-0.1.0/src/swe_mux/worktree_verify.py +480 -0
- swe_mux-0.1.0/src/swe_mux/wsl_bridge.py +872 -0
- swe_mux-0.1.0/tests/__init__.py +1 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-agent-tool-subagent.json +30 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-approval-resume-pty.json +33 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-approval-resume-transcript.json +33 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-background-pty-reopen.json +105 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-background-queued-completion.json +169 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-background-tasks.json +331 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-classifier-blind.json +28 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-compaction-mid-turn.json +25 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-crash-mid-turn.json +26 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-cron-lifecycle.json +240 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-degraded-parser-live-transcript.json +26 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-esc-pause-without-marker.json +31 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-foreign-subagent-hook.json +127 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-healthy-parser-dead-transcript.json +26 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-hook-transcript-relocation.json +26 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-idle-vs-permission-vs-elicitation.json +39 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-interrupt-aborts-hook-turn.json +22 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-jsonl-boundaries.json +26 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-late-hook-reopen-race.json +32 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-long-tool-never-cut.json +32 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-loop-expiry.json +127 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-loop-lifecycle.json +317 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-modern-spinner-resume.json +30 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-native-completion-closes-hook-turn.json +22 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-nested-child-hooks.json +41 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-parallel-tool-idle-repaint.json +28 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-pending-approval-not-cleared.json +39 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-promote-demote-lifecycle.json +34 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-resume-catchup-recent.json +23 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-resume-catchup-stale.json +22 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-root-subagent.json +30 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-sibling-cross-attribution.json +28 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-startup-dialog.json +32 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-subagent-only-stop.json +27 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-subagents-hooks.json +201 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-subagents-transcript-fallback.json +188 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/claude-watchdog-ended-stuck.json +27 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/codex-current-schema.json +48 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/codex-parser-drift.json +38 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/codex-question-subagent.json +34 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/codex-rate-limit-abort.json +37 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/codex-startup-dialog.json +24 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/codex-unwitnessed-first-turn.json +111 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/codex-watchdog-unknown-tail.json +28 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/daemon-restart-run-recovery.json +35 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/delivery-safety-boundaries.json +62 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/edge_case_inventory.json +166 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/hook-transcript-dedupe.json +26 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-clear.json +22 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-compaction.json +24 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-hook-approval.json +28 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-hook-lifecycle.json +31 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-interrupted-exit.json +28 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-new-session.json +24 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-plain-turn.json +24 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-resume-catchup.json +26 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-task-fanout.json +34 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-tool-turn.json +27 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/omp-unwitnessed-first-turn.json +29 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/opencode-approval.json +124 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/opencode-compaction.json +90 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/opencode-hook-lifecycle.json +167 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/opencode-new-session.json +133 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/opencode-tool-turn.json +136 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/pi-compaction.json +25 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/pi-hook-lifecycle.json +30 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/pi-plain-turn.json +25 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/pi-pty-working-fallback.json +29 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/pi-tool-turn.json +27 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/pi-unknown-record-drift.json +26 -0
- swe_mux-0.1.0/tests/fixtures/detection/v1/promotion-and-exit.json +30 -0
- swe_mux-0.1.0/tests/fixtures/legacy_db/mux_db.sql +552 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/background-wait.bin +1 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/idle-footer.bin +1 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/model-picker.txt +6 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/omp-approval-pending.txt +4 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/omp-idle-thinking-level.txt +2 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/omp-idle.txt +3 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/omp-model-picker.txt +6 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/omp-session-tree.txt +4 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/parallel-tool-completion-idle-repaint.txt +7 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/permission-dialog-parallel-redraw.txt +23 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/permission-dialog.bin +1 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/pi-idle-footer.txt +3 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/pi-working-spinner.txt +4 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/prose-false-positive.txt +3 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/regions.json +30 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/trust-dialog.bin +18 -0
- swe_mux-0.1.0/tests/fixtures/pty_tails/working-spinner.bin +1 -0
- swe_mux-0.1.0/tests/fixtures/ssh-boundaries-v1.json +67 -0
- swe_mux-0.1.0/tests/fixtures/telemetry/v1/claude.json +11 -0
- swe_mux-0.1.0/tests/fixtures/telemetry/v1/codex.json +13 -0
- swe_mux-0.1.0/tests/fixtures/telemetry/v1/omp.json +65 -0
- swe_mux-0.1.0/tests/fixtures/transcripts/v1/claude.jsonl +2 -0
- swe_mux-0.1.0/tests/fixtures/transcripts/v1/codex.jsonl +5 -0
- swe_mux-0.1.0/tests/fixtures/usage/ccusage-by-agent-v20.json +56 -0
- swe_mux-0.1.0/tests/fixtures/usage/claude-v17.json +17 -0
- swe_mux-0.1.0/tests/fixtures/usage/codex-v0.json +13 -0
- swe_mux-0.1.0/tests/fixtures/usage/codex-v20.json +34 -0
- swe_mux-0.1.0/tests/host_paths.py +29 -0
- swe_mux-0.1.0/tests/support/__init__.py +1 -0
- swe_mux-0.1.0/tests/support/claude_transcript.py +116 -0
- swe_mux-0.1.0/tests/support/detection_replay.py +785 -0
- swe_mux-0.1.0/tests/support/fake_supervisor.py +164 -0
- swe_mux-0.1.0/tests/support/legacy_database.py +273 -0
- swe_mux-0.1.0/tests/support/live_daemon.py +176 -0
- swe_mux-0.1.0/tests/support/live_facts.py +84 -0
- swe_mux-0.1.0/tests/support/settle.py +68 -0
- swe_mux-0.1.0/tests/support/status_capture.py +301 -0
- swe_mux-0.1.0/tests/test_adapters.py +866 -0
- swe_mux-0.1.0/tests/test_agent_context.py +392 -0
- swe_mux-0.1.0/tests/test_agent_environment.py +583 -0
- swe_mux-0.1.0/tests/test_agent_launcher_reporting.py +264 -0
- swe_mux-0.1.0/tests/test_agent_lifecycle.py +746 -0
- swe_mux-0.1.0/tests/test_agent_messaging.py +1128 -0
- swe_mux-0.1.0/tests/test_agent_messaging_interject.py +339 -0
- swe_mux-0.1.0/tests/test_agent_skills.py +426 -0
- swe_mux-0.1.0/tests/test_approval_api.py +378 -0
- swe_mux-0.1.0/tests/test_approval_decisions.py +221 -0
- swe_mux-0.1.0/tests/test_approval_keystroke.py +249 -0
- swe_mux-0.1.0/tests/test_approvals.py +411 -0
- swe_mux-0.1.0/tests/test_assistant.py +3345 -0
- swe_mux-0.1.0/tests/test_attention_ranking.py +641 -0
- swe_mux-0.1.0/tests/test_auto_delivery.py +1157 -0
- swe_mux-0.1.0/tests/test_automation_phase6.py +2471 -0
- swe_mux-0.1.0/tests/test_background_tasks.py +334 -0
- swe_mux-0.1.0/tests/test_bounded_subprocess.py +342 -0
- swe_mux-0.1.0/tests/test_branch.py +531 -0
- swe_mux-0.1.0/tests/test_budget_shape.py +353 -0
- swe_mux-0.1.0/tests/test_bundle_locks.py +94 -0
- swe_mux-0.1.0/tests/test_change_map_endpoint.py +658 -0
- swe_mux-0.1.0/tests/test_claude_models.py +53 -0
- swe_mux-0.1.0/tests/test_cli.py +320 -0
- swe_mux-0.1.0/tests/test_cli_profiles.py +57 -0
- swe_mux-0.1.0/tests/test_cli_state.py +511 -0
- swe_mux-0.1.0/tests/test_cli_version_probe.py +166 -0
- swe_mux-0.1.0/tests/test_clipboard_history.py +372 -0
- swe_mux-0.1.0/tests/test_code_graph.py +475 -0
- swe_mux-0.1.0/tests/test_code_graph_detectors.py +165 -0
- swe_mux-0.1.0/tests/test_code_graph_trunk_refresh.py +238 -0
- swe_mux-0.1.0/tests/test_codex_provisional_binding.py +222 -0
- swe_mux-0.1.0/tests/test_codex_subagent_identity.py +244 -0
- swe_mux-0.1.0/tests/test_composer_input.py +292 -0
- swe_mux-0.1.0/tests/test_config_service.py +1099 -0
- swe_mux-0.1.0/tests/test_config_validation_tables.py +107 -0
- swe_mux-0.1.0/tests/test_configurator.py +480 -0
- swe_mux-0.1.0/tests/test_configurator_endpoint.py +471 -0
- swe_mux-0.1.0/tests/test_configurator_mcp.py +350 -0
- swe_mux-0.1.0/tests/test_conpty_integration.py +187 -0
- swe_mux-0.1.0/tests/test_console_contention.py +194 -0
- swe_mux-0.1.0/tests/test_console_contention_session.py +379 -0
- swe_mux-0.1.0/tests/test_control_plane_api.py +932 -0
- swe_mux-0.1.0/tests/test_control_plane_enablement.py +1103 -0
- swe_mux-0.1.0/tests/test_conversation_discovery.py +253 -0
- swe_mux-0.1.0/tests/test_conversation_rollover.py +1480 -0
- swe_mux-0.1.0/tests/test_core.py +689 -0
- swe_mux-0.1.0/tests/test_custom_llm_endpoint.py +539 -0
- swe_mux-0.1.0/tests/test_daemon_restart.py +234 -0
- swe_mux-0.1.0/tests/test_delivery_readiness_evidence.py +529 -0
- swe_mux-0.1.0/tests/test_delivery_readiness_interject.py +208 -0
- swe_mux-0.1.0/tests/test_delivery_readiness_promotion.py +198 -0
- swe_mux-0.1.0/tests/test_desktop.py +501 -0
- swe_mux-0.1.0/tests/test_detection_replay.py +383 -0
- swe_mux-0.1.0/tests/test_deterministic_consumers.py +710 -0
- swe_mux-0.1.0/tests/test_device_presence.py +157 -0
- swe_mux-0.1.0/tests/test_diagnosability.py +675 -0
- swe_mux-0.1.0/tests/test_doctor.py +225 -0
- swe_mux-0.1.0/tests/test_doctor_local.py +563 -0
- swe_mux-0.1.0/tests/test_edge_tts_provider.py +414 -0
- swe_mux-0.1.0/tests/test_events_ws.py +330 -0
- swe_mux-0.1.0/tests/test_file_manager.py +39 -0
- swe_mux-0.1.0/tests/test_first_use_assets.py +322 -0
- swe_mux-0.1.0/tests/test_fleet_phase7.py +478 -0
- swe_mux-0.1.0/tests/test_frontend_automation_contract.py +137 -0
- swe_mux-0.1.0/tests/test_frontend_claude_width_contract.py +100 -0
- swe_mux-0.1.0/tests/test_frontend_control_plane_contract.py +87 -0
- swe_mux-0.1.0/tests/test_frontend_network_usage_contract.py +23 -0
- swe_mux-0.1.0/tests/test_frontend_operational_telemetry_contract.py +123 -0
- swe_mux-0.1.0/tests/test_frontend_phase3_contract.py +703 -0
- swe_mux-0.1.0/tests/test_frontend_phase4_contract.py +963 -0
- swe_mux-0.1.0/tests/test_frontend_phase5_contract.py +195 -0
- swe_mux-0.1.0/tests/test_frontend_profile_contract.py +156 -0
- swe_mux-0.1.0/tests/test_frontend_provider_accounts_contract.py +165 -0
- swe_mux-0.1.0/tests/test_frontend_storage_usage_contract.py +16 -0
- swe_mux-0.1.0/tests/test_frontend_theme_contract.py +87 -0
- swe_mux-0.1.0/tests/test_frontend_ui_scale_contract.py +203 -0
- swe_mux-0.1.0/tests/test_frontend_usage_phase5_contract.py +128 -0
- swe_mux-0.1.0/tests/test_ghost_windows.py +409 -0
- swe_mux-0.1.0/tests/test_git_attribution.py +198 -0
- swe_mux-0.1.0/tests/test_git_drawer.py +244 -0
- swe_mux-0.1.0/tests/test_git_init.py +283 -0
- swe_mux-0.1.0/tests/test_git_landing_attribution.py +376 -0
- swe_mux-0.1.0/tests/test_git_operations.py +309 -0
- swe_mux-0.1.0/tests/test_git_overview_cache.py +387 -0
- swe_mux-0.1.0/tests/test_git_phase4.py +784 -0
- swe_mux-0.1.0/tests/test_git_provenance.py +1580 -0
- swe_mux-0.1.0/tests/test_git_provenance_backfill.py +273 -0
- swe_mux-0.1.0/tests/test_git_review.py +864 -0
- swe_mux-0.1.0/tests/test_global_notes.py +98 -0
- swe_mux-0.1.0/tests/test_grants.py +587 -0
- swe_mux-0.1.0/tests/test_harness_adapter_matrix.py +177 -0
- swe_mux-0.1.0/tests/test_harness_name_literals.py +332 -0
- swe_mux-0.1.0/tests/test_harness_registry.py +752 -0
- swe_mux-0.1.0/tests/test_history_duplicate_repair.py +236 -0
- swe_mux-0.1.0/tests/test_history_metadata.py +141 -0
- swe_mux-0.1.0/tests/test_history_orphaned_runs.py +107 -0
- swe_mux-0.1.0/tests/test_history_phase4.py +350 -0
- swe_mux-0.1.0/tests/test_history_scan.py +244 -0
- swe_mux-0.1.0/tests/test_history_search_budget.py +88 -0
- swe_mux-0.1.0/tests/test_history_v2.py +820 -0
- swe_mux-0.1.0/tests/test_hook_client_decisions.py +146 -0
- swe_mux-0.1.0/tests/test_hook_client_identity.py +154 -0
- swe_mux-0.1.0/tests/test_hook_spool.py +199 -0
- swe_mux-0.1.0/tests/test_install_smoke.py +117 -0
- swe_mux-0.1.0/tests/test_keybindings.py +157 -0
- swe_mux-0.1.0/tests/test_kokoro_tts.py +491 -0
- swe_mux-0.1.0/tests/test_land_api.py +663 -0
- swe_mux-0.1.0/tests/test_land_classify.py +287 -0
- swe_mux-0.1.0/tests/test_land_queue.py +2174 -0
- swe_mux-0.1.0/tests/test_launch_profiles.py +454 -0
- swe_mux-0.1.0/tests/test_leaf_names.py +76 -0
- swe_mux-0.1.0/tests/test_license_audit.py +524 -0
- swe_mux-0.1.0/tests/test_lifecycle_and_logging.py +158 -0
- swe_mux-0.1.0/tests/test_lineage_view.py +146 -0
- swe_mux-0.1.0/tests/test_live_agent_conformance.py +641 -0
- swe_mux-0.1.0/tests/test_live_automations.py +451 -0
- swe_mux-0.1.0/tests/test_live_edge_tts.py +54 -0
- swe_mux-0.1.0/tests/test_live_git_attribution.py +210 -0
- swe_mux-0.1.0/tests/test_live_mcp_control.py +371 -0
- swe_mux-0.1.0/tests/test_llm_endpoint_capabilities.py +423 -0
- swe_mux-0.1.0/tests/test_llm_provider_api.py +560 -0
- swe_mux-0.1.0/tests/test_llm_schemas.py +133 -0
- swe_mux-0.1.0/tests/test_mcp.py +1641 -0
- swe_mux-0.1.0/tests/test_mcp_code_graph.py +157 -0
- swe_mux-0.1.0/tests/test_mcp_consumer_hardening.py +823 -0
- swe_mux-0.1.0/tests/test_mcp_memory.py +670 -0
- swe_mux-0.1.0/tests/test_mcp_project_actions.py +445 -0
- swe_mux-0.1.0/tests/test_mcp_scan_timeline.py +726 -0
- swe_mux-0.1.0/tests/test_mcp_tools.py +624 -0
- swe_mux-0.1.0/tests/test_meta_hooks_phase4.py +76 -0
- swe_mux-0.1.0/tests/test_migration_compatibility.py +360 -0
- swe_mux-0.1.0/tests/test_nested_worktrees.py +113 -0
- swe_mux-0.1.0/tests/test_network_usage.py +141 -0
- swe_mux-0.1.0/tests/test_note_save_loop.py +112 -0
- swe_mux-0.1.0/tests/test_observation.py +3000 -0
- swe_mux-0.1.0/tests/test_opencode_transcript.py +277 -0
- swe_mux-0.1.0/tests/test_openrouter_phase6.py +1404 -0
- swe_mux-0.1.0/tests/test_operational_telemetry_phase2.py +1765 -0
- swe_mux-0.1.0/tests/test_package_map_shape.py +108 -0
- swe_mux-0.1.0/tests/test_perf_caches.py +356 -0
- swe_mux-0.1.0/tests/test_phase3_daily_workflow.py +283 -0
- swe_mux-0.1.0/tests/test_phase5_6.py +513 -0
- swe_mux-0.1.0/tests/test_phase77_behavioral.py +650 -0
- swe_mux-0.1.0/tests/test_phonics.py +66 -0
- swe_mux-0.1.0/tests/test_pi_opencode_adapters.py +542 -0
- swe_mux-0.1.0/tests/test_platform_seams.py +719 -0
- swe_mux-0.1.0/tests/test_preview_rewriting.py +135 -0
- swe_mux-0.1.0/tests/test_processes_phase4.py +1950 -0
- swe_mux-0.1.0/tests/test_processes_snapshot_grouping.py +199 -0
- swe_mux-0.1.0/tests/test_profiles.py +324 -0
- swe_mux-0.1.0/tests/test_project_actions.py +337 -0
- swe_mux-0.1.0/tests/test_project_actions_v2.py +925 -0
- swe_mux-0.1.0/tests/test_project_card.py +490 -0
- swe_mux-0.1.0/tests/test_project_config_writes.py +233 -0
- swe_mux-0.1.0/tests/test_project_context.py +124 -0
- swe_mux-0.1.0/tests/test_project_files.py +660 -0
- swe_mux-0.1.0/tests/test_project_init_scripts.py +190 -0
- swe_mux-0.1.0/tests/test_project_resource_actions.py +184 -0
- swe_mux-0.1.0/tests/test_project_scope.py +113 -0
- swe_mux-0.1.0/tests/test_project_watcher.py +128 -0
- swe_mux-0.1.0/tests/test_projects_reliability.py +711 -0
- swe_mux-0.1.0/tests/test_prompt_queue.py +999 -0
- swe_mux-0.1.0/tests/test_prompt_queue_interject.py +185 -0
- swe_mux-0.1.0/tests/test_prompt_queue_policy_migration.py +95 -0
- swe_mux-0.1.0/tests/test_provider_accounts.py +1120 -0
- swe_mux-0.1.0/tests/test_pty_backend_windows.py +65 -0
- swe_mux-0.1.0/tests/test_pty_supervisor.py +1034 -0
- swe_mux-0.1.0/tests/test_pty_tail_modern.py +262 -0
- swe_mux-0.1.0/tests/test_pty_ws.py +1449 -0
- swe_mux-0.1.0/tests/test_push.py +575 -0
- swe_mux-0.1.0/tests/test_readiness_watch.py +362 -0
- swe_mux-0.1.0/tests/test_recent_files.py +210 -0
- swe_mux-0.1.0/tests/test_redeploy_endpoint.py +1144 -0
- swe_mux-0.1.0/tests/test_release_readiness.py +568 -0
- swe_mux-0.1.0/tests/test_resume_run_adoption.py +565 -0
- swe_mux-0.1.0/tests/test_resumed_transcript_binding.py +226 -0
- swe_mux-0.1.0/tests/test_route_modules.py +167 -0
- swe_mux-0.1.0/tests/test_scan_timeline.py +1303 -0
- swe_mux-0.1.0/tests/test_scheduled_resume.py +747 -0
- swe_mux-0.1.0/tests/test_schedules.py +580 -0
- swe_mux-0.1.0/tests/test_schedules_api.py +363 -0
- swe_mux-0.1.0/tests/test_screen_mode.py +188 -0
- swe_mux-0.1.0/tests/test_security_phase5.py +659 -0
- swe_mux-0.1.0/tests/test_serve_route_ownership.py +163 -0
- swe_mux-0.1.0/tests/test_session_attachments.py +149 -0
- swe_mux-0.1.0/tests/test_session_control.py +594 -0
- swe_mux-0.1.0/tests/test_session_identity.py +596 -0
- swe_mux-0.1.0/tests/test_session_loop_ownership.py +142 -0
- swe_mux-0.1.0/tests/test_session_notes.py +330 -0
- swe_mux-0.1.0/tests/test_session_read_state.py +386 -0
- swe_mux-0.1.0/tests/test_session_recovery.py +904 -0
- swe_mux-0.1.0/tests/test_session_reliability.py +754 -0
- swe_mux-0.1.0/tests/test_session_skills_api.py +450 -0
- swe_mux-0.1.0/tests/test_session_titles.py +89 -0
- swe_mux-0.1.0/tests/test_session_transcript_api.py +213 -0
- swe_mux-0.1.0/tests/test_session_watch.py +821 -0
- swe_mux-0.1.0/tests/test_settings_atomic.py +307 -0
- swe_mux-0.1.0/tests/test_settings_bundle.py +133 -0
- swe_mux-0.1.0/tests/test_settings_hot_apply.py +150 -0
- swe_mux-0.1.0/tests/test_settings_patch.py +259 -0
- swe_mux-0.1.0/tests/test_settings_store.py +219 -0
- swe_mux-0.1.0/tests/test_settings_store_edits.py +138 -0
- swe_mux-0.1.0/tests/test_shim_console_handoff.py +241 -0
- swe_mux-0.1.0/tests/test_spawn_contract.py +358 -0
- swe_mux-0.1.0/tests/test_spawn_probe.py +113 -0
- swe_mux-0.1.0/tests/test_spawn_stage.py +116 -0
- swe_mux-0.1.0/tests/test_spend_label_matrix.py +167 -0
- swe_mux-0.1.0/tests/test_standing_activity.py +1603 -0
- swe_mux-0.1.0/tests/test_startup_gate.py +365 -0
- swe_mux-0.1.0/tests/test_static_preview.py +519 -0
- swe_mux-0.1.0/tests/test_status_capture.py +203 -0
- swe_mux-0.1.0/tests/test_status_contract.py +850 -0
- swe_mux-0.1.0/tests/test_status_timeline.py +564 -0
- swe_mux-0.1.0/tests/test_storage_usage.py +130 -0
- swe_mux-0.1.0/tests/test_store_hardening.py +790 -0
- swe_mux-0.1.0/tests/test_subprocess_correlation.py +213 -0
- swe_mux-0.1.0/tests/test_supervisor_client_guards.py +453 -0
- swe_mux-0.1.0/tests/test_supervisor_client_liveness.py +248 -0
- swe_mux-0.1.0/tests/test_supervisor_client_transport.py +232 -0
- swe_mux-0.1.0/tests/test_supervisor_protocol.py +855 -0
- swe_mux-0.1.0/tests/test_terminal_arbitration.py +193 -0
- swe_mux-0.1.0/tests/test_text_safety.py +98 -0
- swe_mux-0.1.0/tests/test_timer_resolution.py +58 -0
- swe_mux-0.1.0/tests/test_transcript_branches.py +372 -0
- swe_mux-0.1.0/tests/test_transcript_conversation.py +449 -0
- swe_mux-0.1.0/tests/test_transcript_fork.py +265 -0
- swe_mux-0.1.0/tests/test_transcript_forward_slice.py +195 -0
- swe_mux-0.1.0/tests/test_ui_build.py +75 -0
- swe_mux-0.1.0/tests/test_update_check.py +651 -0
- swe_mux-0.1.0/tests/test_update_install.py +974 -0
- swe_mux-0.1.0/tests/test_usage_phase4.py +183 -0
- swe_mux-0.1.0/tests/test_verify_progress.py +172 -0
- swe_mux-0.1.0/tests/test_verify_release_artifact.py +628 -0
- swe_mux-0.1.0/tests/test_verify_release_unit.py +1021 -0
- swe_mux-0.1.0/tests/test_voice.py +2664 -0
- swe_mux-0.1.0/tests/test_windows_reaper.py +43 -0
- swe_mux-0.1.0/tests/test_worktree_files.py +102 -0
- swe_mux-0.1.0/tests/test_worktree_graveyard.py +405 -0
- swe_mux-0.1.0/tests/test_worktree_preflight.py +94 -0
- swe_mux-0.1.0/tests/test_worktree_setup.py +70 -0
- swe_mux-0.1.0/tests/test_worktree_spawn.py +189 -0
- swe_mux-0.1.0/tests/test_worktree_status.py +50 -0
- swe_mux-0.1.0/tests/test_worktree_unborn_head.py +77 -0
- swe_mux-0.1.0/tests/test_wsl_bridge.py +238 -0
- swe_mux-0.1.0/tests/test_wsl_bridge_setup.py +212 -0
- swe_mux-0.1.0/tools/fetch_smart_turn.py +54 -0
- swe_mux-0.1.0/tools/linux_acceptance.sh +110 -0
- swe_mux-0.1.0/tools/linux_agent_acceptance.sh +118 -0
- swe_mux-0.1.0/tools/linux_container_verify.sh +76 -0
- swe_mux-0.1.0/tools/perf_snapshot.py +283 -0
- swe_mux-0.1.0/tools/pty_latency_bench.py +182 -0
- swe_mux-0.1.0/tools/pty_probe.py +163 -0
- swe_mux-0.1.0/tools/smart_turn_golden.py +115 -0
- swe_mux-0.1.0/tools/wsl_dev_setup.sh +446 -0
- swe_mux-0.1.0/trailer/.gitignore +6 -0
- swe_mux-0.1.0/trailer/README.md +83 -0
- swe_mux-0.1.0/trailer/assets/swe-mux-icon.png +0 -0
- swe_mux-0.1.0/trailer/capture_live_ui.py +400 -0
- swe_mux-0.1.0/trailer/explore_live_ui.py +208 -0
- swe_mux-0.1.0/trailer/inspect_live_ui.py +74 -0
- swe_mux-0.1.0/trailer/render.py +1336 -0
- swe_mux-0.1.0/trailer/render_feature_cut.py +822 -0
- swe_mux-0.1.0/trailer/requirements.txt +3 -0
- swe_mux-0.1.0/trailer/storyboard.md +35 -0
- 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`.
|