During a multi-screen concurrent generation, every screen group's root
frame is tagged with a distinct agent colour; the canvas now strokes a
pulsing glow + ring in that colour around each one so you can see which
agent is building what. Indicators are registered as the concurrent
scaffold lands and cleared once the turn finishes.
A process-global registry of active per-agent indicators (node borders,
root-frame glow/badge, preview pulses), mirroring the design worker /
paint-pass split. The canvas will read snapshot()/is_active() each frame;
the generation path tags nodes via add_node/add_frame as they stream in.
Each parallel design sub-agent gets a distinct colour (6-colour palette,
cycled by index) and name, so the canvas can later draw per-agent
breathing borders and badges. assign_agent_identities(count) is the
entry point; colours wrap past the palette size.
Drop the bare "panel" trigger keyword so ordinary two-column rows
whose second child merely contains "panel" are no longer rewritten to
full desktop width; require right/insight to signal a real right rail.
Fade the faked drop shadow out (faint far layer) instead of a hard
full-width grey band, and vertically center the example-card emoji
against a two-line title instead of pinning it to the first line.
Replace the flat bg-muted icon row with one rounded bg-foreground/10
chip per connected provider, overlapped 6px with a card-coloured ring
(TS top-bar.tsx: -space-x-1.5 + ring-1 ring-card).
canvas_surface light #fafafa->#e5e5e5, dark #181818->#1a1a1a to equal
the TS CANVAS_BACKGROUND_LIGHT/DARK constants, so the white frame reads
against the canvas instead of vanishing into a near-white surface.
Soften the floating chat panel shadow (shadow-2xl -> shadow-lg), add
top padding before the first message bubble, and give the input text
more room below the divider. Mirrors the native editor panel fix.
Soften the floating panel's drop shadow (two tight low-alpha layers
instead of a heavy offset pair so it no longer stacks into a dark band),
add top breathing room before the first transcript bubble, and drop the
input text below the separator line.
Splits the hit-test half (hit_test / resize_edge_at /
design_block_hover_at / rect_contains) out into a sibling
ai_chat_panel_hit module so the edited file stays under the 800-line
cap; the painting half keeps the spacing fixes.
Add a desktop-dashboard cleanup pass that widens a narrow main-content
row to the desktop width when a no-sidebar generation emits a 1200px
root with a sparse two-column row, preserving the authored intent.
Paint NodeKind::Path nodes that carry an svg_path via a dedicated
svg_path module (fill + stroke, EvenOdd for multi-subpath) instead of
the polyline fallback, and give them proper export corner bounds.
Add pending_generate + pending_regenerate flags to CodegenState
(mirror of chat.pending_send). Wire codegen: CodegenState as a
field on EditorState immediately after chat, with TDD coverage in
codegen_state_defaults_to_idle_react.
Plain-data types for the Code panel (Framework / CodegenPhase /
ChunkStatus / CodeGenProgress / ChunkProgress / AssetMeta /
CodegenState) in a new op-editor-core::codegen module. Keeps
op-editor-core wasm-clean; pipeline logic stays in op-codegen::ai
which already depends on this crate (acyclic).
The `Install Bun` step (oven-sh/setup-bun@v2) intermittently fails the Bun
download and reds the whole Rust Check job even when every Rust step (fmt /
build / test / clippy -D warnings) passed and windows/macos jobs are green.
Replace it with the official install script in a real 3-attempt retry loop
(no new third-party action), exporting the bin dir to GITHUB_PATH for the
JS-deps + planner-prompt drift-guard steps.
`set -o pipefail` is REQUIRED so `curl | bash` surfaces a curl download failure
(otherwise the pipeline returns bash's exit and the flake is never retried),
and an explicit ok-flag + `exit 1` after 3 attempts keeps a persistent real
failure from silently passing the step. (Codex review.)
Port of buildSubAgentStyleGuideInstruction (orchestrator-sub-agent-compact.ts):
look up the planner-selected guide by name (select_style_guide + the registry),
extract its palette/fonts/radius (extract_style_guide_values), and append a
tier-aware "follow these specs" block to the sub-agent system prompt so the
model uses the selected aesthetic instead of inventing a conflicting palette.
RUST ADAPTATION: TS emits $color-* refs (which it seeds into doc.variables);
Rust does not seed style-guide vars, so refs wouldn't resolve — we emit the
guide's CONCRETE HEX values instead. Same effect, correct for the Rust path.
This also CLOSES the design-system gap the earlier fix left open: when the
style-guide block is injected it REPLACES design-system, so design_system_covered
now also includes style_guide_instruction.is_some() — a named guide no longer
falls back to the generic (and conflicting) design-system skill.
Tests: a named style guide injects "VISUAL STYLE GUIDE" + drops design-system;
the no-style-guide path still drops design-system via style-defaults.