Skip to content

Bind mapped stub-task arguments in the TypeScript SDK runtime #71062

Description

@jason810496

Background

#70570 makes the execution API derive a per-map-index arg-binding spec for a dynamically mapped @task.stub. #70571 implements the Go-SDK consumer; the TypeScript SDK has neither the mapped consumer nor the unmapped one yet, so this work assumes the TypeScript arg-binding consumer for unmapped stub calls lands first.

XComArgBinding carries two selectors the unmapped path never sets:

  • map_index — pull the upstream XCom row at that index (expand over a mapped upstream).
  • element_index — pull the unmapped upstream row, then take element N of the resulting sequence (expand over an unmapped upstream's list output).

Literal expands are resolved to their element server-side and arrive as plain literals, so the binding surface itself is unchanged from the unmapped case.

Note that the generated ts-sdk/src/generated/supervisor.ts models are regenerated as part of the upstream schema bump, so the types should already be present; only the runtime resolution is missing.

What needs to happen

  1. Extend the TypeScript runtime's arg-binding resolution to honour map_index and element_index, with typed and out-of-range errors that fail the task before the handler runs.
  2. Keep the unmapped path unchanged: a binding with neither selector takes the whole value.
  3. Add a mapped example to the TypeScript example bundle and cover it with an Airflow-level integration test, alongside the existing coordinator-mode tests.

Acceptance criteria

  • A @task.stub expanded with .expand() delivers the correct per-index element to the TypeScript handler for all three expand forms (literal collection, unmapped upstream's list output, mapped upstream).
  • Multiple expanded kwargs (the cross product) bind correctly, including mixed expand sources in one call.
  • .partial() literals and unmapped-upstream XComs bind identically on every index.
  • Out-of-range or type-mismatched selectors reject loudly instead of silently passing undefined.

Context

Metadata

Metadata

Assignees

Type

No type

Projects

Status
Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions