feat(#90): IMP-56 u1-u19 catch-up before final close (post-u20 push fix)
Some checks failed
Multi-MDX Regression (IMP-91) / multi-mdx-regression (push) Failing after 20s
Some checks failed
Multi-MDX Regression (IMP-91) / multi-mdx-regression (push) Failing after 20s
u1: text_overrides axis in user_overrides_io u2: structure_overrides axis in user_overrides_io u3: vite allowlist for new endpoints u4: text_override_resolver u5: Step 12 text_overrides apply in phase_z2_pipeline u6: structure_override_resolver u7: text_path_stamper u8: SlideCanvas text-edit capture u9: SlideCanvas structure-edit overlay u10: userOverridesApi service extension u11: designAgent types extension u12: slidePlanUtils restore u13: user_overrides endpoint tests u14: user_overrides restore tests u15: pipeline fallback tests u16: edit-mode state + gating tests u17: slide_base print mode CSS u18: /api/connect endpoint (vite) u19: /api/export endpoint (vite) Recovery scope: 29 files (12 modified + 17 new). u20 already pushed in 9439575; this commit lands u1-u19 that were authored but not committed before #90 was externally closed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -5,10 +5,18 @@ auto-restores user choices without re-clicking. Source of truth = MDX-keyed
|
||||
file (stem of the MDX path), NOT ``data/runs/<run_id>/`` which mints a fresh
|
||||
run_id per ``/api/run`` invocation.
|
||||
|
||||
Schema (7 axes; stable order; IMP-51 #79 u1 added ``image_overrides``;
|
||||
Schema (9 axes; stable order; IMP-51 #79 u1 added ``image_overrides``;
|
||||
IMP-45 #74 u1 added ``slide_css``; IMP-55 #93 u1 added
|
||||
``manual_section_assignment`` as a bool intent marker so the backend can
|
||||
distinguish a user drag-drop from frontend auto-carry zone_sections):
|
||||
distinguish a user drag-drop from frontend auto-carry zone_sections;
|
||||
IMP-56 #90 u1 added ``text_overrides`` as a Step-22 text-edit persist axis
|
||||
keyed by ``{zone_id: {text_path: value}}`` where ``text_path`` is the
|
||||
``{slot_key}.{line_index}`` stamp emitted by u8; IMP-56 #90 u2 added
|
||||
``structure_overrides`` as a Step-22 structure-edit persist axis keyed by
|
||||
``{zone_id: {"slot_order": [<slot_key>, ...], "hidden_slots": [<slot_key>, ...]}}``
|
||||
— scope is intentionally LOCKED to slot reorder + hide; frame swap stays
|
||||
on the existing ``frames`` axis to prevent the Phase Z regression of
|
||||
AI-driven HTML structure mutation):
|
||||
|
||||
{
|
||||
"layout": <string|null>,
|
||||
@@ -17,7 +25,9 @@ distinguish a user drag-drop from frontend auto-carry zone_sections):
|
||||
"frames": {<unit_id>: <template_id>},
|
||||
"image_overrides": {<image_id>: {"x": float, "y": float, "w": float, "h": float}},
|
||||
"slide_css": <string|null>,
|
||||
"manual_section_assignment": <bool>
|
||||
"manual_section_assignment": <bool>,
|
||||
"text_overrides": {<zone_id>: {<text_path>: <string>}},
|
||||
"structure_overrides": {<zone_id>: {"slot_order": [<slot_key>, ...], "hidden_slots": [<slot_key>, ...]}}
|
||||
}
|
||||
|
||||
``image_id`` is the stable identifier emitted by the user-content image
|
||||
@@ -58,13 +68,21 @@ from typing import Any, Optional
|
||||
_PKG_ROOT = Path(__file__).resolve().parent.parent
|
||||
DEFAULT_OVERRIDES_ROOT = _PKG_ROOT / "data" / "user_overrides"
|
||||
|
||||
# The seven in-scope axes (IMP-51 #79 u1 added ``image_overrides``; IMP-45
|
||||
# The nine in-scope axes (IMP-51 #79 u1 added ``image_overrides``; IMP-45
|
||||
# #74 u1 added ``slide_css``; IMP-55 #93 u1 added
|
||||
# ``manual_section_assignment`` — bool intent marker that gates whether
|
||||
# persisted ``zone_sections`` are consumed by the backend pipeline). Any
|
||||
# other top-level key in the file is preserved but ignored by callers —
|
||||
# keeps the file forward-compatible with future axes (e.g., zone_sizes)
|
||||
# without a schema bump here.
|
||||
# persisted ``zone_sections`` are consumed by the backend pipeline; IMP-56
|
||||
# #90 u1 added ``text_overrides`` — Step-22 text-edit persist axis keyed by
|
||||
# ``{zone_id: {text_path: value}}`` where ``text_path`` is the
|
||||
# ``{slot_key}.{line_index}`` stamp emitted by u8 / consumed by u4+u5;
|
||||
# IMP-56 #90 u2 added ``structure_overrides`` — Step-22 structure-edit
|
||||
# persist axis keyed by ``{zone_id: {"slot_order": [...], "hidden_slots":
|
||||
# [...]}}``, scope LOCKED to slot reorder + hide so the resolver (u6) /
|
||||
# Step-12 apply (u7) cannot mutate frame identity — frame swap stays on
|
||||
# the existing ``frames`` axis to keep Phase Z's no-AI-HTML-structure
|
||||
# invariant intact). Any other top-level key in the file is preserved but
|
||||
# ignored by callers — keeps the file forward-compatible with future axes
|
||||
# (e.g., zone_sizes) without a schema bump here.
|
||||
KNOWN_AXES: tuple[str, ...] = (
|
||||
"layout",
|
||||
"zone_geometries",
|
||||
@@ -73,6 +91,8 @@ KNOWN_AXES: tuple[str, ...] = (
|
||||
"image_overrides",
|
||||
"slide_css",
|
||||
"manual_section_assignment",
|
||||
"text_overrides",
|
||||
"structure_overrides",
|
||||
)
|
||||
|
||||
# Key validation — MDX stem must be safe for filesystem use. Allow
|
||||
|
||||
Reference in New Issue
Block a user