draft-vods: Drafts tab + remove client poll/publish loops master
Phase 5 UI. The client no longer polls getUploadStatus or calls publishVideo in either flow — both produce a draft server-side that the user publishes later from a new Drafts tab. Finalize flow: finalizeLivestreamRow now just kicks off finalize and tells the user to find the draft in the Drafts tab (no poll, no publishVideo). Records draftUri for an optional deep-link. Upload flow: removed pollStatus + the publish callback. When the TUS upload completes, transition straight to a 'done' phase pointing to the Drafts tab (the server creates the draft on upload completion). Removed isPublishing/ canPublish and the Publish button. Drafts tab (4th tab): lists the user's drafts via place.stream.vod.listDrafts with status badges (Processing/Ready/Error). Ready drafts offer Edit (loads fields into the existing metadata editor, saves via updateDraft), Publish (publishDraft, then removes the draft + shows a View VOD link), and Delete (deleteDraft). Processing/error drafts offer Delete/Discard. Fetches on tab select, mirroring the videos/livestreams pattern. tsc --noEmit -p js/app clean (zero errors); prettier clean. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>