From 1a0c975fa51f171cdb87d5934676322a031fc4fe Mon Sep 17 00:00:00 2001 From: centdix Date: Fri, 27 Mar 2026 14:31:14 +0100 Subject: [PATCH 1/3] feat: add workspace to URL via /w// prefix Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/src/hooks.ts | 10 +++ frontend/src/lib/components/ArgInput.svelte | 4 +- .../lib/components/CompareWorkspaces.svelte | 4 +- .../src/lib/components/DeployWorkspace.svelte | 4 +- frontend/src/lib/components/EditorBar.svelte | 8 +-- .../components/ErrorOrRecoveryHandler.svelte | 6 +- .../src/lib/components/FlowLogViewer.svelte | 5 +- .../src/lib/components/FlowMetadata.svelte | 11 ++-- .../components/FlowStatusViewerInner.svelte | 6 +- frontend/src/lib/components/Login.svelte | 6 +- .../components/PersistentScriptDrawer.svelte | 6 +- .../lib/components/S3FilePickerInner.svelte | 3 +- .../src/lib/components/ScriptEditor.svelte | 4 +- .../src/lib/components/ScriptPicker.svelte | 10 +-- .../components/SuperadminSettingsInner.svelte | 3 +- .../src/lib/components/TimelineBar.svelte | 4 +- .../lib/components/WorkflowTimeline.svelte | 4 +- .../apps/editor/AppReportsDrawerInner.svelte | 4 +- .../InlineScriptRunnableByPath.svelte | 4 +- .../lib/components/common/table/AppRow.svelte | 8 +-- .../components/common/table/FlowRow.svelte | 14 ++-- .../components/common/table/RawAppRow.svelte | 4 +- .../components/common/table/ScriptRow.svelte | 16 ++--- .../components/flows/CreateActionsApp.svelte | 5 +- .../components/flows/CreateActionsFlow.svelte | 11 ++-- .../flows/propPicker/OutputBadge.svelte | 4 +- .../lib/components/home/TutorialBanner.svelte | 4 +- .../preview/FlowPreviewStatus.svelte | 4 +- .../components/runs/JobDetailHeader.svelte | 16 ++--- .../src/lib/components/runs/RunBadges.svelte | 9 ++- .../src/lib/components/runs/RunRow.svelte | 8 +-- .../components/schema/JobSchemaPicker.svelte | 5 +- .../schema/RunningJobSchemaPicker.svelte | 4 +- .../components/scriptEditor/LogPanel.svelte | 4 +- .../scripts/CreateActionsScript.svelte | 4 +- .../search/GlobalSearchModal.svelte | 5 +- .../sidebar/CriticalAlertModal.svelte | 5 +- .../components/sidebar/FavoriteMenu.svelte | 11 ++-- .../lib/components/sidebar/MenuLink.svelte | 3 +- .../components/sidebar/OperatorMenu.svelte | 41 ++++++------ .../components/sidebar/SidebarContent.svelte | 62 ++++++++++-------- .../components/sidebar/WorkspaceMenu.svelte | 14 ++-- .../PostgresTriggerEditorInner.svelte | 4 +- .../schedules/ScheduleEditorInner.svelte | 4 +- frontend/src/lib/navigation.ts | 14 ++-- frontend/src/lib/scripts.ts | 4 +- frontend/src/lib/utils/editInFork.ts | 10 +-- frontend/src/lib/workspaceUrl.ts | 64 +++++++++++++++++++ .../src/routes/(root)/(logged)/+layout.svelte | 42 +++++++++--- .../src/routes/(root)/(logged)/+page.svelte | 8 +-- .../(logged)/apps/get/[...path]/+page.svelte | 4 +- .../(root)/(logged)/apps_raw/add/+page.svelte | 5 +- .../(logged)/concurrency_groups/+page.svelte | 4 +- .../(logged)/flows/get/[...path]/+page.svelte | 16 ++--- .../(root)/(logged)/run/[...run]/+page.svelte | 8 +-- .../(root)/(logged)/schedules/+page.svelte | 10 +-- .../scripts/get/[...hash]/+page.svelte | 20 +++--- .../(logged)/user/(user)/login/+page.svelte | 6 +- .../(logged)/workspace_settings/+page.svelte | 11 ++-- frontend/src/routes/(root)/+layout.svelte | 17 ++++- 60 files changed, 377 insertions(+), 241 deletions(-) create mode 100644 frontend/src/lib/workspaceUrl.ts diff --git a/frontend/src/hooks.ts b/frontend/src/hooks.ts index d473ce744b14a..15c8e2b6f3541 100644 --- a/frontend/src/hooks.ts +++ b/frontend/src/hooks.ts @@ -1,3 +1,5 @@ +import type { Reroute } from '@sveltejs/kit' + /** @type {import('@sveltejs/kit').Handle} */ export async function handle({ event, resolve }) { const response = await resolve(event, { @@ -6,3 +8,11 @@ export async function handle({ event, resolve }) { return response } + +export const reroute: Reroute = ({ url }) => { + const match = url.pathname.match(/^\/w\/([^/]+)(\/.*)?$/) + if (match) { + return match[2] || '/' + } + return url.pathname +} diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index 197275fbc15ec..a0e0a38134621 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -40,7 +40,7 @@ import MultiSelect from './select/MultiSelect.svelte' import { safeSelectItems } from './select/utils.svelte' import S3ArgInput from './common/fileUpload/S3ArgInput.svelte' - import { base } from '$lib/base' + import { wsBase } from '$lib/workspaceUrl' import { workspaceStore } from '$lib/stores' import { getJsonSchemaFromResource } from './schema/jsonSchemaResource.svelte' import AIProviderPicker from './AIProviderPicker.svelte' @@ -568,7 +568,7 @@ {#if value && typeof value == 'string' && value?.startsWith('$res:')} Linked to resource {value.slice(5)} diff --git a/frontend/src/lib/components/CompareWorkspaces.svelte b/frontend/src/lib/components/CompareWorkspaces.svelte index 6905ed693188d..dbd14d3ad2a8b 100644 --- a/frontend/src/lib/components/CompareWorkspaces.svelte +++ b/frontend/src/lib/components/CompareWorkspaces.svelte @@ -57,7 +57,7 @@ import type { TriggerKind } from './triggers' import { triggerDisplayNamesMap, triggerKindToTriggerType } from './triggers/utils' import { getEmailAddress, getEmailDomain } from './triggers/email/utils' - import { base } from '$lib/base' + import { wsBase } from '$lib/workspaceUrl' import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte' import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte' @@ -683,7 +683,7 @@ function getTriggerHref(triggerKind: TriggerKind): string | undefined { const pagePath = triggerKindToPagePath[triggerKind] - return pagePath ? `${base}${pagePath}` : undefined + return pagePath ? `${$wsBase}${pagePath}` : undefined } // Fetch triggers when workspace is available diff --git a/frontend/src/lib/components/DeployWorkspace.svelte b/frontend/src/lib/components/DeployWorkspace.svelte index 9f1fd711466d4..c82151ff5379e 100644 --- a/frontend/src/lib/components/DeployWorkspace.svelte +++ b/frontend/src/lib/components/DeployWorkspace.svelte @@ -1,6 +1,6 @@ import { goto } from '$lib/navigation' - import { base } from '$lib/base' + import { wsBase } from '$lib/workspaceUrl' import Dropdown from '$lib/components/DropdownV2.svelte' import type MoveDrawer from '$lib/components/MoveDrawer.svelte' import ScheduleEditor from '$lib/components/triggers/schedules/ScheduleEditor.svelte' @@ -120,8 +120,8 @@ aiId={`script-run-button-${script.path}`} aiDescription={`Button to access the form to run the script ${script.summary ?? script.path}`} href={script.draft_only || (script.auto_kind === 'lib' && script.kind !== 'preprocessor') - ? `${base}/scripts/edit/${script.path}` - : `${base}/scripts/get/${script.hash}?workspace=${$workspaceStore}`} + ? `${$wsBase}/scripts/edit/${script.path}` + : `${$wsBase}/scripts/get/${script.hash}`} kind="script" {marked} path={script.path} @@ -182,7 +182,7 @@ wrapperClasses="w-20" unifiedSize="md" startIcon={{ icon: Pen }} - href="{base}/scripts/edit/{script.path}" + href="{$wsBase}/scripts/edit/{script.path}" > Edit @@ -264,7 +264,7 @@ { displayName: 'Duplicate/Fork', icon: GitFork, - href: `${base}/scripts/add?template=${script.path}`, + href: `${$wsBase}/scripts/add?template=${script.path}`, disabled: !showEditButton, hide: $userStore?.operator }, @@ -299,7 +299,7 @@ { displayName: 'View runs', icon: List, - href: `${base}/runs/${script.path}` + href: `${$wsBase}/runs/${script.path}` }, { displayName: 'Versions', @@ -311,7 +311,7 @@ { displayName: 'Audit logs', icon: Eye, - href: `${base}/audit_logs?resource=${script.path}`, + href: `${$wsBase}/audit_logs?resource=${script.path}`, hide: $userStore?.operator }, { @@ -431,7 +431,7 @@ openDetails on:openDetails={(e) => { if (script) { - goto(`/scripts/get/${e.detail.version}?workspace=${$workspaceStore}`) + goto(`/scripts/get/${e.detail.version}`) } versionsDrawerOpen = false }} diff --git a/frontend/src/lib/components/flows/CreateActionsApp.svelte b/frontend/src/lib/components/flows/CreateActionsApp.svelte index 5cc0df15022e7..51d67a6057a25 100644 --- a/frontend/src/lib/components/flows/CreateActionsApp.svelte +++ b/frontend/src/lib/components/flows/CreateActionsApp.svelte @@ -1,6 +1,5 @@ diff --git a/frontend/src/lib/components/flows/CreateActionsFlow.svelte b/frontend/src/lib/components/flows/CreateActionsFlow.svelte index 73f8cfedbab2a..c4eb6af7f26ae 100644 --- a/frontend/src/lib/components/flows/CreateActionsFlow.svelte +++ b/frontend/src/lib/components/flows/CreateActionsFlow.svelte @@ -1,6 +1,5 @@ diff --git a/frontend/src/lib/components/preview/FlowPreviewStatus.svelte b/frontend/src/lib/components/preview/FlowPreviewStatus.svelte index 68587fbf24df0..6e4170ed4844d 100644 --- a/frontend/src/lib/components/preview/FlowPreviewStatus.svelte +++ b/frontend/src/lib/components/preview/FlowPreviewStatus.svelte @@ -1,6 +1,6 @@