Lazily resolve cross-step content-hash markers (@same) in the frontend
## Problem / Motivation The Workflow Modeler now lazily expands replay-data dedup markers in the frontend (#3589096): `@prev` (whole step equals previous) and `@ref` (a content entity repeated under another token name within the same step). ECA is adding a third, content-equality marker, `@same` (project/eca#3590333), which deduplicates **fully-normalized sub-trees by content hash across steps and at any nesting level** — collapsing entities that are carried unchanged through multiple steps and identical nested referenced entities. This is a major payload reduction for large models (see project/eca#3590324). Unlike `@ref` (which references a sibling token key in the same step), `@same` references its first occurrence by **(stepIndex, path)**, because the identical sub-tree may live in an earlier step and/or at a nested path. ## Proposed resolution Extend the frontend lazy expander to resolve `@same` at display time, on a non-mutating copy, alongside the existing `@ref`/`@prev` handling: - When rendering a step, a node carrying `@same: { step, path }` resolves its `data` from the already-expanded sub-tree at that (step, path). - Resolution order matters: `@prev` (reuse previous expanded step) and `@ref` (sibling within step) are resolved first as today; `@same` resolves against the expanded data of the referenced earlier step/path. Ensure referenced steps are expanded before (or memoized for) the step being displayed. - Operate on a **copy** — never mutate the stored `replayData`, so the JSON export keeps the compact markers (same rule that #3589096 established). - Confirm the JSON export still contains unexpanded `@same`/`@ref`/`@prev` markers after viewing any step. ## Remaining tasks - [ ] Resolve `@same` (by step+path) in the frontend expander, reusing the structures from #3589096. - [ ] Guarantee referenced (earlier) steps/paths are expanded/memoized when resolving `@same`. - [ ] Lazy, render-time only, on a non-mutating copy. - [ ] Confirm export keeps compact markers after viewing steps. - [ ] Rebuild the bundle. - [ ] Unit tests: cross-step `@same` resolution, nested `@same`, and export-compactness after view. - [ ] Coordinate the dependency/version bump with the ECA companion issue. ## Related - Parent: project/eca#3590324 - Companion (ECA emits `@same`): project/eca#3590333 - Builds on: #3589096 (frontend `@ref`/`@prev` lazy expander), modeler_api#3588498 (marker-bearing contract)
issue