feat(render): node-agent AE snapshot runner (Epic C2) + colour render-binding (Epic B)
Build backend images / build content-svc (push) Failing after 13s
Build backend images / build file-svc (push) Failing after 53s
Build backend images / build gateway (push) Failing after 1m22s
Build backend images / build identity-svc (push) Failing after 19s
Build backend images / build notification-svc (push) Failing after 21s
Build backend images / build render-svc (push) Failing after 20s
Build backend images / build studio-svc (push) Failing after 1m6s

C2 — real-AE scene snapshots on the node:
- node-agent: runner/snapshot.go RunSnapshot (aerender -comp <key> -s f -e f
  → findRenderedOutput → ffmpeg -frames:v 1 PNG); client ClaimSnapshot /
  GetSnapshotUploadURL / ReportSnapshotResult / ReportSnapshotFail; snapshotLoop +
  pollSnapshotOnce mirroring the scan loop (reuses the AE-exclusive lock).
- render-svc: GetSnapshotJobMeta + UploadURL handler presigns a PUT to the
  public-read user-uploads bucket at snapshots/{project}/{scene}.png and returns a
  permanent public_url (not the time-limited export presign); MINIO_UPLOAD_BUCKET +
  MINIO_PUBLIC_URL config + compose env + /snapshot/:id/upload-url route.

Epic B — bind edited colours into the render:
- render-svc GetRenderBindings UNIONs studio.saved_shared_colors +
  saved_scene_colors (type 'color') so the node writes them before render.
- node-agent binder.go routes type:"color" bindings into the bind-spec colors[]
  array that bind.jsx already applies to the frshare colour layers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-11 18:08:43 +03:30
parent 8488acb115
commit 6cf8716d7e
9 changed files with 329 additions and 5 deletions
@@ -77,9 +77,14 @@ type bindLayerSpec struct {
Type string `json:"type"` // "text" | "media" | "audio"
Value string `json:"value"`
}
type bindColorSpec struct {
Key string `json:"key"`
Value string `json:"value"`
}
type bindSpec struct {
Comp string `json:"comp,omitempty"`
Fps int `json:"fps,omitempty"`
Colors []bindColorSpec `json:"colors,omitempty"`
Layers []bindLayerSpec `json:"layers"`
}
@@ -109,6 +114,15 @@ func RunBinder(ctx context.Context, job *Job, workDir string) (string, error) {
if key == "" {
continue
}
// Colours bind to frshare/frd_* text layers (hex source text) — bind.jsx
// propagates them via template expressions, not as visible layer content.
if strings.EqualFold(strings.TrimSpace(b.Type), "color") {
if strings.TrimSpace(b.Value) == "" {
continue
}
spec.Colors = append(spec.Colors, bindColorSpec{Key: key, Value: b.Value})
continue
}
if isMediaBinding(b.Type) {
if strings.TrimSpace(b.Value) == "" {
continue