Skip to content

feat: Fan Out core component#4925

Open
superleomori wants to merge 10 commits into
mainfrom
feat/fan-out-component
Open

feat: Fan Out core component#4925
superleomori wants to merge 10 commits into
mainfrom
feat/fan-out-component

Conversation

@superleomori
Copy link
Copy Markdown

Summary

Adds a new Fan Out core component that reads an array from the upstream payload and emits one downstream event per element — a first-class fan-out primitive for SuperPlane canvases.

Modeled on the existing "One By One" emit mode pattern.

What's new\n\n****\n- config field (expression type) — evaluated against the incoming event\n- Emits one event per element on the output channel\n- Each payload contains: , , \n- Empty array → (no events, no failure)\n- Reflect-based fallback handles typed slices from expression engine\n\nRegistry — component registered in \n\n## Tests\n\n4 unit tests covering: normal fan-out, empty array, non-array expression error, missing config error.\n\n\n\n## Closes\n\nCloses #3312\nRelated to #4921

Adds a new FanOut component that reads an array from the upstream payload
and emits one downstream event per element.

- Input: arrayExpression (evaluated via ExpressionContext)
- Output: one fanout.item event per element on the "item" channel
- Each payload includes: item, index, totalCount
- Empty array → Pass() with no events emitted
- Modeled on readMemory oneByOne emit pattern

Closes #3312
Related to #4921

Signed-off-by: Leo (OpenClaw Agent) <leo@superplane.com>
@superplanehq-integration
Copy link
Copy Markdown

👋 Commands for maintainers:

  • /sp start - Start an ephemeral machine (takes ~30s)
  • /sp stop - Stop a running machine (auto-executed on pr close)

@AleksandarCole
Copy link
Copy Markdown
Collaborator

/sp start

@superplanehq-integration
Copy link
Copy Markdown

😢 Failed to start environment make dev.start

See Logs:

ssh -o StrictHostKeyChecking=no app@178.105.52.46 tail -n 100 /tmp/dev-start.log

shiroyasha and others added 2 commits May 21, 2026 09:56
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Igor Šarčević <igor@operately.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@shiroyasha shiroyasha force-pushed the feat/fan-out-component branch from 011c120 to e26abe9 Compare May 21, 2026 07:59
Signed-off-by: Igor Šarčević <igor@operately.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Register fanOut in componentBaseMappers and eventStateRegistries so the
canvas shows the split icon, array expression specs, and item-channel
execution states instead of the noop fallback.

Signed-off-by: Igor Šarčević <igor@operately.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Igor Šarčević <igor@operately.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@shiroyasha shiroyasha force-pushed the feat/fan-out-component branch from 4be0d5f to 1db80eb Compare May 21, 2026 09:00
shiroyasha and others added 5 commits May 21, 2026 11:17
Register fanOut in the experimental features registry so the component
picker shows it when the org enables the feature, matching Runner rollout.

Signed-off-by: Igor Šarčević <igor@operately.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Fan Out is a generally available core component like Filter and Merge.

Signed-off-by: Igor Šarčević <igor@operately.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Igor Šarčević <igor@operately.com>
Signed-off-by: Igor Šarčević <igor@operately.com>
Signed-off-by: Igor Šarčević <igor@operately.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants