Skip to content

v2.6.0 — Palette (multi-group color/Kelvin in one call)

Choose a tag to compare

@gfargo gfargo released this 16 May 13:43
· 39 commits to main since this release
5d66cad

Highlights

palette(assignments) — assign different colors or Kelvin values to different groups in a single round trip. The "set the room" primitive.

palette({
  "key-lights":  3200,           # Kelvin: tungsten
  "fill-lights": 5600,           # Kelvin: daylight
  "back-lights": "magenta"       # color preset
})

Three-point lighting in one tool call. Closes #7. MCP catalog grows from 32 → 33.

Why this exists when batch_action already does the job

Functionally equivalent to wrapping batch_action around three color_temperature / adjust_color calls — the win is ergonomics. Agents tend to think "here's my palette" as one unit, not as a sequence of independent color tweaks. And it matches how lighting designers actually talk.

Accepted value shapes per group

Shape Meaning
"warm" Color preset name
3200 Kelvin number
"5600K" Kelvin with K suffix
{"color": "warm", "intensity": "70%"} Explicit color + intensity
{"kelvin": 3200, "intensity": "50%"} Explicit Kelvin + intensity
{"k": 3200} Short-key Kelvin

Numbers in 1000–40000 are interpreted as Kelvin; everything else as a color preset name.

Partial failure friendly

Each group is dispatched independently. If one group's value is unparseable, the others still apply. The response carries per-group results so agents can react to partial success:

{
  "success": true,
  "applied_to": 3,
  "successful": 3,
  "groups": {
    "key-lights":  { "success": true, "strategy": "color_temperature", "kelvin": 3200 },
    "fill-lights": { "success": true, "strategy": "color_temperature", "kelvin": 5600 },
    "back-lights": { "success": true, "strategy": "color_preset",      "color":  "magenta" }
  }
}

Behavior note

Palette intentionally ignores the top-level groups argument on /api/action. The assignments dict's keys are the targets. Accepting groups would create ambiguity (does it filter? intersect?) so we explicitly don't.

Composability

  • batch_action([create_group(...), palette(...)]) — build groups then immediately set them
  • palette(...) → snapshot_scene(...) — save the resulting look as a named scene

Upgrade

git pull
./lightsctl.sh control-restart   # picks up the new action
./lightsctl.sh mcp-restart       # picks up the new MCP tool

No package dependency changes.

Documentation

  • docs/MCP_SERVER.md — palette added to action table
  • docs/CONTROL_SERVER_ARCHITECTURE.md — valid actions list updated + behavior note
  • mcp-server/README.md + root README.md — refreshed
  • Wiki MCP-Server.md updated
  • Marketing site: CueSheet cue 003 demonstrates three-point palette, AiConversation uses palette with mixed Kelvin + color values, new FAQ entry on three-point lighting, tool catalog renders 33

Tier 2 status

After this lands, three of four Tier 2 items are complete (#6, #7, plus the diagnostics surface from #9 which was Tier 3 but shipped early).

  • #4 — Chases / sequence support (biggest single capability unlock — the time-based programming axis)
  • #5 — First-class strobe action (small polish — agents currently have to use set_channel with magic offsets)

Remaining roadmap

  • Tier 2: #4 (chases), #5 (strobe)
  • Tier 3: #8 (scheduling), #10 (SSE event stream), #11 (multi-workspace), #12 (audio-reactive)