* feat(sessions): show an item's deployed page in the preview panel
The preview panel showed an item's editor and nothing else. It now shows the
deployed page too, as a tab of its own.
**Two sides, two tabs.** The editor and the deployed page are different things
to look at, so `isItemTabFor` keys on the side rather than the item: asking for
a side already open focuses it, asking for the other opens it alongside. Two
editors for one item still cannot coexist — they would race its single
(kind, path) cell — but an editor beside a viewer is safe, since the viewer
reads the deployed version over the API and holds no cell. The tab breadcrumb
keeps re-pointing in place; `Exit & see details` and the detail page's `Edit`
open the other side instead of consuming the one you are on. A tab's label
carries `(edit)` when it is the editor side.
**The detail pages moved out of their routes.** `/scripts/get` and `/flows/get`
are now thin wrappers over `ScriptDetail` and `FlowDetail`, which the panel
renders too. Everything they reach — drawers, triggers, saved inputs — is scoped
to the viewer's workspace through `setOperatingWorkspace`, and every navigation
they attempt is caught by `interceptNav` and turned into a move inside the
panel, so nothing takes the browser out of the session. A plain click is
intercepted; ⌘-click and middle-click still open a real tab, which is why the
pages keep their `href`s.
**The picker opens what exists.** A row opens the deployed page, or the editor
when nothing is deployed there, and carries a Draft / Draft only badge in the
review dock's words. `WorkspaceItem` gained `draftOnly` and `hasDraft` from the
listers, which already returned both; deploys now invalidate the picker cache
through `itemDeployed`, so a just-deployed item stops reading as a draft. Rows
also carry a hover Edit action, reachable from the keyboard with the pick
modifier.
`open_preview` gained a `mode`, narrowed out of the advertised schema for a
session that cannot write drafts and re-checked per path in the handler, where
a refusal reports "couldn't check" apart from "denied". The mode is resolved
before those checks, so a call that omits it is gated as the editor it will
become.
Alongside, the workspace a detail page acts on is now the one it is showing
rather than the one the browser is navigated to: `MoveDrawer`,
`toggleWorkspaceErrorHandler` and the pages' own permission gates read the
operating workspace and its acting user, and `RunForm` mints a password
argument's ephemeral variable there too — in a fork session all of these
previously answered for the parent. `InWorkspaceAppViewer` hands the app's
`ctx` user down as a prop instead of writing the global `userStore`, which from
a session tab was re-pointing every permission check on the page.
Fixes found on the way: `DetailPageLayout` claimed `h-screen` inside a panel
that is not the viewport; Edit on a historical script version dropped the
version from the intercepted click; the Run button stayed spinning after a run
that left the page mounted; and the window-level run shortcut fired from a
collapsed panel and from keys another handler had already claimed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(sessions): historical edits, stale not-found, shared edit rights, tab labels
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): keep deployed-page links and workspace reads in the session
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): scope detail hrefs to the session, re-point the viewer's own tab
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): keep a previewed raw app's route out of the session URL
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): resolve edit-in-fork against the session workspace
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): read advanced run tags from the session workspace
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): fork from the session workspace, star only navigation items
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): mount only the side a preview tab shows
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): address CI review round 1 findings
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): route links in a deployed page's drawers through the panel
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): tell the chat which deployed page the panel shows
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): only a 404 reads as an undeployed raw app
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): scope the unparseable-JSON run gate to the form
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): a flow deleted from the panel stays in its tab
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): the picker's edit shortcut works on the current row
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): load-error toasts say what failed
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): keep an oversized invalid JSON editor in its form's run gate
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* revert: keep main's draft_only description in openapi.yaml
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Remove $$props.field usage
* Rename slots to ensure no hyphen
* _props
* _trigger
* OnSelectedIteration type correct capitalization
* rename _content
* Remove afterUpdate
* Migrate everything to svelte 5
* array bind
* Fix popover
* type never
* nit fixes
* Fixed many trivial errors
* onClick
* Fix errors
* use let:
* nit typing
* fix: wrap state_referenced_locally vars with untrack()
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add untrack import
* Fix all syntax errors due to untrack migration
* Fix undefined errors
* Fix more undefined errors
* untrack(() => initialOpen)
* svelte-ignore
* Fix state_descriptors_fixed error in Chart.svelte
Use $state.snapshot() to pass plain copies of data/options to Chart.js
instead of $state proxies. Chart.js's listenArrayEvents tries to define
property descriptors on data arrays, which Svelte 5 proxies reject.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* nit typing
* Merge issue
* Fix "path is not set" error in resource picker / editor
* Fix InputTransformForm error when rerunning some flows
* fix npm run check
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* runs on svelte 5
* Line component from svelte-chartjs
* Replaced all svelte-chartjs occurrences with custom wrapper
* Fix props mistake
* Fix illegal table structures
* self-closing-tags fix
* aria labels
* Fixed trivial warnings and errors
* @tanstack/svelte-table fix
* upgrade to vite 6
* svelte-kit sync before running svelte-check
* Remove on:clear which is actually on:removeAll and already handled by on:change
* fix worker tags not displaying in Autoscaling
* Try to fix svelte-kit sync not working during CI
* remove warnings
* Fix add flow page crashing
* access worldStore before assignment fix
* fix infinite recursions in App Editor
* Replaced JSON.stringify with proper deepEqual
* component mount api changed (no longer classes)
* fix ci errors
* Fix infinite loops in background runnable panel
* factored effect on deep equal logic in onObjChange
* fix "Add" not working in AgGrid Table
* Replaced legacy component.$set api
* Fix multiselect infinite value reaction
* Fix flow input fields resetting when opening their edit tab
* fix date input resetting when typing year
* Remove !p-0 affecting subgrid dotted borders
* fix missing debounceTemplate causing hundreds of updates
* Fix AgGrid action refreshes and disppearing
* resolve getItems generating random ids every rerun
* fix cannot access items before init
* fix sort lambda arguments being undefined
* Revert "Remove !p-0 affecting subgrid dotted borders"
This reverts commit c62809bb45d682a48376b071680645ed4e1c601b.
* fix input not updating in decision tree editor
* Update frontend/src/lib/components/schema/EditableSchemaWrapper.svelte
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* Re-added padding affecting subgrid dotted borders (#5479)
* remove !p-0 in preset components
* removed extra padding on accordion tabs subgrid
* Fix non-reactive SchemaForm
* dirty fix for the oneOf bug
* Fix warnings and update svelte-exmarkdown for svelte 5
* fix dnd not working
* don't mount component like objects
---------
Co-authored-by: Diego Imbert <diegoimbert@protonmail.com>
Co-authored-by: Diego Imbert <70353967+diegoimbert@users.noreply.github.com>
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* use melt menu in sidebar
* stop keyboard navigation for disabled items
* use melt menu for FavoriteMenu and WorkspaceMenu
* fix popover placement for menuButton
* use melt menu for operator menu
* fix notification
* fix operator menu
* Use melt menu in FlowJobsMenu
* use melt menu for AppMenu
* clean code
* clean code
* add use clickOutside option to Menu
* use pointerdown_outside
* use pointerdown_outside
# Conflicts:
# frontend/src/lib/components/meltComponents/Menu.svelte
* use pointerdown in menus
* add max-h to app dropdown menu
* keep more open in operator menu
* add a MenuItem component
* clean
* nit
* nit
* clean code
* put conditionalMelt as utility function
* remove unused Portal
* Add debounce effect in operator menu
* fix component jumping due to z-index
* format pages
* migrate dropdown to melt
* migrate popup to melt popover
* feat: remove `pip` fallback option for python and ansible (#5186)
* refactor!: Remove `pip` fallback option for python and ansible
BREAKING CHANGE: pip was deprecated since 1.425.0 (2024-11-15)
* fix errors in main.rs
* fix tests
* remove nsjail for pip
* fix imports
* fix compilation error
* reinforce melt types
* fix racing condition issue in closing operator menu
* nit
* fix id conflix with melt element
* nit
* clean code
* use melt dropdown instead of menubar
* prevent modal from closing on click outside button in menu
* fix nit
* nit
* close dropdown when opening a new one
* replace MenuV2 with melt Menu (1/4) (#5214)
* use melt menu in sidebar
* stop keyboard navigation for disabled items
* use melt menu for FavoriteMenu and WorkspaceMenu
* fix popover placement for menuButton
* use melt menu for operator menu
* fix notification
* fix operator menu
* Use melt menu in FlowJobsMenu
* use melt menu for AppMenu
* clean code
* clean code
* add use clickOutside option to Menu
* use pointerdown_outside
* use pointerdown_outside
# Conflicts:
# frontend/src/lib/components/meltComponents/Menu.svelte
* use pointerdown in menus
* add max-h to app dropdown menu
* keep more open in operator menu
* add a MenuItem component
* clean
* nit
* nit
* clean code
* put conditionalMelt as utility function
* remove unused Portal
* Add debounce effect in operator menu
* fix component jumping due to z-index
* feat: remove `pip` fallback option for python and ansible (#5186)
* refactor!: Remove `pip` fallback option for python and ansible
BREAKING CHANGE: pip was deprecated since 1.425.0 (2024-11-15)
* fix errors in main.rs
* fix tests
* remove nsjail for pip
* fix imports
* fix compilation error
* reinforce melt types
* fix racing condition issue in closing operator menu
* nit
* fix id conflix with melt element
* nit
* prevent modal from closing on click outside button in menu
---------
Co-authored-by: pyranota <92104930+pyranota@users.noreply.github.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
# Conflicts:
# frontend/src/lib/components/meltComponents/MenuItem.svelte
# frontend/src/lib/utils.ts
* clean
* fix z index and render
* fix initialize of dropdownmenu after melt migration
* feat: add support for | None and Optional in python (#5361)
* feat: add support for | None and Optional in python
* update python parser package
* add local rooting for MenuItem
* fix z index
* clean
* nit
* nit
* clean code
* nit
---------
Co-authored-by: pyranota <92104930+pyranota@users.noreply.github.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
Co-authored-by: HugoCasa <hugo@casademont.ch>