Skip to content

Import React Studio with original history and provenance checks - #8924

Merged
sfmskywalker merged 19 commits into
mainfrom
codex/8859-react-studio-import
Oct 21, 2026
Merged

sfmskywalker merged 19 commits into
mainfrom
codex/8859-react-studio-import

Conversation

@sfmskywalker

@sfmskywalker sfmskywalker commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Part of #8859; implements the source-preservation portion of #8840 and updates the #8841 decision. Stacked on #8923.

Imports the complete React Studio snapshot into studio/react/ using a two-parent merge. The original 14 commit IDs remain ancestors, and the imported subtree exactly matches the donor root tree. Adaptation will follow separately so reviewers can distinguish source provenance from functional changes.

Adds the source receipt, a retained provenance workflow, and eight real-Git regression cases. Records the task owner's removal of the employer-clearance gate and actual donor license status (no license file; no inferred MIT grant). Donor archival/redirect waits for independently reviewed merge and a final remote-tip check.

Validation: provenance verifier passed; eight regression cases passed; generated ADR index and git diff --check passed. The unchanged donor baseline previously passed 74 Vitest tests, lint, type checking, production build, and browser sign-in/dashboard against the reference server. This PR does not claim the Vite port, production SDK, packaging or epic completion.

Review: Greptile required; CodeRabbit is the sole advisory reviewer. Independent Elsa 3 Code Review APPROVE + HIGH @ <full head SHA> and green CI remain required for merge.

cristinamudura and others added 16 commits October 13, 2026 08:59
A component-based web studio for Elsa Workflows 3.x, built with Next.js,
React, TypeScript, Tailwind CSS, shadcn/ui and React Flow.

Core modules are always on: dashboard, workflow definitions (list and
visual editor) and workflow instances. Every other module is enabled per
deployment through configuration and hidden when the backend lacks the
matching feature: environments, labels, secrets, security, alterations,
user tasks, settings, appearance, console logs and structured logs.

The designer supports flowchart, sequence and state machine containers,
a quick-add palette, live validation, data-flow overlays, a call-context
view of the workflow hierarchy, and keyboard-driven editing.
Replaces the single README with a landing page carrying screenshots of
the designer, dashboard, call context, instance viewer, human tasks and
secrets, plus six guides under docs/:

- getting-started: prerequisites, install, connecting to a server
- configuration: adding servers, auth providers, feature flags, theming,
  environment variables and their precedence
- modules: what each module does, the server feature it needs, and how
  to build and register a new one
- designer: containers, quick add, data flow, call context, shortcuts
- deployment: Docker, standalone output, reverse proxies
- troubleshooting: CORS, hidden modules, sign-in failures, definitions
  from older Elsa versions
The secret forms hardcoded a single "Configuration key" input, shown whenever a
store was read-only or could not be written to. That rule only ever described
the configuration store, so a vault-backed store -- which needs its own
coordinates, and in managed mode a value as well -- had no usable form.

Stores now declare their fields, so the create dialog, the rotate dialog and
the inline rotation card render whatever a store asks for and submit it as
secret metadata. Whether a value editor appears comes from the store's
requiresValue rather than being inferred from its capabilities.

Servers predating the descriptor change keep working: storeFields synthesizes
the configuration store's field, storeRequiresValue falls back to the old
capability rule, and the configuration key is still sent as its own request
property alongside the metadata.

The detail page's Properties card now also shows where a secret lives, from the
store-declared metadata the detail endpoint returns.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The create dialog told every operator their value would be "stored encrypted",
and the value field repeated it. That is only true of the encrypted store: a
vault-backed value goes to the vault and Elsa keeps nothing, and a reference
store captures no value at all.

The copy now comes from the store: the dialog says whether a value is being
submitted or a reference recorded, and the value field names where the value
is written.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A JSON secret whose value does not parse is rejected by the server, which means
a failed round trip and a toast. The value field now parses it as you type when
the type's editor hint says JSON, shows the parser's own message under the
field, and keeps the submit button disabled until it parses.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The activity chart had columns filling their whole slot, so 24 hourly buckets
read as one blocky stepped band rather than as bars; the axis labelled a count
scale "8.5"; gridlines were dashed; and the started series was drawn as
disconnected per-column dashes that looked like stray marks.

Columns are now capped at 24px and centred in their slot, stacked segments are
separated by a consistent 2px of surface with a 4px cap on top and a square
foot on the baseline, gridlines are solid hairlines on whole-number ticks, and
the axis tops out on a tick so the tallest column ends at a gridline. Started
became a soft area wash behind the columns: as a stroked outline it traced a
box around the plot and read as a border. Hovering a quiet hour now says "No
activity" instead of listing five zeros.

Cards no longer grow with their row counts, which is what made the grid look
ragged as workflows accumulated. The primary and activity zones have fixed row
heights, lists scroll inside their cards, and the last widget in a stack
absorbs the leftover height so both columns end on the same line. Below lg the
rows stack and size to content as before.

Instances per workflow used --primary for "finished / other" beside
--status-info for "running": two sky blues measuring 9.8 apart, below the
readable floor even with full colour vision. Those are states, not identities,
so the bars now use the success / info / danger status tones, which pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Three things made the chart look broken as soon as you pointed at it.

Hovering any bucket faded every other column to 60%, so the whole chart washed
out exactly while it was being read. The hovered slot is marked already; the
dimming is gone.

The hovered slot was marked with a full-height filled band, which in an empty
hour rendered as a tall grey column indistinguishable from a bar -- it read as
a spike in an hour with nothing in it. It is now a one-pixel crosshair.

The tooltip was pinned to the left edge, where it covered the very columns it
describes and the y-axis labels with them. It now parks on the side opposite
the hovered slot, so it never covers what is being inspected and does not
chase the cursor.

Started also moves from neutral grey to the slate chart tone: at 10% of the
foreground the envelope read as a loading skeleton rather than as data,
especially in an hour where work started and nothing had finished yet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Started and the coloured outcomes count different populations. A workflow that
starts in one hour can finish in a later one, so an hour can record more
outcomes than starts -- this server currently has a bucket with 11 started and
12 outcomes. Drawing the stack inside a "started" envelope claims a
part-of-whole relationship that does not hold, and when it breaks the stack
visibly overflows the container that is supposed to contain it.

The chart is now the outcomes alone. Started keeps its per-bucket figure in the
tooltip and its total in the header, where it reads as a separate number rather
than as a container, and it carries no swatch because nothing in the plot
corresponds to it. The axis scales to what is actually drawn and aims for about
three intervals, so it no longer tops out far above the tallest column.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The journal API returns one record per lifecycle event, and the list rendered
one row per record. The order-review sample has three activities and filled the
panel with eight four-line rows: Start/Started, Start/Completed,
ReviewOrder/Started, ReviewOrder/Suspended, and so on. Nesting was absent
entirely -- "Hide system" dropped the workflow and flowchart rather than using
them, so the structure the workflow actually had never appeared.

A row is now one activity execution: status, name, and how long it took. The
events that produced it are revealed on click, together with the type, the
offset from the workflow start, per-event timestamps and the exception a
faulted record carries in its payload. Three activities render as three rows.

Hierarchy is rebuilt from nodeId, the colon-delimited path the server already
sends (Workflow1:flowchart1:reviewOrder), preferring parentActivityInstanceId
where a version supplies it. An activity that runs more than once gets one span
per iteration, attached to the iteration of its parent that was open at the
time, so a loop body does not collapse into a single row.

Interaction follows what trace viewers have settled on: a chevron folds a
subtree and shows a descendant count when closed, the row body selects the
activity and opens its detail, arrow keys walk the tree, subtrees below depth 2
start folded, and expand/collapse-all appear only when there is nesting to act
on. "Hide system" becomes "Hide containers" and now promotes the children
instead of discarding the subtree.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A span's duration was wall-clock time, so a user task parked overnight for a
human read as an overnight activity. In the order-review sample ReviewOrder
showed 1h 49m; it ran for about a millisecond and waited for the rest. Ranking
activities by that number finds whatever suspended, never whatever is slow.

Spans now carry the time spent suspended, summed over every Suspended → Resumed
pair that closed, and the duration column reports execution time with that taken
out. A row shows the wait beside it in amber when there is one, so the elapsed
time is still visible and still attributed. A suspension that has not resumed is
not counted: the span has no end either, so there is nothing to subtract from.

Containers inherit what their children waited on -- a flowchart whose only
activity waited an hour did not work for an hour. Branches that suspend in
parallel would double-count, so the inherited total is clamped to the span's own
duration.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The span tree keys on activityInstanceId, falling back to nodeId, and rebuilds
nesting by splitting nodeId on ':'. Both are declared required on the record
type, but that is an assumption about the server rather than a guarantee, and
neither path tolerated their absence.

A record with an activityInstanceId but no nodeId threw: parentNodeId called
lastIndexOf on undefined, which takes the whole instance viewer down, not just
the journal. A record with neither keyed every event as `undefined`, folding the
entire journal into a single row.

Identity now falls through activityInstanceId → nodeId → activityId → record id,
so the worst case is one span per event -- the flat list this replaced -- and
nesting is skipped for spans with no path instead of crashing on one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two problems with authoring branches.

Switch cases could not hold anything. elsa-core's SwitchCase has a Label, a
Condition and an Activity, but the studio only ever edited the first two: no
port descriptor mentions cases, so listSlots never produced a slot for them.
A Switch with three cases could run only its Default, and the case branches
were unreachable from the designer. Cases now produce one slot each, named
after the case label, ordered before Default -- so they accept any activity or
container through the same path Then and Else already used.

Filling a branch also did not read as the decision it is. Creating a workflow
offers three flow types as cards with plain-language descriptions; filling an
If's Then offered the same three buried in a searchable activity palette under
the server's own type documentation. A branch slot now leads with that chooser
and keeps the full palette one click behind it, for the single-activity case.
Both places read from one list of flow types, so they cannot drift.

Verified against a Switch with Gold and Silver cases: the card shows a slot per
case, the chooser fills one with a Sequence and navigates into it, and the
nested flow round-trips to the server inside cases[0].activity.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Let every branch start a nested flow, including Switch cases
@coderabbitai

coderabbitai Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 353 files, which is 203 over the limit of 150.

To get a review, reduce the PR to 150 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to Team to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Essentials
  • Run ID: 233d2903-01c3-418d-aab5-3bd6c366376a
📥 Commits

Reviewing files that changed from the base of the PR and between f6aa94a and 1a2936f.

⛔ Files ignored due to path filters: 17
  • studio/react/docs/images/call-context.png is excluded by !**/*.png
  • studio/react/docs/images/dashboard.png is excluded by !**/*.png
  • studio/react/docs/images/designer-dark.png is excluded by !**/*.png
  • studio/react/docs/images/designer.png is excluded by !**/*.png
  • studio/react/docs/images/instance-viewer.png is excluded by !**/*.png
  • studio/react/docs/images/login.png is excluded by !**/*.png
  • studio/react/docs/images/secrets.png is excluded by !**/*.png
  • studio/react/docs/images/user-task-form.png is excluded by !**/*.png
  • studio/react/docs/images/user-task.png is excluded by !**/*.png
  • studio/react/docs/images/workflow-definitions.png is excluded by !**/*.png
  • studio/react/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • studio/react/public/brand/elsa-icon.svg is excluded by !**/*.svg
  • studio/react/public/brand/elsa-logo-dark.svg is excluded by !**/*.svg
  • studio/react/public/brand/elsa-logo.svg is excluded by !**/*.svg
  • studio/react/src/app/apple-icon.png is excluded by !**/*.png
  • studio/react/src/app/favicon.ico is excluded by !**/*.ico
  • studio/react/src/app/icon.png is excluded by !**/*.png
📒 Files selected for processing: 353
  • .github/workflows/studio-react-source-validation.yml
  • AGENTS.md
  • docs/adr/2026-10-20-modular-react-studio-preview.md
  • docs/integration-program/studio-react-source-import.json
  • docs/integration-program/studio-react-source-import.md
  • scripts/integration-program/test_verify_studio_react_source_import.py
  • scripts/integration-program/verify_studio_react_source_import.py
  • studio/docs/README.md
  • studio/docs/specs/react-studio-preview/plan.md
  • studio/react/.dockerignore
  • studio/react/.gitignore
  • studio/react/AGENTS.md
  • studio/react/Dockerfile
  • studio/react/README.md
  • studio/react/components.json
  • studio/react/docs/ARCHITECTURE.md
  • studio/react/docs/configuration.md
  • studio/react/docs/deployment.md
  • studio/react/docs/designer.md
  • studio/react/docs/getting-started.md
  • studio/react/docs/modules.md
  • studio/react/docs/troubleshooting.md
  • studio/react/eslint.config.mjs
  • studio/react/next.config.ts
  • studio/react/package.json
  • studio/react/pnpm-workspace.yaml
  • studio/react/src/app/[[...slug]]/page.tsx
  • studio/react/src/app/auth/callback/page.tsx
  • studio/react/src/app/globals.css
  • studio/react/src/app/layout.tsx
  • studio/react/src/app/login/page.tsx
  • studio/react/src/app/providers.tsx
  • studio/react/src/components/common/code-editor.tsx
  • studio/react/src/components/common/confirm-dialog.tsx
  • studio/react/src/components/common/copy-button.tsx
  • studio/react/src/components/common/data-table.tsx
  • studio/react/src/components/common/empty-state.tsx
  • studio/react/src/components/common/error-alert.tsx
  • studio/react/src/components/common/field.tsx
  • studio/react/src/components/common/filter-chips.tsx
  • studio/react/src/components/common/json-viewer.tsx
  • studio/react/src/components/common/key-value-table.tsx
  • studio/react/src/components/common/page-header.tsx
  • studio/react/src/components/common/search-input.tsx
  • studio/react/src/components/common/simple-select.tsx
  • studio/react/src/components/common/status-badge.tsx
  • studio/react/src/components/common/timestamp.tsx
  • studio/react/src/components/shell/app-shell.tsx
  • studio/react/src/components/shell/auth-callback.tsx
  • studio/react/src/components/shell/brand-mark.tsx
  • studio/react/src/components/shell/full-page-spinner.tsx
  • studio/react/src/components/shell/login-illustration.tsx
  • studio/react/src/components/shell/login-page.tsx
  • studio/react/src/components/shell/shell-chrome.ts
  • studio/react/src/components/shell/status-pages.tsx
  • studio/react/src/components/shell/studio-router.tsx
  • studio/react/src/components/shell/studio-sidebar.tsx
  • studio/react/src/components/shell/theme-menu.tsx
  • studio/react/src/components/shell/user-menu.tsx
  • studio/react/src/components/ui/alert-dialog.tsx
  • studio/react/src/components/ui/alert.tsx
  • studio/react/src/components/ui/avatar.tsx
  • studio/react/src/components/ui/badge.tsx
  • studio/react/src/components/ui/breadcrumb.tsx
  • studio/react/src/components/ui/button.tsx
  • studio/react/src/components/ui/card.tsx
  • studio/react/src/components/ui/checkbox.tsx
  • studio/react/src/components/ui/collapsible.tsx
  • studio/react/src/components/ui/command.tsx
  • studio/react/src/components/ui/dialog.tsx
  • studio/react/src/components/ui/dropdown-menu.tsx
  • studio/react/src/components/ui/input-group.tsx
  • studio/react/src/components/ui/input.tsx
  • studio/react/src/components/ui/label.tsx
  • studio/react/src/components/ui/pagination.tsx
  • studio/react/src/components/ui/popover.tsx
  • studio/react/src/components/ui/radio-group.tsx
  • studio/react/src/components/ui/resizable.tsx
  • studio/react/src/components/ui/scroll-area.tsx
  • studio/react/src/components/ui/select.tsx
  • studio/react/src/components/ui/separator.tsx
  • studio/react/src/components/ui/sheet.tsx
  • studio/react/src/components/ui/sidebar.tsx
  • studio/react/src/components/ui/skeleton.tsx
  • studio/react/src/components/ui/sonner.tsx
  • studio/react/src/components/ui/switch.tsx
  • studio/react/src/components/ui/table.tsx
  • studio/react/src/components/ui/tabs.tsx
  • studio/react/src/components/ui/textarea.tsx
  • studio/react/src/components/ui/tooltip.tsx
  • studio/react/src/config/load.ts
  • studio/react/src/config/provider.tsx
  • studio/react/src/config/schema.ts
  • studio/react/src/hooks/use-mobile.ts
  • studio/react/src/lib/api/client.ts
  • studio/react/src/lib/api/endpoints/descriptors.ts
  • studio/react/src/lib/api/endpoints/identity.ts
  • studio/react/src/lib/api/endpoints/workflow-definitions.ts
  • studio/react/src/lib/api/endpoints/workflow-instances.ts
  • studio/react/src/lib/api/hooks/descriptors.ts
  • studio/react/src/lib/api/http.ts
  • studio/react/src/lib/api/provider.tsx
  • studio/react/src/lib/api/types/activities.ts
  • studio/react/src/lib/api/types/common.ts
  • studio/react/src/lib/api/types/descriptors.ts
  • studio/react/src/lib/api/types/workflow-definitions.ts
  • studio/react/src/lib/api/types/workflow-instances.ts
  • studio/react/src/lib/auth/create-strategy.ts
  • studio/react/src/lib/auth/provider.tsx
  • studio/react/src/lib/auth/storage.ts
  • studio/react/src/lib/auth/strategies/api-key.ts
  • studio/react/src/lib/auth/strategies/elsa-external.ts
  • studio/react/src/lib/auth/strategies/elsa-identity.ts
  • studio/react/src/lib/auth/strategies/none.ts
  • studio/react/src/lib/auth/strategies/oidc.ts
  • studio/react/src/lib/auth/types.ts
  • studio/react/src/lib/environments/active-server.ts
  • studio/react/src/lib/features/remote-features.ts
  • studio/react/src/lib/modules/registry.tsx
  • studio/react/src/lib/modules/router.ts
  • studio/react/src/lib/modules/settings.ts
  • studio/react/src/lib/modules/types.ts
  • studio/react/src/lib/permissions/index.ts
  • studio/react/src/lib/theme/elsa-theme-provider.tsx
  • studio/react/src/lib/theme/elsa-theme.ts
  • studio/react/src/lib/utils.ts
  • studio/react/src/lib/utils/download.ts
  • studio/react/src/lib/utils/url-state.ts
  • studio/react/src/modules/activity-editors/__tests__/expression.test.ts
  • studio/react/src/modules/activity-editors/activity-properties-panel.tsx
  • studio/react/src/modules/activity-editors/editors/binding-picker.tsx
  • studio/react/src/modules/activity-editors/editors/checkbox-editor.tsx
  • studio/react/src/modules/activity-editors/editors/checklist-editor.tsx
  • studio/react/src/modules/activity-editors/editors/code-editor-hint.tsx
  • studio/react/src/modules/activity-editors/editors/dictionary-editor.tsx
  • studio/react/src/modules/activity-editors/editors/dropdown-editor.tsx
  • studio/react/src/modules/activity-editors/editors/json-editor-hint.tsx
  • studio/react/src/modules/activity-editors/editors/multiline-editor.tsx
  • studio/react/src/modules/activity-editors/editors/multitext-editor.tsx
  • studio/react/src/modules/activity-editors/editors/options.ts
  • studio/react/src/modules/activity-editors/editors/outcome-picker-editor.tsx
  • studio/react/src/modules/activity-editors/editors/output-picker-editor.tsx
  • studio/react/src/modules/activity-editors/editors/radiolist-editor.tsx
  • studio/react/src/modules/activity-editors/editors/singleline-editor.tsx
  • studio/react/src/modules/activity-editors/editors/switch-cases-editor.tsx
  • studio/react/src/modules/activity-editors/editors/type-picker-editor.tsx
  • studio/react/src/modules/activity-editors/editors/variable-picker-editor.tsx
  • studio/react/src/modules/activity-editors/editors/workflow-definition-picker-editor.tsx
  • studio/react/src/modules/activity-editors/expression-editor.tsx
  • studio/react/src/modules/activity-editors/expression.ts
  • studio/react/src/modules/activity-editors/index.ts
  • studio/react/src/modules/activity-editors/registry.tsx
  • studio/react/src/modules/activity-editors/types.ts
  • studio/react/src/modules/alterations/api.ts
  • studio/react/src/modules/alterations/components/alter-instance-dialog.tsx
  • studio/react/src/modules/alterations/components/alteration-composer.tsx
  • studio/react/src/modules/alterations/components/alteration-dialog-host.tsx
  • studio/react/src/modules/alterations/components/alteration-results.tsx
  • studio/react/src/modules/alterations/components/plan-status-badge.tsx
  • studio/react/src/modules/alterations/components/retry-faulted-dialog.tsx
  • studio/react/src/modules/alterations/dialog-store.ts
  • studio/react/src/modules/alterations/hooks.ts
  • studio/react/src/modules/alterations/index.tsx
  • studio/react/src/modules/alterations/pages/plan-page.tsx
  • studio/react/src/modules/alterations/pages/plans-page.tsx
  • studio/react/src/modules/alterations/recent-plans.ts
  • studio/react/src/modules/alterations/routes.ts
  • studio/react/src/modules/appearance/index.tsx
  • studio/react/src/modules/appearance/pages/appearance-page.tsx
  • studio/react/src/modules/appearance/routes.ts
  • studio/react/src/modules/dashboard/api.ts
  • studio/react/src/modules/dashboard/components/bar-list.tsx
  • studio/react/src/modules/dashboard/components/dashboard-zones.tsx
  • studio/react/src/modules/dashboard/components/donut-chart.tsx
  • studio/react/src/modules/dashboard/components/empty-dashboard.tsx
  • studio/react/src/modules/dashboard/components/range-toggle.tsx
  • studio/react/src/modules/dashboard/components/runtime-status-chip.tsx
  • studio/react/src/modules/dashboard/components/stat-tile.tsx
  • studio/react/src/modules/dashboard/components/trend-chart.tsx
  • studio/react/src/modules/dashboard/components/widget-card.tsx
  • studio/react/src/modules/dashboard/format.ts
  • studio/react/src/modules/dashboard/hooks.ts
  • studio/react/src/modules/dashboard/index.tsx
  • studio/react/src/modules/dashboard/links.ts
  • studio/react/src/modules/dashboard/pages/dashboard-page.tsx
  • studio/react/src/modules/dashboard/widgets/activity-widget.tsx
  • studio/react/src/modules/dashboard/widgets/findings-widget.tsx
  • studio/react/src/modules/dashboard/widgets/hotspots-widget.tsx
  • studio/react/src/modules/dashboard/widgets/index.ts
  • studio/react/src/modules/dashboard/widgets/metrics-widget.tsx
  • studio/react/src/modules/dashboard/widgets/per-workflow-widget.tsx
  • studio/react/src/modules/dashboard/widgets/status-breakdown-widget.tsx
  • studio/react/src/modules/dashboard/widgets/trend-widget.tsx
  • studio/react/src/modules/designer/__tests__/switch-slots.test.ts
  • studio/react/src/modules/designer/components/activity-card.tsx
  • studio/react/src/modules/designer/components/activity-icon.tsx
  • studio/react/src/modules/designer/components/activity-node.tsx
  • studio/react/src/modules/designer/components/activity-toolbox.tsx
  • studio/react/src/modules/designer/components/connection-edge.tsx
  • studio/react/src/modules/designer/components/context-box-node.tsx
  • studio/react/src/modules/designer/components/context-call-edge.tsx
  • studio/react/src/modules/designer/components/context-workflow-node.tsx
  • studio/react/src/modules/designer/components/data-edge.tsx
  • studio/react/src/modules/designer/components/decorations.ts
  • studio/react/src/modules/designer/components/designer-breadcrumb.tsx
  • studio/react/src/modules/designer/components/designer-canvas.tsx
  • studio/react/src/modules/designer/components/designer-surface.tsx
  • studio/react/src/modules/designer/components/node-context-toolbar.tsx
  • studio/react/src/modules/designer/components/quick-add-menu.tsx
  • studio/react/src/modules/designer/components/sequence-designer.tsx
  • studio/react/src/modules/designer/components/slot-chip.tsx
  • studio/react/src/modules/designer/components/state-machine-canvas.tsx
  • studio/react/src/modules/designer/components/state-node.tsx
  • studio/react/src/modules/designer/components/state-panel.tsx
  • studio/react/src/modules/designer/components/transition-edge.tsx
  • studio/react/src/modules/designer/components/transition-panel.tsx
  • studio/react/src/modules/designer/context.tsx
  • studio/react/src/modules/designer/hooks.ts
  • studio/react/src/modules/designer/index.ts
  • studio/react/src/modules/designer/model/containers.ts
  • studio/react/src/modules/designer/model/data-flow.ts
  • studio/react/src/modules/designer/model/display.ts
  • studio/react/src/modules/designer/model/flow-types.ts
  • studio/react/src/modules/designer/model/flowchart-ops.ts
  • studio/react/src/modules/designer/model/icons.ts
  • studio/react/src/modules/designer/model/ids.ts
  • studio/react/src/modules/designer/model/layout.ts
  • studio/react/src/modules/designer/model/ports.ts
  • studio/react/src/modules/designer/model/recent.ts
  • studio/react/src/modules/designer/model/registry.ts
  • studio/react/src/modules/designer/model/snapping.ts
  • studio/react/src/modules/designer/model/validation.ts
  • studio/react/src/modules/designer/store.ts
  • studio/react/src/modules/diagnostics-console-logs/api.ts
  • studio/react/src/modules/diagnostics-console-logs/components/console-log-view.tsx
  • studio/react/src/modules/diagnostics-console-logs/components/storage-widget.tsx
  • studio/react/src/modules/diagnostics-console-logs/hooks.ts
  • studio/react/src/modules/diagnostics-console-logs/index.tsx
  • studio/react/src/modules/diagnostics-console-logs/pages/console-page.tsx
  • studio/react/src/modules/diagnostics-structured-logs/api.ts
  • studio/react/src/modules/diagnostics-structured-logs/components/level-badge.tsx
  • studio/react/src/modules/diagnostics-structured-logs/components/log-table.tsx
  • studio/react/src/modules/diagnostics-structured-logs/components/storage-widget.tsx
  • studio/react/src/modules/diagnostics-structured-logs/hooks.ts
  • studio/react/src/modules/diagnostics-structured-logs/index.tsx
  • studio/react/src/modules/diagnostics-structured-logs/pages/structured-logs-page.tsx
  • studio/react/src/modules/environments/api.ts
  • studio/react/src/modules/environments/components/environment-picker.tsx
  • studio/react/src/modules/environments/hooks.ts
  • studio/react/src/modules/environments/index.tsx
  • studio/react/src/modules/index.ts
  • studio/react/src/modules/labels/api.ts
  • studio/react/src/modules/labels/components/label-badge.tsx
  • studio/react/src/modules/labels/components/label-dialog.tsx
  • studio/react/src/modules/labels/components/workflow-labels-tab.tsx
  • studio/react/src/modules/labels/hooks.ts
  • studio/react/src/modules/labels/index.tsx
  • studio/react/src/modules/labels/pages/labels-page.tsx
  • studio/react/src/modules/secrets/__tests__/store-fields.test.ts
  • studio/react/src/modules/secrets/api.ts
  • studio/react/src/modules/secrets/components/create-secret-dialog.tsx
  • studio/react/src/modules/secrets/components/edit-secret-dialog.tsx
  • studio/react/src/modules/secrets/components/rotate-secret-dialog.tsx
  • studio/react/src/modules/secrets/components/secret-picker-editor.tsx
  • studio/react/src/modules/secrets/components/secret-picker.tsx
  • studio/react/src/modules/secrets/components/secret-status-badge.tsx
  • studio/react/src/modules/secrets/components/secret-value-field.tsx
  • studio/react/src/modules/secrets/components/store-fields.tsx
  • studio/react/src/modules/secrets/hooks.ts
  • studio/react/src/modules/secrets/index.tsx
  • studio/react/src/modules/secrets/pages/secret-detail-page.tsx
  • studio/react/src/modules/secrets/pages/secrets-page.tsx
  • studio/react/src/modules/secrets/routes.ts
  • studio/react/src/modules/security/api.ts
  • studio/react/src/modules/security/components/deletion-blocked-dialog.tsx
  • studio/react/src/modules/security/components/generated-password-dialog.tsx
  • studio/react/src/modules/security/components/permission-editor.tsx
  • studio/react/src/modules/security/components/role-checklist.tsx
  • studio/react/src/modules/security/components/role-dialog.tsx
  • studio/react/src/modules/security/components/user-dialog.tsx
  • studio/react/src/modules/security/hooks.ts
  • studio/react/src/modules/security/index.tsx
  • studio/react/src/modules/security/pages/roles-page.tsx
  • studio/react/src/modules/security/pages/users-page.tsx
  • studio/react/src/modules/settings/index.tsx
  • studio/react/src/modules/settings/pages/settings-page.tsx
  • studio/react/src/modules/settings/routes.ts
  • studio/react/src/modules/user-tasks/api.ts
  • studio/react/src/modules/user-tasks/components/assign-task-dialog.tsx
  • studio/react/src/modules/user-tasks/components/cancel-task-dialog.tsx
  • studio/react/src/modules/user-tasks/components/complete-task-dialog.tsx
  • studio/react/src/modules/user-tasks/components/user-task-status-badge.tsx
  • studio/react/src/modules/user-tasks/components/user-tasks-gate.tsx
  • studio/react/src/modules/user-tasks/hooks.ts
  • studio/react/src/modules/user-tasks/index.tsx
  • studio/react/src/modules/user-tasks/pages/detail-page.tsx
  • studio/react/src/modules/user-tasks/pages/list-page.tsx
  • studio/react/src/modules/user-tasks/routes.ts
  • studio/react/src/modules/workflow-definitions/call-graph/__tests__/call-graph-service.test.ts
  • studio/react/src/modules/workflow-definitions/call-graph/__tests__/edge-extractor.test.ts
  • studio/react/src/modules/workflow-definitions/call-graph/__tests__/helpers.ts
  • studio/react/src/modules/workflow-definitions/call-graph/__tests__/subgraph.test.ts
  • studio/react/src/modules/workflow-definitions/call-graph/call-graph-service.ts
  • studio/react/src/modules/workflow-definitions/call-graph/config.ts
  • studio/react/src/modules/workflow-definitions/call-graph/edge-extractor.ts
  • studio/react/src/modules/workflow-definitions/call-graph/index.ts
  • studio/react/src/modules/workflow-definitions/call-graph/layout.ts
  • studio/react/src/modules/workflow-definitions/call-graph/registry.ts
  • studio/react/src/modules/workflow-definitions/call-graph/subgraph.ts
  • studio/react/src/modules/workflow-definitions/call-graph/types.ts
  • studio/react/src/modules/workflow-definitions/components/call-context/call-context-status.tsx
  • studio/react/src/modules/workflow-definitions/components/call-context/use-call-context.ts
  • studio/react/src/modules/workflow-definitions/components/code-view.tsx
  • studio/react/src/modules/workflow-definitions/components/create-workflow-dialog.tsx
  • studio/react/src/modules/workflow-definitions/components/data-usage.tsx
  • studio/react/src/modules/workflow-definitions/components/editor-header.tsx
  • studio/react/src/modules/workflow-definitions/components/editor-side-pane.tsx
  • studio/react/src/modules/workflow-definitions/components/inputs-outputs-tab.tsx
  • studio/react/src/modules/workflow-definitions/components/issues-popover.tsx
  • studio/react/src/modules/workflow-definitions/components/run-workflow-dialog.tsx
  • studio/react/src/modules/workflow-definitions/components/shortcuts-dialog.tsx
  • studio/react/src/modules/workflow-definitions/components/variables-tab.tsx
  • studio/react/src/modules/workflow-definitions/components/versions-tab.tsx
  • studio/react/src/modules/workflow-definitions/components/workflow-properties-pane.tsx
  • studio/react/src/modules/workflow-definitions/editor-context.tsx
  • studio/react/src/modules/workflow-definitions/hooks.ts
  • studio/react/src/modules/workflow-definitions/index.tsx
  • studio/react/src/modules/workflow-definitions/pages/editor-page.tsx
  • studio/react/src/modules/workflow-definitions/pages/list-page.tsx
  • studio/react/src/modules/workflow-definitions/routes.ts
  • studio/react/src/modules/workflow-instances/__tests__/journal-spans.test.ts
  • studio/react/src/modules/workflow-instances/components/activity-details-pane.tsx
  • studio/react/src/modules/workflow-instances/components/activity-executions-list.tsx
  • studio/react/src/modules/workflow-instances/components/date-filter-popover.tsx
  • studio/react/src/modules/workflow-instances/components/executions-table.tsx
  • studio/react/src/modules/workflow-instances/components/incidents-panel.tsx
  • studio/react/src/modules/workflow-instances/components/input-output-panel.tsx
  • studio/react/src/modules/workflow-instances/components/instance-details.tsx
  • studio/react/src/modules/workflow-instances/components/instance-filters.tsx
  • studio/react/src/modules/workflow-instances/components/instance-row-actions.tsx
  • studio/react/src/modules/workflow-instances/components/journal-tree.tsx
  • studio/react/src/modules/workflow-instances/components/multi-select.tsx
  • studio/react/src/modules/workflow-instances/components/running-count-badge.tsx
  • studio/react/src/modules/workflow-instances/components/variables-panel.tsx
  • studio/react/src/modules/workflow-instances/hooks.ts
  • studio/react/src/modules/workflow-instances/index.tsx
  • studio/react/src/modules/workflow-instances/model.ts
  • studio/react/src/modules/workflow-instances/pages/list-page.tsx
  • studio/react/src/modules/workflow-instances/pages/viewer-page.tsx
  • studio/react/src/modules/workflow-instances/routes.ts
  • studio/react/studio.config.json
  • studio/react/tsconfig.json
  • studio/react/vitest.config.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

Copy link
Copy Markdown
Member Author

@greptileai Please review the current history-preserving import and provenance guard.

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review skipped: 353 files exceed the limit of 150.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@greptile-apps

greptile-apps Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] No blocking finding remains for the scoped immutable import mechanics; merge must preserve the recorded ancestry and exact donor subtree.

Summary

Imports the unchanged React Studio source into studio/react/ while preserving its original history.

  • A separate React Studio app now lives under studio/react/.
  • A provenance record and workflow track the imported source.
  • Studio docs now point readers to the React Preview and its source record.

Reviews (5) · Last reviewed commit: "Merge branch 'codex/8859-react-studio-mo..." · Reviewed by Greptile

Comment thread scripts/integration-program/verify_studio_react_source_import.py Outdated

Copy link
Copy Markdown
Member Author

@greptileai Fixed both findings: boundary checks now disable rename detection, and real-Git regression cases cover changed imported files and an outside deletion represented as a rename. All eight cases and the actual import verifier pass.

@greptile-apps

greptile-apps Bot commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Both findings are resolved. The provenance boundary check now uses git diff --no-renames, preventing an outside deletion from being hidden as a rename. The regression suite also covers both an outside deletion/rename and a changed imported file while keeping the donor and receipt tree unchanged.

No further Greptile findings.

Copy link
Copy Markdown
Member Author

@greptileai Please review integrated head e1c6db0 after the current-main merge.

Copy link
Copy Markdown
Member Author

@coderabbitai review

Current integrated head: e1c6db0

@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review skipped: 353 files exceed the limit of 150.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Comment thread studio/react/src/modules/workflow-definitions/pages/editor-page.tsx

Copy link
Copy Markdown
Member Author

@greptileai Please review final integrated head 1a2936f. The latest main is incorporated and the addressed findings are verified and resolved. This PR intentionally preserves the immutable donor import and provenance; the opening/autosave defect in that historical snapshot is fixed in adaptation PR #8925 at e42edff, not by altering imported donor files. Please assess this PR's scoped provenance/import behavior; the resolved inline thread links the production correction and regression evidence.

Copy link
Copy Markdown
Member Author

@coderabbitai review

Please re-review final integrated head 1a2936f; verified fixes and latest main are included.

@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review skipped: 353 files exceed the limit of 150.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Comment thread studio/react/src/modules/designer/model/flowchart-ops.ts

Copy link
Copy Markdown
Member Author

@greptileai Please re-review immutable import mechanics at unchanged head 1a2936f. The newly reported Switch copied-branch IDs issue is now corrected in adaptation PR #8925 at f4a8442 and propagated through production tip5e841832a23fac5713fd95363a67648852385243. The resolved thread links exact source and eight passing clone/navigation regressions. This PR preserves the donor import and receipt exactly, so implementation fixes live in adaptation rather than rewriting provenance. Please evaluate this PR's scoped import mechanics with the production correction accounted for.

Base automatically changed from codex/8859-react-studio-modularity-spike to main October 21, 2026 20:35

Copy link
Copy Markdown
Member Author

User-authorized self-review for #8859.

APPROVE + HIGH @ 1a2936f

Reviewed the history-preserving import and its immutable merge/tree receipt, original 14-commit ancestry, source-tip cutoff, verifier/eight regression cases, documentation entrypoints and source-validation workflow. The original donor tree remains unchanged at the receipted import commit. No license grant is inferred or attribution rewritten. Nexxbiz clearance was explicitly waived by the task owner.

The donor-baseline Switch-copy finding is fixed in the subsequent production adaptation #8925 at f4a8442; the original snapshot is deliberately preserved. The new regression proves copied branch/descendant IDs and node paths, internal connections and original lookup remain correct. The updated full adaptation passes 208 unit, 28 hosting and 49 browser tests.

Current exact-head CI is green, Greptile is 5/5 and the exhaustive thread audit has zero unresolved findings. This is an author self-review under the task owner's explicit standing authority, not an independent approval. Merge uses the reviewed head and preserves donor ancestry, without squash/rebase or protection changes. Donor redirect/archive follows actual-main receipt verification and a final source-tip check.

@sfmskywalker
sfmskywalker merged commit d2f609f into main Oct 21, 2026
21 of 24 checks passed
@sfmskywalker
sfmskywalker deleted the codex/8859-react-studio-import branch October 21, 2026 20:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants