manage.sh controllers: collapse duplicate-paired devices to one entry

Live user feedback: being asked to pick between 6 numbered entries that
were all the exact same device (client_id repeated 6x from re-pairing)
was genuinely confusing, especially right when the user was already
trying to get to the controller-type poll further down the flow.

The picker now dedupes to distinct client_ids only, first-occurrence
order, tagging a collapsed entry "(paired Nx)" - matches what Wolf's own
get_client_by_id() actually resolves to anyway (first match for a given
id), so nothing is lost by not offering the later duplicates as separate
choices. Verified against the user's real 8-entry (6 duplicate + 2
unique) client list, both with and without an active session, confirming
the controller log-poll still runs correctly right after selection in
both cases.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLX1yYKJExGSXmgUhxKQG6
This commit is contained in:
Claude
2026-09-03 18:03:45 +00:00
parent 4ed7a9d2d5
commit c57f760fdc
+35 -17
View File
@@ -3423,8 +3423,24 @@ COMPEOF
# recognize ("oh, that's my gaming PC").
SESSIONS_JSON=$(sudo curl -fsS --unix-socket "$SOCK" http://localhost/api/v1/sessions 2>/dev/null)
# Wolf doesn't dedupe repeated pairings of the same device (confirmed
# live: re-pairing the same PC 6 times over produced 6 separate list
# entries, all with the identical client_id) — and Wolf's own
# get_client_by_id() (config.hpp) resolves by taking the FIRST match
# for a given id anyway, so every duplicate beyond the first is a
# dead ringer with no functional difference. Rather than force a
# choice between 6 identical-outcome options (confirmed live: this
# was a real, confusing thing to be asked to do), the picker only
# ever shows DISTINCT client_ids, first-occurrence order — matching
# what Wolf itself would actually resolve to regardless of which
# duplicate got picked.
CLIENT_IDS=()
while IFS= read -r cid; do CLIENT_IDS+=("$cid"); done < <(echo "$CLIENTS_JSON" | python3 -c "
while IFS= read -r cid; do
for existing in "${CLIENT_IDS[@]}"; do
[ "$existing" = "$cid" ] && continue 2
done
CLIENT_IDS+=("$cid")
done < <(echo "$CLIENTS_JSON" | python3 -c "
import json, sys
for c in json.load(sys.stdin)['clients']:
print(c['client_id'])
@@ -3435,7 +3451,7 @@ for c in json.load(sys.stdin)['clients']:
fi
echo ""
echo "Paired clients (ACTIVE = streaming from this IP right now — the"
echo "Paired devices (ACTIVE = streaming from this IP right now — the"
echo "reliable way to tell which entry is yours. If nothing shows"
echo "ACTIVE, start streaming from the device you want to configure,"
echo "leave it connected, and re-run this in another terminal):"
@@ -3446,21 +3462,21 @@ try:
active = {s['client_id']: s['client_ip'] for s in json.loads(sys.argv[1]).get('sessions', []) if s.get('client_id')}
except Exception:
active = {}
for i, c in enumerate(d['clients']):
ov = c['settings'].get('controllers_override') or []
seen = []
counts = {}
for c in d['clients']:
cid = c['client_id']
counts[cid] = counts.get(cid, 0) + 1
if cid not in seen:
seen.append(cid)
for i, cid in enumerate(seen):
first = next(c for c in d['clients'] if c['client_id'] == cid)
ov = first['settings'].get('controllers_override') or []
tag = 'ACTIVE - streaming from ' + active[cid] if cid in active else 'not currently connected'
print(f\" {i+1}) {cid} [{tag}]\")
dup = f\" (paired {counts[cid]}x)\" if counts[cid] > 1 else ''
print(f\" {i+1}) {cid}{dup} [{tag}]\")
print(f\" current override: {ov if ov else 'none - auto-detect'}\")
" "$SESSIONS_JSON"
DUP_COUNT=$(printf '%s\n' "${CLIENT_IDS[@]}" | sort | uniq -d | wc -l)
if [ "$DUP_COUNT" -gt 0 ]; then
echo ""
echo "Note: some client_ids above are repeated — the same device was"
echo "paired more than once (each pairing gets its own entry, Wolf"
echo "doesn't dedupe). Harmless, but if you want a clean list, forget"
echo "/ re-pair this PC from Moonlight's own settings on the client."
fi
ACTIVE_CLIENT_ID=$(python3 -c "
import json, sys
@@ -4246,10 +4262,12 @@ is actively streaming right now with its real IP address, e.g.
it's used automatically with no prompt. **For the clearest result: start
streaming from the device you want to configure, leave it connected, and
run this command while it's still connected** — then there's no
guessing. It's also normal to see the same client_id listed more than
once (Wolf doesn't dedupe repeated pairings of the same device) — every
duplicate of an active ID is tagged ACTIVE together, so it doesn't matter
which one you'd have picked by hand.
guessing. Wolf doesn't dedupe repeated pairings of the same device — if
you've paired the same PC more than once, this tool collapses those
into a single listed entry tagged e.g. \`(paired 6x)\` instead of forcing
a choice between several options that all resolve identically (confirmed
live: being asked to pick between 6 identical-outcome entries was
genuinely confusing before this).
**It labels controllers "1st"/"2nd"/"3rd"/"4th" — always meaning Wolf's own
"controller 0"/"controller 1"/"controller 2"/"controller 3".** Wolf's own