mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
Video pipeline fixes: visibility strip, rich briefs, spotlight timing + fps (#369)
* feat(video): pipeline visibility — strip, state-aware queue, render-error capture Task 1 of the 2026-07-09 video-pipeline review. New CEO-gated GET /video/pipeline lists every in-flight video item (authoring statuses, rendering attempt n/max, terminal failures with the error — now stamped onto the video_draft marker instead of dying as a log line). source_task_id exposed on both video schemas. Panel: pipeline strip on the Social page, state-aware queue empty copy, title/script on queue rows, missing cuts disabled instead of a blank player, notifications deep-link related_task_id. MAX_VIDEO_RENDER_ATTEMPTS moved to the markers policy layer (single source of truth). * feat(video): rich authoring briefs — changelog section, brand voice, kit pointer Task 2 of the 2026-07-09 video-pipeline review. The release brief is now a structured block (full CHANGELOG section capped at 4000 chars + highlights) instead of one LLM-compressed sentence; brand_voice and a motion/kit design-bar pointer are appended centrally in open_video_task so release, spotlight, and on-demand paths all inherit them. suggested_input_props seeded on the video_draft marker; third acceptance criterion pins the design bar; propose_video docstring points at the kit. * fix(video): spotlight video drafts on CEO approval, renderer honors data-fps Task 4 of the 2026-07-09 video-pipeline review. The companion-video hook moves from propose_feature_spotlight (HoM authoring time) to XPostService approve's posted-success branch for x_feature drafts, mirroring the release-publish seam — a rejected spotlight no longer burns a ux-dev cycle; wants_video/video_script ride the x_feature_ref marker. Best-effort: a video-engine failure never breaks the post. render.js reads data-fps from the composition HTML (clamped 24-60, fallback 30) instead of hardcoding 30; parseFps covered by node --test. --------- Co-authored-by: Renn F <rennf93@users.noreply.github.com>
This commit is contained in:
@@ -41,6 +41,7 @@ export { videoApi, videoMediaUrl } from "./video";
|
||||
export type {
|
||||
VideoCut,
|
||||
VideoPost,
|
||||
VideoPipelineItem,
|
||||
VideoPostExecuteResult,
|
||||
VideoPostHistoryEntry,
|
||||
VideoRequestResult,
|
||||
|
||||
@@ -22,6 +22,24 @@ export interface VideoPost {
|
||||
tiktok_caption?: string | null;
|
||||
reject_reason?: string | null;
|
||||
mp4_paths?: Record<string, string>;
|
||||
source_task_id?: string | null; // the authoring task this draft rendered from
|
||||
}
|
||||
|
||||
// One in-flight source=video authoring task — GET /video/pipeline
|
||||
// (roboco/api/routes/video.py). Spans claim through the render loop's
|
||||
// retry/failure states; a rendered task drops out (it's visible via
|
||||
// VideoPost/listPosts instead).
|
||||
export interface VideoPipelineItem {
|
||||
task_id: string;
|
||||
title: string;
|
||||
occasion: string;
|
||||
status: string;
|
||||
pr_number: number | null;
|
||||
composition_id: string | null;
|
||||
render_status: string | null; // null (pending/retrying) | "rendered" | "failed"
|
||||
render_attempts: number;
|
||||
max_attempts: number;
|
||||
render_error: string | null;
|
||||
}
|
||||
|
||||
export interface VideoPostExecuteResult {
|
||||
@@ -44,6 +62,7 @@ export interface VideoPostHistoryEntry {
|
||||
reject_reason?: string | null;
|
||||
posted: Record<string, string>; // platform -> posted id
|
||||
acted_at: string;
|
||||
source_task_id?: string | null; // the authoring task this draft rendered from
|
||||
}
|
||||
|
||||
export interface VideoRequestResult {
|
||||
@@ -72,6 +91,11 @@ export const videoApi = {
|
||||
const { data } = await api.get<VideoPost[]>("/video/posts");
|
||||
return data;
|
||||
},
|
||||
// Every in-flight source=video authoring task — the pipeline strip's basis.
|
||||
listPipeline: async (): Promise<VideoPipelineItem[]> => {
|
||||
const { data } = await api.get<VideoPipelineItem[]>("/video/pipeline");
|
||||
return data;
|
||||
},
|
||||
// Posted or rejected drafts, newest-acted-first. Fixed default limit (50);
|
||||
// no "load more" — pass a higher limit if the panel ever needs it.
|
||||
listHistory: async (limit = 50): Promise<VideoPostHistoryEntry[]> => {
|
||||
|
||||
Reference in New Issue
Block a user