fix(scenes): restore cinema seat controls and ordered romantic lighting

This commit is contained in:
Miayui
2026-09-22 13:01:46 +08:00
parent 4d99702acd
commit 6b9ee0f349
24 changed files with 908 additions and 83 deletions
@@ -34,6 +34,11 @@ from cognitive_agent.application.mode_creation_seat_policy import (
)
from cognitive_agent.application.mode_schedule import ModeSchedule
from cognitive_agent.application.mode_schedule_service import public_schedule_status
from cognitive_agent.application.mode_scene_ingress import MAX_MODE_SCENE_ACTIONS
from cognitive_agent.application.romantic_lighting import (
romantic_light_override_refs,
romantic_scene,
)
from cognitive_agent.application.scene_composer import (
SCENE_COMPOSER_INSTRUCTIONS,
SCENE_PLANNER_VERSION,
@@ -1517,6 +1522,17 @@ class CodexAssistantService:
requests = normalized.get("requests")
if not isinstance(requests, list):
raise SceneCompositionError("scene plan requests must be an array")
semantics = scene_context.get("scene_semantics")
if isinstance(semantics, Mapping) and romantic_scene(semantics.get("mode_name")):
replaced_refs = romantic_light_override_refs(scene_context.get("peripheral_actions", []))
requests[:] = [request for request in requests if not (
isinstance(request, Mapping) and request.get("capability") == "infrared.emit"
and any(isinstance(parameter, Mapping)
and parameter.get("name") == "capability_ref"
and isinstance(parameter.get("value"), str)
and parameter.get("value") in replaced_refs
for parameter in request.get("parameters", []))
)]
existing_refs = {
str(parameter.get("value") or "").strip()
for request in requests
@@ -4317,13 +4333,17 @@ class CodexAssistantService:
secret=secret,
)
actions: list[dict[str, object]] = []
action_limit = (
MAX_MODE_SCENE_ACTIONS
if isinstance(result.get("mode_profile_draft"), Mapping)
or isinstance(result.get("mode_profile"), Mapping)
else 96 if result.get("schedule") else MAX_PLAN_REQUESTS
)
intent_ir = result.get("intent_ir")
if isinstance(intent_ir, dict):
spec = intent_ir.get("spec")
if isinstance(spec, dict) and isinstance(spec.get("actions"), list):
for item in spec["actions"][
:96 if result.get("schedule") else MAX_PLAN_REQUESTS
]:
for item in spec["actions"][:action_limit]:
if not isinstance(item, dict):
continue
safe_action = {
@@ -4351,7 +4371,7 @@ class CodexAssistantService:
infrared_actions: list[dict[str, object]] = []
raw_infrared = result.get("infrared_actions")
if isinstance(raw_infrared, list):
for item in raw_infrared[:MAX_PLAN_REQUESTS]:
for item in raw_infrared[:action_limit]:
if not isinstance(item, dict):
continue
infrared_actions.append(