117 lines
7.1 KiB
Markdown
117 lines
7.1 KiB
Markdown
---
|
|
phase: 44-video-presentations
|
|
plan: 02
|
|
subsystem: content-renderer
|
|
tags: [remotion, video, presentations, typescript, llm, sse, puter-inference]
|
|
|
|
# Dependency graph
|
|
requires:
|
|
- phase: 44-video-presentations/44-01
|
|
provides: packages/content-renderer workspace package, getBundlePath, renderPresentationComposition, PresentationBundle type, presentation case in content-job-runner stub
|
|
- phase: 40-job-infrastructure
|
|
provides: content_jobs table, SSE live events, publishLiveEvent
|
|
provides:
|
|
- renderPresentation function — LLM slide JSON generation + Remotion MP4 render + SSE progress events
|
|
- server/src/types/content-renderer.d.ts — ambient module declaration isolating Remotion JSX from server tsc
|
|
affects:
|
|
- 44-video-presentations/44-03 (UI PresentationPanel consumes PresentationBundle returned by this renderer)
|
|
|
|
# Tech tracking
|
|
tech-stack:
|
|
added: []
|
|
patterns:
|
|
- Ambient module declaration (content-renderer.d.ts) isolates Remotion/React JSX from server tsc context — force-added with git add -f following express.d.ts precedent
|
|
- Dynamic import pattern: await import("@paperclipai/content-renderer") at runtime keeps webpack/rspack out of server tsc compilation
|
|
- stripMarkdownFences local helper (same pattern as pdf-renderer and brand-renderer) cleans LLM output before JSON.parse
|
|
- try/catch around resolveBrowserPath — falls back to undefined so Remotion auto-downloads Chromium if needed
|
|
|
|
key-files:
|
|
created:
|
|
- server/src/services/renderers/presentation-renderer.ts
|
|
- server/src/types/content-renderer.d.ts
|
|
modified: []
|
|
|
|
key-decisions:
|
|
- "Ambient module declaration in server/src/types/content-renderer.d.ts provides type safety for dynamic import without pulling JSX composition files into server tsc context"
|
|
- "content-renderer NOT added as workspace dep in server/package.json — symlink in node_modules causes tsc to walk JSX source files even with dynamic import; ambient declaration is sufficient"
|
|
- "resolveBrowserPath wrapped in try/catch — falls back to undefined so Remotion auto-downloads Chromium if Playwright binary not found"
|
|
- "videoType 'demo-video' or 'demo' both map to DemoVideo composition — content-renderer uses 'demo' internally, renderer accepts both"
|
|
|
|
patterns-established:
|
|
- "Ambient module declaration pattern: server/src/types/*.d.ts for packages whose source includes JSX/webpack contexts (force-add to bypass gitignore)"
|
|
|
|
requirements-completed: [PRES-01, PRES-02, PRES-03, PRES-04]
|
|
|
|
# Metrics
|
|
duration: 12min
|
|
completed: 2026-04-04
|
|
---
|
|
|
|
# Phase 44 Plan 02: Video Presentations — Presentation Renderer Summary
|
|
|
|
**renderPresentation function with LLM pitch-deck/demo-video slide generation (puterChatComplete), Remotion MP4 rendering (concurrency:1 via content-renderer), and SSE content_job.progress events**
|
|
|
|
## Performance
|
|
|
|
- **Duration:** ~12 min
|
|
- **Started:** 2026-04-04T23:26:00Z
|
|
- **Completed:** 2026-04-04T23:38:00Z
|
|
- **Tasks:** 2
|
|
- **Files modified:** 2
|
|
|
|
## Accomplishments
|
|
|
|
- Created `server/src/services/renderers/presentation-renderer.ts` — replaces stub from plan 01 with full implementation: LLM generates 6-10 pitch-deck slides or 4-8 demo-video slides as structured JSON, Remotion renders to MP4 Buffer via dynamic import of content-renderer, SSE progress events published via publishLiveEvent
|
|
- Created `server/src/types/content-renderer.d.ts` — ambient module declaration providing type safety for the dynamic import without pulling React/JSX composition files into server tsc context (no jsx option in server tsconfig)
|
|
- Both server and shared packages compile without TypeScript errors
|
|
|
|
## Task Commits
|
|
|
|
1. **Task 1: Create presentation-renderer with LLM slide generation and Remotion render pipeline** - `161ff9cf` (feat)
|
|
2. **Task 2: Verify server tsc compilation with presentation renderer wired** - `28a8d63d` (feat)
|
|
|
|
## Files Created/Modified
|
|
|
|
- `server/src/services/renderers/presentation-renderer.ts` — Full renderPresentation implementation: LLM slide JSON → Remotion MP4 → PresentationBundle JSON
|
|
- `server/src/types/content-renderer.d.ts` — Ambient declaration for @paperclipai/content-renderer (force-added, bypasses gitignore)
|
|
|
|
## Decisions Made
|
|
|
|
- Ambient module declaration instead of workspace dep: adding `@paperclipai/content-renderer` as a workspace dep caused TypeScript to resolve the package source (package.json exports `./src/index.ts`) and walk into JSX files, triggering `--jsx is not set` errors. The ambient declaration in `server/src/types/` provides correct types without the source resolution.
|
|
- `resolveBrowserPath` wrapped in try/catch — if Playwright Chromium is not installed, `browserExecutable` is `undefined` and Remotion will auto-download Chromium (acceptable fallback for first-time setup).
|
|
- Both `"demo-video"` and `"demo"` input values for `videoType` map to the DemoVideo composition — content-renderer internally uses `videoType === "demo"` to select the composition.
|
|
|
|
## Deviations from Plan
|
|
|
|
### Auto-fixed Issues
|
|
|
|
**1. [Rule 3 - Blocking] Ambient module declaration to resolve tsc JSX incompatibility**
|
|
- **Found during:** Task 2 (TypeScript compilation verification)
|
|
- **Issue:** Adding `@paperclipai/content-renderer` as workspace dependency caused tsc to resolve the package's source files (package.json maps exports to `./src/index.ts`), which includes React JSX compositions. Server tsconfig has no `jsx` option, resulting in `TS6142: Module './PitchDeck' was resolved to PitchDeck.tsx but --jsx is not set` errors. This blocked successful compilation.
|
|
- **Fix:** Removed `@paperclipai/content-renderer` from server/package.json and created `server/src/types/content-renderer.d.ts` as an ambient module declaration. This provides type safety for the dynamic import without TypeScript resolving the JSX source files. Force-added with `git add -f` (file would otherwise be excluded by `server/src/**/*.d.ts` gitignore pattern — same approach used for `express.d.ts`).
|
|
- **Files modified:** `server/src/types/content-renderer.d.ts` (created), `server/package.json` (reverted content-renderer dep)
|
|
- **Verification:** `pnpm --filter @paperclipai/server exec -- npx tsc --noEmit` exits 0
|
|
- **Committed in:** `28a8d63d` (Task 2 commit)
|
|
|
|
---
|
|
|
|
**Total deviations:** 1 auto-fixed (1 blocking — tsc JSX incompatibility)
|
|
**Impact on plan:** Required for correct TypeScript compilation. The ambient declaration pattern is the correct architectural solution for Remotion isolation. No scope creep.
|
|
|
|
## Issues Encountered
|
|
|
|
- Parallel agent had already executed plan 44-03 by the time Task 2 was being completed. The `content-renderer.d.ts` ambient declaration was committed as a new file — it did not conflict with plan 44-03 work (which touched UI files only).
|
|
|
|
## Known Stubs
|
|
|
|
None — `renderPresentation` is fully implemented; no stubs remain.
|
|
|
|
## Next Phase Readiness
|
|
|
|
- `renderPresentation` is fully wired: LLM → slides JSON → Remotion → MP4 → PresentationBundle
|
|
- Plan 44-03 (UI) already executed in parallel — PresentationPanel consumes PresentationBundle via the content-job SSE pattern
|
|
- TypeScript compilation passes for server and shared packages
|
|
|
|
---
|
|
*Phase: 44-video-presentations*
|
|
*Completed: 2026-04-04*
|