The GitHub Actions job "Lint PR" on 
texera.git/feat/pulseflow-streaming-and-llm-operators has failed.
Run started by GitHub user nathant27 (triggered by nathant27).

Head commit for run:
ce644d71c15184136c2a4f83b62fbbced2ff65f0 / nctam2 <[email protected]>
feat: add streaming HTTP/WebSocket sources and an LLM agent operator

Adds four first-class Texera operators ("PulseFlow") for building live
analytical workflows over real-time data feeds:

1. PollingHttpSource (source)
   - Polls an HTTP/REST endpoint at a fixed interval and emits each
     response as a tuple.
   - Configurable method (GET/POST/PUT/PATCH/DELETE), headers, request
     body, interval, and an optional maxIterations cap (0 = forever).
   - Output schema: response_body, status_code, polled_at.
   - Implemented via a forever-running Iterator that sleeps between
     polls; works around Texera's bounded-source model without engine
     changes.

2. WebSocketSource (source)
   - Connects to a ws:// or wss:// endpoint and emits each received
     frame as a tuple, forever.
   - Uses JDK 11+ java.net.http WebSocket; supports an initial
     subscribe message and arbitrary handshake headers.
   - Permissive URI handling: trims whitespace and percent-encodes the
     '@' character (common in Binance-style stream names) so users can
     paste provider URLs verbatim.
   - Requests Long.MaxValue messages up front to avoid per-frame
     back-pressure bookkeeping; reassembles partial text frames.
   - Output schema: message, received_at.

3. HttpRequest (transformer)
   - For each input tuple, performs a configurable HTTP call with
     ${fieldName} interpolation in URL and body templates.
   - Appends http_request_status, http_request_body, and
     http_request_error to the input schema (namespaced to avoid
     collisions with upstream columns like response_body).
   - failOnError toggle controls whether non-2xx responses crash the
     workflow or are surfaced inline.

4. LLMAgent (transformer)
   - Calls an Anthropic Messages or OpenAI Chat Completions endpoint
     per tuple with a templated system + user prompt.
   - Provider enum (LLMProvider: ANTHROPIC, OPENAI) switches request
     body shape and reply-text extraction path
     (content[0].text vs choices[0].message.content).
   - Request body built via Jackson ObjectNode so user-supplied prompt
     content is automatically JSON-escaped — no broken templates from
     embedded quotes or newlines.
   - API key sourced from the operator field, falling back to the
     ANTHROPIC_API_KEY / OPENAI_API_KEY environment variable.
   - Appends a configurable output column (default "llm_response") and
     "llm_error" to the input schema.

Shared utilities (operator/http/util/):
   - HttpClientFactory: lazy singleton java.net.http.HttpClient reused
     by all operators.
   - HttpMethod: enum with @JsonValue so the UI renders a dropdown.
   - KeyValuePair: Jackson-friendly header entry class.
   - TemplateInterpolator: ${fieldName} substitution from a Tuple.

Registration: each operator gets a single @JsonSubTypes entry in
LogicalOp.scala; the metadata/palette refreshes automatically from
that registry.

Operator icons: 128x128 PNGs added under frontend assets — clock for
PollingHttpSource, dashed stream for WebSocketSource, curly-brace
API glyph for HttpRequest, and a stylized brain for LLMAgent.

Frontend fix (result-panel cell click):
   - When clicking a cell in the result table, the modal now receives
     the table's row data as a fallback and displays it immediately,
     overwriting only if the paginated server lookup returns a
     non-empty tuple. Previously, clicking a cell when the paginated
     result service was not yet initialized produced a permanently
     blank modal because the request to fetch the full row never
     fired (?. short-circuit on undefined service).

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

Report URL: https://github.com/apache/texera/actions/runs/25967998535

With regards,
GitHub Actions via GitBox

Reply via email to