From acbdb285c9cd641f8c5ebeed51bedd36027c2c8b Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Thu, 17 Sep 2026 16:45:19 +0200 Subject: [PATCH] refactor: one operating-workspace context for editors acting on a session's workspace Co-Authored-By: Claude Opus 5 (1M context) --- .../lib/components/AIProviderPicker.svelte | 6 +- frontend/src/lib/components/ArgInput.svelte | 6 +- .../src/lib/components/ChannelSelector.svelte | 10 ++- .../lib/components/EditableSchemaForm.svelte | 6 +- .../components/ErrorOrRecoveryHandler.svelte | 12 +-- .../lib/components/ExploreAssetButton.svelte | 12 ++- .../components/GitHubAppIntegration.svelte | 47 ++++++------ .../lib/components/GitLabIntegration.svelte | 7 +- .../components/GitRepoResourcePicker.svelte | 6 +- .../src/lib/components/HistoricInputs.svelte | 6 +- .../components/InputTransformPickers.svelte | 6 +- .../InputTransformSchemaForm.svelte | 6 +- .../src/lib/components/LabelsInput.svelte | 6 +- .../LightweightResourcePicker.svelte | 8 +- .../lib/components/PasswordArgInput.svelte | 7 +- frontend/src/lib/components/Path.svelte | 13 ++-- .../components/PathNameAutocomplete.svelte | 11 +-- .../src/lib/components/ResourceEditor.svelte | 6 +- .../components/ResourceEditorDrawer.svelte | 6 +- .../src/lib/components/ResourceForm.svelte | 7 +- .../src/lib/components/ResourcePicker.svelte | 6 +- .../components/ResourceVersionHistory.svelte | 6 +- .../src/lib/components/S3FilePicker.svelte | 6 +- .../lib/components/S3FilePickerInner.svelte | 6 +- .../src/lib/components/S3FilePreview.svelte | 6 +- .../lib/components/SaveInputsButton.svelte | 6 +- .../lib/components/SavedInputsPicker.svelte | 7 +- frontend/src/lib/components/SchemaForm.svelte | 6 +- .../src/lib/components/ScriptPicker.svelte | 11 +-- .../src/lib/components/TestConnection.svelte | 6 +- .../src/lib/components/VariableEditor.svelte | 6 +- .../src/lib/components/VariableForm.svelte | 7 +- .../AssetGraph/PipelineTriggerEditors.svelte | 7 +- .../components/operatingWorkspace.svelte.ts | 29 ++++++++ .../lib/components/operatingWorkspace.test.ts | 60 +++++++++++++++ .../raw_apps/DefaultDatabaseSelector.svelte | 7 +- .../raw_apps/RawAppDataTableDrawer.svelte | 7 +- .../components/raw_apps/RawAppEditor.svelte | 7 +- .../raw_apps/RawAppInlineScriptEditor.svelte | 7 +- .../RawAppInlineScriptRunnable.svelte | 8 +- .../raw_apps/RawAppInlineScriptsPanel.svelte | 7 +- .../raw_apps/RawAppInputsSpecEditor.svelte | 8 +- .../raw_apps/RawAppSharedUiDrawer.svelte | 7 +- .../raw_apps/RawAppTemplatePicker.svelte | 8 +- .../components/raw_apps/rawAppWorkspace.ts | 22 ------ .../sessions/PageItemEditorView.svelte | 6 +- .../sessions/SessionEditorTarget.svelte | 2 + .../triggers/AddTriggersButton.svelte | 10 ++- .../components/triggers/CaptureSection.svelte | 10 ++- .../components/triggers/CaptureTable.svelte | 11 +-- .../components/triggers/CaptureWrapper.svelte | 10 ++- .../triggers/PermissionedAsLine.svelte | 8 +- .../triggers/TestTriggerConnection.svelte | 7 +- .../triggers/TriggerEditorToolbar.svelte | 7 +- .../triggers/TriggerHistoryButton.svelte | 7 +- .../triggers/TriggerSuspendedJobsModal.svelte | 7 +- .../components/triggers/TriggerTokens.svelte | 8 +- .../components/triggers/TriggersEditor.svelte | 39 +++++----- .../amqp/AmqpEditorConfigSection.svelte | 7 +- .../amqp/AmqpTriggerEditorInner.svelte | 8 +- .../AzureTriggerEditorConfigSection.svelte | 7 +- .../azure/AzureTriggerEditorInner.svelte | 8 +- .../triggers/email/DefaultEmailCapture.svelte | 6 +- .../email/DefaultEmailConfigSection.svelte | 9 ++- .../triggers/email/DefaultEmailPanel.svelte | 16 +++- .../triggers/email/EmailCapture.svelte | 6 +- .../EmailTriggerEditorConfigSection.svelte | 8 +- .../email/EmailTriggerEditorInner.svelte | 8 +- .../components/triggers/gcp/GcpCapture.svelte | 6 +- .../gcp/GcpTriggerEditorConfigSection.svelte | 13 ++-- .../triggers/gcp/GcpTriggerEditorInner.svelte | 8 +- .../triggers/http/OpenAPISpecGenerator.svelte | 9 ++- .../triggers/http/RouteCapture.svelte | 7 +- .../http/RouteEditorConfigSection.svelte | 8 +- .../triggers/http/RouteEditorInner.svelte | 8 +- .../triggers/http/RoutesGenerator.svelte | 9 ++- .../kafka/KafkaTriggerEditorInner.svelte | 8 +- .../kafka/KafkaTriggersConfigSection.svelte | 8 +- .../mqtt/MqttEditorConfigSection.svelte | 7 +- .../mqtt/MqttTriggerEditorInner.svelte | 8 +- .../native/NativeTriggerEditor.svelte | 13 ++-- .../triggers/native/NativeTriggerTable.svelte | 9 ++- .../services/github/GitHubTriggerForm.svelte | 10 ++- .../google/GoogleCalendarPicker.svelte | 16 ++-- .../services/google/GoogleDrivePicker.svelte | 74 ++++++++++--------- .../nextcloud/NextcloudTriggerForm.svelte | 10 ++- .../nats/NatsTriggerEditorInner.svelte | 8 +- .../nats/NatsTriggersConfigSection.svelte | 7 +- .../postgres/CheckPostgresRequirement.svelte | 15 ++-- .../PostgresTriggerEditorInner.svelte | 8 +- .../postgres/PublicationPicker.svelte | 27 ++++--- .../triggers/postgres/SlotPicker.svelte | 17 ++--- .../schedules/ScheduleEditorInner.svelte | 14 ++-- .../sqs/SqsTriggerEditorConfigSection.svelte | 7 +- .../triggers/sqs/SqsTriggerEditorInner.svelte | 8 +- .../components/triggers/triggerWorkspace.ts | 29 -------- .../triggers/webhook/WebhooksCapture.svelte | 6 +- .../webhook/WebhooksConfigSection.svelte | 8 +- .../WebsocketEditorConfigSection.svelte | 7 +- .../WebsocketTriggerEditorInner.svelte | 8 +- 100 files changed, 603 insertions(+), 469 deletions(-) create mode 100644 frontend/src/lib/components/operatingWorkspace.svelte.ts create mode 100644 frontend/src/lib/components/operatingWorkspace.test.ts delete mode 100644 frontend/src/lib/components/raw_apps/rawAppWorkspace.ts delete mode 100644 frontend/src/lib/components/triggers/triggerWorkspace.ts diff --git a/frontend/src/lib/components/AIProviderPicker.svelte b/frontend/src/lib/components/AIProviderPicker.svelte index 19b1346b84..f69bb6e8f4 100644 --- a/frontend/src/lib/components/AIProviderPicker.svelte +++ b/frontend/src/lib/components/AIProviderPicker.svelte @@ -3,11 +3,13 @@ import Select from './select/Select.svelte' import { fetchAvailableModels, AI_PROVIDERS } from './copilot/lib' import type { AIProvider, ProviderConfig } from '$lib/gen' - import { workspaceStore } from '$lib/stores' import ResourcePicker from './ResourcePicker.svelte' import Toggle from './Toggle.svelte' import { saveConfig, removeConfig, isSameAsStoredConfig } from './aiProviderStorage' import AIReasoningEffortPicker from './AIReasoningEffortPicker.svelte' + import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' + + const operatingWorkspace = useOperatingWorkspace() interface Props { value: ProviderConfig | undefined @@ -26,7 +28,7 @@ workspace = undefined }: Props = $props() - let effectiveWorkspace = $derived(workspace ?? $workspaceStore ?? '') + let effectiveWorkspace = $derived(workspace ?? $operatingWorkspace ?? '') let value = $derived.by(() => { if (!_uncheckedValue || typeof _uncheckedValue !== 'object') return undefined diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index d62f8aed0f..62165bc758 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -41,12 +41,14 @@ import { safeSelectItems } from './select/utils.svelte' import S3ArgInput from './common/fileUpload/S3ArgInput.svelte' import { base } from '$lib/base' - import { workspaceStore } from '$lib/stores' import { getJsonSchemaFromResource } from './schema/jsonSchemaResource.svelte' import AIProviderPicker from './AIProviderPicker.svelte' import TextInput from './text_input/TextInput.svelte' import FileInput from './common/fileInput/FileInput.svelte' import { randomUUID } from '$lib/utils/uuid' + import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' + + const operatingWorkspace = useOperatingWorkspace() interface Props { label?: string @@ -823,7 +825,7 @@ /> {/await} {:else if inputCat == 'object' && format?.startsWith('jsonschema-')} - {#await getJsonSchemaFromResource(format.substring('jsonschema-'.length), workspace ?? $workspaceStore ?? '')} + {#await getJsonSchemaFromResource(format.substring('jsonschema-'.length), workspace ?? $operatingWorkspace ?? '')} {:then schema} {#if !schema || !schema.properties} diff --git a/frontend/src/lib/components/ChannelSelector.svelte b/frontend/src/lib/components/ChannelSelector.svelte index d7a720d877..1b5faee265 100644 --- a/frontend/src/lib/components/ChannelSelector.svelte +++ b/frontend/src/lib/components/ChannelSelector.svelte @@ -1,9 +1,11 @@ {#if captureInfo} diff --git a/frontend/src/lib/components/triggers/email/EmailTriggerEditorConfigSection.svelte b/frontend/src/lib/components/triggers/email/EmailTriggerEditorConfigSection.svelte index 3a60d3be71..8942c7db9b 100644 --- a/frontend/src/lib/components/triggers/email/EmailTriggerEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/email/EmailTriggerEditorConfigSection.svelte @@ -2,8 +2,7 @@ import { Alert } from '$lib/components/common' import Required from '$lib/components/Required.svelte' import Section from '$lib/components/Section.svelte' - import { userStore, workspaceStore } from '$lib/stores' - import { getTriggerWorkspace } from '$lib/components/triggers/triggerWorkspace' + import { userStore } from '$lib/stores' // import { page } from '$app/state' import { getEmailAddress, getEmailDomain } from './utils' import { isCloudHosted } from '$lib/cloud' @@ -12,6 +11,7 @@ import { untrack } from 'svelte' import { EmailTriggerService } from '$lib/gen' import ClipboardPanel from '$lib/components/details/ClipboardPanel.svelte' + import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' interface Props { initialTriggerPath?: string | undefined dirtyLocalPart?: boolean @@ -35,8 +35,8 @@ isDraftOnly = true, showTestingBadge = false }: Props = $props() - const triggerWs = getTriggerWorkspace() - const wsId = $derived(triggerWs?.() ?? $workspaceStore) + const operatingWorkspace = useOperatingWorkspace() + const wsId = $derived($operatingWorkspace) let validateTimeout: number | undefined = undefined diff --git a/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte index df9969daaa..e56ab739b9 100644 --- a/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte @@ -18,8 +18,7 @@ type Retry, type TriggerMode } from '$lib/gen' - import { usedTriggerKinds, userStore, workspaceStore } from '$lib/stores' - import { getTriggerWorkspace } from '$lib/components/triggers/triggerWorkspace' + import { usedTriggerKinds, userStore } from '$lib/stores' import { canWrite, capitalize, emptyString, sendUserToast } from '$lib/utils' import Section from '$lib/components/Section.svelte' import { Loader2 } from 'lucide-svelte' @@ -39,6 +38,7 @@ import LocalDraftBanner from '$lib/components/LocalDraftBanner.svelte' import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte' import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte' + import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' let { useDrawer = true, @@ -57,8 +57,8 @@ trigger = undefined, customSaveBehavior = undefined } = $props() - const triggerWs = getTriggerWorkspace() - const wsId = $derived(triggerWs?.() ?? $workspaceStore) + const operatingWorkspace = useOperatingWorkspace() + const wsId = $derived($operatingWorkspace) // Form data state let initialPath = $state('') diff --git a/frontend/src/lib/components/triggers/gcp/GcpCapture.svelte b/frontend/src/lib/components/triggers/gcp/GcpCapture.svelte index 7538026782..a77d12ebef 100644 --- a/frontend/src/lib/components/triggers/gcp/GcpCapture.svelte +++ b/frontend/src/lib/components/triggers/gcp/GcpCapture.svelte @@ -1,10 +1,12 @@
{#if resourceId} -
+
Selected: {resourceName || resourceId}
{:else} -
+
No file selected
@@ -198,21 +196,27 @@