Skip to content

[DO NOT MERGE] Org project view on the org routes: dev branch for Theo and Marcus - #8464

Draft
mzxchandra wants to merge 38 commits into
feat/org-project-viewfrom
feat/org-project-routes
Draft

mzxchandra wants to merge 38 commits into
feat/org-project-viewfrom
feat/org-project-routes

Conversation

@mzxchandra

Copy link
Copy Markdown
Contributor

Do not merge. Not for review. This draft exists only so Theo and Marcus can share and test the org project view while it is in development. It replaces the earlier dev PR #8454.

Stacked on #8433 (feat/org-project-view).

What is here

The org project view now lives on the real organization surface instead of /playground/org, entirely behind the org-project-view flag. With the flag off, the org surface is unchanged.

  • Home (/o/<org>/home): the product's Home, with a project picker. Build with a project picked opens that project's chat; Search, Plan and "No project" behave exactly as today.
  • Sidebar: Projects (one per workspace fork lineage, with their chats, rename, pin, drag and a row menu) replace Workspaces, and Home reads as New chat.
  • Project main view (/o/<org>/p/<workspaceId>/{dashboard,changelog,issues,environments}): dashboard files and a Runs dashboard, the Environments tab for forks and resource mappings, and empty states for Changelog and Issues until those entities exist.
  • Build view: /workspace/<id>/... swaps its sidebar for the project Build sidebar, /workspace/<id>/w is a foldered Workflows page, and the canvas has a location bar.

The playground prototype and its mock data are removed. Issues and Changelog plug in behind the empty states when the real entities land.

Running it locally

Set ORG_PROJECT_VIEW=true, plus FORKING_ENABLED=true and NEXT_PUBLIC_FORKING_ENABLED=true for the Environments tab. Open /o/<org>/home.

🤖 Generated with Claude Code

mzxchandra and others added 15 commits September 29, 2026 17:12
Projects are the logged-in user's real workspaces; chats, workflows,
files, tables, knowledge bases, logs and integrations come from the
workspace's own React Query hooks and open the real pages. The side
chat and new-chat home run the real Sim Chat over useChat, with a
syncChatUrl option so the panel keeps its own URL. Dashboards render
real dashboard files live plus a built-in Runs dashboard from the logs
stats route. Issues and Changelog stay mock through per-project overlay
packs matched by workspace name, and issue resource chips resolve to
the real resource with the same name.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… into next release

A pack now matches on the workspace's workflow names before its name, so
the demo project picks up its pack whatever the workspace is called. The
next-release card received the project id it was already using.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…t description

The message handed from the home composer is sent one tick after the
side chat mounts, with cleanup, so a simulated remount no longer
withdraws it. The settings General page uses the same description line
as the project header.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The pack is chosen from the workspace's workflow names, which load
after the workspace list, so an issue route now shows a loading state
until the list arrives instead of calling notFound on the fallback
pack. The needs-you badge waits the same way, and the draft chart's
release index points at its last value.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…rg integrations page

Packs no real workspace claims stay in the sidebar as mock projects
with their prototype chats, rows and sample dashboards; real hooks stay
off for them. A real workspace nothing claims shows only its real
resources. Connectors renders the organization integrations component
the way the org route does.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A fork lineage is one project: the sidebar lists its root, the project
header shows the current environment (Prod, Staging, Sandbox, from a
trailing word on the workspace name or the fork depth) beside "Open
full view", and a dropdown switches to another environment on the same
section. Connectors resolves the organization the way the app entry
does.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ents section

Moves the fork-lineage resolution the playground computed into lib/projects so the
workspace sidebar and the organization surface can share it. Registers the
org-project-view feature flag (fallback ORG_PROJECT_VIEW) and passes it through every
FeatureFlagsProvider. Adds the Environments chip to the project main view with a
placeholder tab.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… and mappings

One card per environment with the real fork, sync and disconnect actions, resource sub-tabs
in the sync view's kind order (exported from use-fork-sync so the order cannot drift), and a
grid with one row per resource and one column per environment that joins the per-edge pull
mappings by resource id. Cells edit through the real mapping route. Mock projects show an
example grid.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e, Changelog per environment

Real projects' Build links and "Open full view" go to /workspace/<id>/... and the prototype's
build/* rendering only remains for mock projects. The overlay pack is resolved once per lineage
root so every environment shares its issues; the changelog shows shipped releases on Prod, the
draft next release on Staging and running work on Sandbox. The mock entities now sit behind a
ProjectSources interface with the packs moved to fixtures/ and an empty implementation for the
graduated surface.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…d org-project-view

The real sidebar's hidden services (search data, global commands, chat events, search and
help modals) move into a shared hook and modals component so both sidebars mount them. With
the flag on, the workspace layout mounts the project Build sidebar (back chip to the project,
environment chip that switches lineages, flat Project and Build links, chats, footer) and
/workspace/<id>/w renders a foldered Workflows list with search, New workflow and the row
actions the old tree offered, instead of redirecting to the first canvas.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…s, env chip everywhere, credential marks

Project rows get hover actions, a context menu (open, copy link, rename, pin, delete), inline
rename across the lineage, drag reorder (a per-browser order until it moves server-side) and
pinned-first sorting. New chat uses a compose icon (SquarePen, new in the icon set). The Build
sidebar's environment chip always opens its dropdown and ends with Manage environments. The
Environments grid leads credential rows with the provider mark of the youngest environment
that still holds the credential.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The org view's footer is now the shared account and help footer: clicking your name opens
Settings (the organization's settings) and Sign out, and help offers docs, Slack and
support. The fork modal takes an optional list of sources; the Environments tab passes the
lineage, so Create fork can start from Prod, Staging or Sandbox, with the default name and
resource list following the chosen source.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…icker; Search matches the org surface

New chat now renders the organization Home from the product, with its Build, Plan and
Search switch, suggestions and org chats. The only addition is the project picker: with
a project picked, a Build message opens that project's chat. The org Home gains three
optional props for this (a per-mode heading and accessory, a before-send hook, and the
existing flag that keeps chat URLs in place); its default behavior is unchanged.

Search renders the organization Search page, as the org surface does. The separate
Assistant page and nav item are removed: the product has no such destination, search is
a mode of Home.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…view

With org-project-view on, the canvas gets a breadcrumb bar (Workflows, its folders, the
workflow) whose crumbs return to the Workflows index at that folder, plus a Search
resources action that opens the search modal. Replaces the sidebar tree's job of showing
where the open workflow lives. Flag off: unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…g-project-view

The prototype leaves /playground/org for the real routes. With the flag on:
- /o/<org>/home is the product's Home plus the project picker.
- The org sidebar lists Projects (one per fork lineage, with their chats and the row menu,
  rename, pin and drag) in place of Workspaces, and Home reads as New chat.
- /o/<org>/p/<workspaceId>/{dashboard,changelog,issues,environments} is the project main
  view: real dashboards and Runs, the Environments tab, and empty states for Changelog and
  Issues until those entities exist.
- The Build sidebar's back chip and project links point at the org project routes.
With the flag off the org surface is unchanged. The playground shell, its fixtures and the
mock-only pieces are deleted.

The workflow location bar mounts from the canvas page instead of its layout, and reads the
workflow through the list query options and opens search through the global command, so the
layout's module graph stays at its baseline (it had grown by about 1,150 modules).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
docs Ready Ready Preview Oct 3, 2026 10:03pm UTC

Request Review

…verlay

The comparison engine now reports which loop and parallel fields changed and
which blocks entered or left a container, and exposes the field lists and a
shared hasChanges helper. A new overlay module merges two workflow states into
one canvas: removed blocks, containers and edges ride along as ghosts at their
old positions (nudged clear of live cards), deleted condition and router
branches stay on the surviving card so their ghost edge keeps a handle, and
every edge is classified by canonical port key. The renderer edge view gains a
quiet ghost style for those removed connections.

(cherry picked from commit 0a1717d)
The preview canvas accepts per-block and per-edge diff status: added and
modified cards get a ring and a shared status label, removed cards and
containers fade to a ghost, changed sub-block rows and sentence chips tint,
and ghost edges sit under live ones so a rewired port shows the new line on top.

(cherry picked from commit 463603c)
Side-by-side view of two workflow states: the overlaid canvas on the left and a
change list on the right, sharing selection. Each touched block is a collapsible
card with the app's block tile; modified blocks show field rows as folded line
diffs with word marks, item-by-item list diffs for tools, conditions, routes and
input fields, old to new pairs for scalars, and only the fact for secrets. Added
and removed blocks show every field diffed against nothing, with long one-sided
bodies capped behind one expander. Fork comparisons group credentials, picked
resources and trigger paths into a muted environment bindings section.

(cherry picked from commit d5dc867)
The deploy modal offers "View changes" (live against the draft) when a redeploy
is pending and a "Compare" action on every version row, opening a full-width
comparison whose two sides are pickable from the header. The draft state hook is
shared with change detection and only subscribes while something to compare
against exists.

(cherry picked from commit 609c81b)
The synced deployed workflows list gets a "View changes" action per row. A new
internal route and fork use case return the target as its editor holds it and
the source deployment re-keyed into the target's block ids through the fork block
map (or the derived id the sync would assign), with condition and route ids and
variable ids aligned, so the two sides diff block for block like two versions of
one workflow.

(cherry picked from commit b02ec19)
Comparison: keep basic/advanced mode changes visible, include a tool's
permission, server and implementation fields in list diffs, include input field
defaults, read checkbox records as records, show whitespace-only edits, cap word
and line diffing so a pathological prompt cannot stall the pane, slot deleted
branches back at their old position, never reuse a ghost edge id, and mask
secret-looking keys at any depth (including key/value table rows) with a
name-based fallback when a block definition is unknown.

Change list: memoized cards that only re-render when their own selection
changes, nested cards for blocks inside an added or removed container, a
shared sign map, muted tokens that exist, hover and focus treatment, scroll
edge fades, and a shared skeleton for both hosts.

Fork preview: the before side is the target draft the sync overwrites, read
in one snapshot and scoped to the target workspace; variables and their
assignments are re-keyed by unique name; a create reports no target id; the
change rows are a discriminated union; the query key sits under the fork diff
keys so a sync invalidates it; a direction switch closes the preview.

(cherry picked from commit 90b0089)
…ew gaps

- Fork "View changes" now loads only the previewed workflow: its deployed
  state, its identity mapping, its target row and its block pairs, instead of
  every deployed state in the source workspace plus the full promote plan.
  The plan item comes from the same buildForkPromotePlanItems decision the
  promote uses. The route gets a per-user rate limit.
- Word marks give up past 64 edits per line pair, so many long rewritten
  lines cannot stall the tab.
- Agent tool params that their block marks as password fields are masked
  whatever their name.
- A list item whose label changed but whose body did not is no longer
  flagged as a masked value change.
- Hoist double casts under their annotations, make sourceWorkflowId
  optional on the wire for rollout, lazy-load both diff modals, and
  re-record the settings module baseline: the block registry the diff canvas
  needs is reached only through the lazy chunk opened on click.

(cherry picked from commit b610b2c)
- Sync details load each replaced target's draft and diff it against the
  projected source, using the same projection and "has changes" rule as the
  per-workflow preview, so a row and its preview never disagree. Rows the sync
  would not change read "No changes" and offer no comparison.
- Preview buttons wait until the list matches the selected direction.
- Mask JSON-encoded secrets in text and scalar fields, and say "A masked
  value changed" when masking hides the only difference.
- Show role changes on agent messages, highlight a router's changed Context
  on the canvas, and keep ghost edges under live ones into containers.
- Added or removed loops and parallels list their iteration settings.
- Size ghost containers the way the preview draws them.
- "Order changed" only when items moved; CRLF and CR read as line breaks;
  collapsing unchanged lines closes every fold; selecting a nested block
  opens its container card; the version pickers have distinct names.
- Drop redundant mock resets flagged by check:test-patterns.

(cherry picked from commit 0f55477)
- The sync list's per-workflow change check measures the target drafts in one
  query first and skips itself past the fork state limit, then reads drafts a
  few at a time and drops each after comparing, instead of holding them all.
- Mask keys with a secret word anywhere in them (secretAccessKey,
  aws_secret_access_key) while credential references stay readable.
- Inline diffs show whitespace-only changes.
- Opened folds reset when the compared bodies change.
- Ghost collision boxes use the canvas's own block measurement.

(cherry picked from commit 2a3e35f)
…ection per comparison

- Agent message bodies go through the same masking as other text fields.
- The sync change check's size guard counts block outputs and data, not only sub-blocks.
- Picking another version clears the block selection.

(cherry picked from commit a1f6f07)
…comes, not mock calls

- Key the comparison view by the picked version pair instead of resetting on state identity, so live draft updates no longer clear the selection.
- Agent message changes hidden by masking say so, like other fields.
- Fork preview tests assert results, with mocks that answer only the right arguments, instead of asserting mock calls.

(cherry picked from commit 9a18b8e)
…s Environments tab

The Environments tab becomes a pipeline flowing toward the root (Sandbox, Staging, Prod).
Each fork edge has a connector: how many deployed workflows its sync would change, a line
drawn like a running workflow edge (arrowhead as a marker on the same path, the canvas's
execution pulse travelling the way changes flow), and a split button. Review promotion is
the default; the chevron turns it into Review refresh and reverses the edge.

Reviewing an edge shows what that sync ships below the pipeline: its changed workflows, each
opening the side-by-side comparison from the fork sync preview, and Sync, which confirms the
overwrite with the same modal the workspace fork settings use.

- The execution pulse moves into @sim/workflow-renderer as ExecutionPulse, shared by the
  canvas edge and the pipeline edge.
- The sync overwrite confirm moves out of the fork settings page into ForkSyncConfirmModal.
- The tool-registry page-weight baseline is re-recorded for the comparison view's growth.
… Search becomes a composer mode

Chats are organization-wide and can span projects, so the org sidebar no longer lists chats
under each project. Every chat sits in the Chats section, and with org-project-view on each
row leads with the marks of the projects it worked in.

- The chat list returns workspaceIds per chat: its own workspace plus every workspace its
  resources live in, aggregated in SQL. It stands in for the chat's associated projects until
  the projects table records them directly.
- With the flag on, Search leaves the sidebar and its page redirects to Home, where Search is
  already a mode of the composer alongside Build and Plan.
…kfill; composer polish

Schema (0389): project (name, optional organization, so personal workspaces have projects
too), project_workspace (a workspace's project, environment label and pipeline position;
workspace_id unique) and copilot_chat_project (the projects a chat worked in).

Backfill (script migration 0030_backfill_projects, resumable and idempotent): one project per
fork lineage named after its root without the trailing environment word, owned by the root's
organization; members labelled by their name's environment word or their depth; then each
chat's projects from its own workspace and its resources' workspaces.

Write paths keep every workspace in exactly one project: a new workspace gets its own project,
a fork joins its parent's one step down, and disconnecting a fork moves it and its descendants
into a new project named after it.

Moving organization workspace chats to organization ownership is a separate script run by hand
(db:move-workspace-chats-to-organizations, with --dry-run), because the workspace sidebar still
lists chats by workspace; personal workspace chats keep their workspace owner.

Composer, with org-project-view on: Search uses the same framed composer as Build and Plan and
hides model, speed and effort; the mode switch leads the toolbar; Add resources opens on
projects, each revealing its workspaces.
…ls are workspace names

- GET /api/projects and PATCH /api/projects/[id] behind application operations
- Build sidebar, add-resource menu and org sidebar read the projects table
- chat rows mark the projects recorded in copilot_chat_project; new workspace
  chats record their workspace's project and forked chats copy their parent's
- drop the environment column and the name parsing; hide a name that repeats its label
External collaborators are not organization members, so an organization chat
would read as not found for them; their chats stay workspace-scoped.
An organization chat with no stored conversation mode reads as a search chat.
@vercel
vercel Bot requested a deployment to Preview October 3, 2026 22:04 Abandoned

This branch had an error being deployed

1 abandoned deployment
Preview — fb86acff Deployed Oct 3, 2026 by vercel[bot]
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.

1 participant