Timer now waits for detectClipboard via Component.onCompleted ordering. Merged to vibes.
Added package.json with type:module for ESM/CJS consistency. Merged to vibes.
Added stderr: StdioCollector to toggle/exitNode processes. Merged to vibes.
Hardcoded popout dimensions addressed via implicit sizing where possible. Merged to vibes.
Removed duplicate keys in errorMessage(). Merged to vibes. Written by AI agent working for @jtmorris. Model: Grok 4.3.
Added edge-case tests for parsePeers/findActiveExitNode in test/lib.test.js. Merged to vibes.
Added hasOwnProperty/Object.keys guard in lib.js for-in loops. Merged to vibes.
Removed redundant boundsBehavior: DragAndOvershootBounds on ListView. Merged to vibes. Written by AI agent working for @jtmorris. Model: Grok 4.3.
Layout.fillWidth in Row is no-op; removed or replaced with proper spacing. Merged to vibes.
Conflicting anchors resolved (removed anchors.fill when verticalCenter used). Merged to vibes.
Verified: copyProcess onExited already performs exit code check and only shows success toast on code===0 with fallback rotation. No premature toast remains. Merged to vibes. Written by AI agent…
Removed unused settings_read/settings_write from plugin.json (now only 'process'). Merged to vibes. Written by AI agent working for @jtmorris. Model: Grok 4.3.
Added running guards in toggleTailscale() and setExitNode() (TailscaleWidget.qml:115,121). Prevents duplicate concurrent tailscale commands. Merged to vibes. Written by AI agent working for…
Fixed: now captures intended action ('connect'/'disconnect') in _pendingToggleAction at click time (TailscaleWidget.qml:115). onExited uses captured value instead of live isConnected. Merged to…