fix(orbit): pending counter ignored merged/declined items

The "X / Y pending" counter in the queue head and the guest-side
gate-check both used `state.queue.filter(non-host).length`, which is the
*history* count — items the host has already approved or declined still
sit in `state.queue` for attribution lookup, so the counter never
decreased. Reported as "3 / 4 pending" with no actual rows in the
approval list.

The merged / declined sets only exist in the host's local store, so the
guest can't filter them out itself. Solution: the host writes an
authoritative `pendingApprovalCount` into the state blob each tick;
guests (and the host's own UI) read it directly, with a fallback to the
old over-counting behaviour for any older client that doesn't write the
field.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Psychotoxical
2026-04-25 01:30:57 +02:00
parent cfb7e7f6c1
commit 7c379c2111
4 changed files with 35 additions and 9 deletions
+8
View File
@@ -106,6 +106,14 @@ export interface OrbitState {
* before they reach the approval list. Symmetric — host can re-enable.
*/
suggestionBlocked?: string[];
/**
* Authoritative count of suggestions actually waiting on host action right
* now (`state.queue` minus host-authored, merged, declined). The host
* rewrites it every tick — guests can't compute it themselves because the
* merged/declined sets live in the host's local store. Older clients that
* don't write the field fall back to a `state.queue` count in the UI.
*/
pendingApprovalCount?: number;
}
/**