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
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user