Fix #362: invite lifecycle UI #369

Merged
crueber merged 1 commit from fix/issue-362 into main 2026-09-12 01:45:18 +00:00
Owner

Expiry display + invitee inbox/accept page.

  • Org Invitations tab: expires column (DateTime while pending, expired chip, em-dash for pre-field rows); create-form share line prints the /invitations deep link.
  • New /invitations inbox: pending org+repo invites with preview/accept/decline; accept disabled once expired (server still 409s fail-closed); ?id=&token= deep link for shared accept URLs; header link gated on authenticated (unreadCount signal, zero new requests).
  • Backend (one small addition, see features/01 Decisions): inbox rows now carry expires_at so the inbox serves expiry in one read; pre-#362 rows omit it (readers treat as unknown, never expired).
  • Docs: features/01 section 7 + Decisions, 12_web_ui.md Decisions.

Tests: identity -race green, cover 96.3% (gate holds); node --test 721 pass + 3 smoke pass against scratch server on 18081; vite+esbuild green; live-API proof (invite create, owner list + bucket index.json carry expires_at). Real-browser check open (shared obscura daemon blocks loopback; no private daemon per workspace rules).

Expiry display + invitee inbox/accept page. - Org Invitations tab: expires column (DateTime while pending, expired chip, em-dash for pre-field rows); create-form share line prints the /invitations deep link. - New /invitations inbox: pending org+repo invites with preview/accept/decline; accept disabled once expired (server still 409s fail-closed); ?id=&token= deep link for shared accept URLs; header link gated on authenticated (unreadCount signal, zero new requests). - Backend (one small addition, see features/01 Decisions): inbox rows now carry expires_at so the inbox serves expiry in one read; pre-#362 rows omit it (readers treat as unknown, never expired). - Docs: features/01 section 7 + Decisions, 12_web_ui.md Decisions. Tests: identity -race green, cover 96.3% (gate holds); node --test 721 pass + 3 smoke pass against scratch server on 18081; vite+esbuild green; live-API proof (invite create, owner list + bucket index.json carry expires_at). Real-browser check open (shared obscura daemon blocks loopback; no private daemon per workspace rules).
Org Invitations tab renders expires_at (+ expired chip); new /invitations
inbox page (list/preview/accept/decline, ?id=&token= deep link) linked
from the header for authenticated users; inbox rows now carry expires_at
(features/01 section 7 + Decisions; 12_web_ui.md Decisions).
Sign in to join this conversation.
No description provided.