12 Commits
Author SHA1 Message Date
Ken SimpsonandClaude Opus 5.5 15d9971ae7 Zip several Modal Map Input lists through a Modal Input Channel (#16)
* Zip several Modal Map Input lists through a Modal Input Channel

ModalMapInput mapped only one boundary input per component and passed
every other input whole to each item, so a prompt list and a seed list
could not be paired item by item.

ModalMapInput gains an optional channel input and an optional name
label, and a new ModalInputChannel node groups markers. Before planning,
the channel wiring is folded into marker metadata and removed, so the
channel type never crosses the remote boundary. Graph analysis keeps a
channel's markers in one component, the planner accepts several mapped
boundaries when they share a channel, and both mapped runtimes zip the
lists: item i gets item i of every input, single items are shared, and
mismatched lengths fail with each marker's label and count.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Track runtime modules that the .gitignore whitelist left out

The .gitignore ignores everything and whitelists files one by one.
modal_map_channels.py (new in the previous commit) and
cloud_container_placement.py (imported by the Modal cloud entry module
since 2026-11-06) were never whitelisted, so neither was committed. A
fresh checkout failed to import the extension or to start the Modal app.

Whitelist both, plus the already-tracked staging_process.py and
vast_image_reference.py, and add a test that fails when any top-level
or remote/ module is untracked and ignored.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Move the shared name from Modal Map Input to Modal Input Channel

Markers on one channel belong to one bundle, so they share one name.
ModalInputChannel now has the optional name widget and ModalMapInput
drops it. The channel name is copied into each marker's metadata before
the channel node is removed, and marker labels read like
'Modal Map Input 12 on "portraits" (channel 7)'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Materialize mapped phase outputs for local consumers

When a fanned-out phase's remote-only output also feeds local nodes, the
local bridge materializer received the ordered list of per-item bridge
refs and rejected it. It now materializes each item and joins them like
any mapped output, and it selects item_index on per-item refs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 22:44:11 -07:00
Ken SimpsonandClaude Opus 5.5 dba3a6abd9 Add Remote Progressive Preview node and run every mapped item (#9)
* Expect resolved STRING type for ModalMapInput boundaries

69a33e3 made _remote_output_io_type resolve wildcard "*" outputs through
their linked input, so a ModalMapInput boundary fed by a STRING list now
reports STRING, matching the mapped_input type the test already expects.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Add Remote Progressive Preview node

A local PreviewImage-style node that shows one empty slot per mapped item
when remote work starts and fills each slot as soon as that item's images
stream back, instead of waiting for ComfyUI to deliver the whole result.

- Planning records direct consumers as progressive_preview_target_node_ids
  and exempts them from local bridge materializers.
- The remote shim streams boundary outputs for those targets; mapped item
  payloads carry map_item_count and dispatch emits a start event.
- The host saves streamed images to temp, records them per prompt/node, and
  sends modal_progressive_preview websocket events.
- The node reuses streamed slots on final execution and only materializes
  bridge refs that were never streamed.
- web/progressive_preview.js renders the slot grid and hands off to the
  native preview on the final executed event.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Execute every mapped item instead of reusing shared-session outputs

Mapped items share one remote session. The restored-session short-circuit,
meant for identical per-lane seed phases, looked outputs up by node id
only, so after the first item on a container every later item skipped
sampling and returned that earlier item's image under its own bridge key.
Payloads carrying map_item_index now always execute.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep finished progressive previews handed off to the native preview

Hide the panel with an inline display style so the frontend's DOM-widget
wrapper cannot override the hidden attribute, and ignore replayed events
for a prompt whose final images were already delivered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:09:02 -07:00
Ken Simpson b57d0f6cf0 Add OAuth-backed R2 storage configuration 2026-08-24 22:20:07 -07:00
Ken Simpson 7b6a9df4b7 Refactor remote execution capacity configuration 2026-08-23 20:04:03 -07:00
Ken Simpson 0d623e79c1 Add Vast profiles API client and simulator 2026-08-23 08:38:10 -07:00
Ken Simpson 9a4fd944ac Add resident multimodal Modal LLM node 2026-08-18 21:22:08 -07:00
Ken Simpson bac22e8537 Add Modal hosted endpoint chat node 2026-08-18 17:01:33 -07:00
Ken Simpson f0c04c41cf Ensure artifact-only Modal workflows execute 2026-08-13 15:31:12 -07:00
Ken Simpson 5eac100c10 feat: install missing Modal SDK at startup 2026-08-04 14:01:18 -07:00
Ken Simpson 6a2a412ba9 feat: map batched inputs across modal 2026-04-18 17:30:48 -07:00
Ken Simpson 135f3db94f chore: add timestamped modal sync logging 2026-04-17 14:53:21 -07:00
Ken Simpson ef75060ddb feat: add modal sync comfyui extension 2026-04-17 10:18:17 -07:00