(undefined)
async function loadAvailableEvents() {
- if (!$workspaceStore) {
+ if (!$operatingWorkspace) {
availableEvents = []
return
}
@@ -47,7 +49,7 @@
eventsError = undefined
try {
const events = await NativeTriggerService.listNextCloudEvents({
- workspace: $workspaceStore!
+ workspace: $operatingWorkspace!
})
availableEvents = events
serviceSchema = getNextcloudSchema(events)
@@ -84,7 +86,7 @@
let externalDataApplied = $state(false)
$effect(() => {
- if ($workspaceStore) {
+ if ($operatingWorkspace) {
loadAvailableEvents()
}
})
diff --git a/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte
index 80612377a0..41b6b1fb79 100644
--- a/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte
+++ b/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte
@@ -11,8 +11,7 @@
import Path from '$lib/components/Path.svelte'
import TriggerRunnablePicker from '$lib/components/triggers/TriggerRunnablePicker.svelte'
import { NatsTriggerService, type ErrorHandler, 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 { withForkConflictRetry } from '$lib/utils/forkConflict'
import Section from '$lib/components/Section.svelte'
@@ -33,6 +32,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'
interface Props {
useDrawer?: boolean
@@ -73,8 +73,8 @@
onDelete = undefined,
onReset = undefined
}: Props = $props()
- const triggerWs = getTriggerWorkspace()
- const wsId = $derived(triggerWs?.() ?? $workspaceStore)
+ const operatingWorkspace = useOperatingWorkspace()
+ const wsId = $derived($operatingWorkspace)
let drawer: Drawer | undefined = $state(undefined)
let is_flow: boolean = $state(false)
diff --git a/frontend/src/lib/components/triggers/nats/NatsTriggersConfigSection.svelte b/frontend/src/lib/components/triggers/nats/NatsTriggersConfigSection.svelte
index 2c459770d0..4d81cf4ff6 100644
--- a/frontend/src/lib/components/triggers/nats/NatsTriggersConfigSection.svelte
+++ b/frontend/src/lib/components/triggers/nats/NatsTriggersConfigSection.svelte
@@ -1,13 +1,12 @@
{#if postgres_resource_path}
diff --git a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte
index 3286ebc47e..d0e403e4ba 100644
--- a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte
+++ b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte
@@ -19,8 +19,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, emptyString, emptyStringTrimmed, sendUserToast } from '$lib/utils'
import { withForkConflictRetry } from '$lib/utils/forkConflict'
import Section from '$lib/components/Section.svelte'
@@ -55,6 +54,7 @@
import { useTriggerDraftSync } from '../useTriggerDraftSync.svelte'
import LocalDraftBanner from '$lib/components/LocalDraftBanner.svelte'
import { capitalize } from '$lib/utils'
+ import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte'
interface Props {
useDrawer?: boolean
@@ -94,8 +94,8 @@
onDelete = undefined,
onReset = undefined
}: Props = $props()
- const triggerWs = getTriggerWorkspace()
- const wsId = $derived(triggerWs?.() ?? $workspaceStore)
+ const operatingWorkspace = useOperatingWorkspace()
+ const wsId = $derived($operatingWorkspace)
let drawer: Drawer | undefined = $state(undefined)
let is_flow: boolean = $state(false)
diff --git a/frontend/src/lib/components/triggers/postgres/PublicationPicker.svelte b/frontend/src/lib/components/triggers/postgres/PublicationPicker.svelte
index a7a06b04d4..fdf24b5757 100644
--- a/frontend/src/lib/components/triggers/postgres/PublicationPicker.svelte
+++ b/frontend/src/lib/components/triggers/postgres/PublicationPicker.svelte
@@ -1,25 +1,24 @@
diff --git a/frontend/src/lib/components/triggers/postgres/SlotPicker.svelte b/frontend/src/lib/components/triggers/postgres/SlotPicker.svelte
index ef3ac720ef..4ea985f0e7 100644
--- a/frontend/src/lib/components/triggers/postgres/SlotPicker.svelte
+++ b/frontend/src/lib/components/triggers/postgres/SlotPicker.svelte
@@ -3,17 +3,16 @@
import Select from '$lib/components/select/Select.svelte'
import { safeSelectItems } from '$lib/components/select/utils.svelte'
import { PostgresTriggerService } from '$lib/gen'
- import { workspaceStore } from '$lib/stores'
- import { getTriggerWorkspace } from '$lib/components/triggers/triggerWorkspace'
import { sendUserToast } from '$lib/toast'
import { emptyString } from '$lib/utils'
import { RefreshCw } from 'lucide-svelte'
+ import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte'
interface Props {
- edit: boolean;
- replication_slot_name?: string;
- postgres_resource_path?: string;
- disabled?: boolean;
+ edit: boolean
+ replication_slot_name?: string
+ postgres_resource_path?: string
+ disabled?: boolean
}
let {
@@ -21,9 +20,9 @@
replication_slot_name = $bindable(''),
postgres_resource_path = '',
disabled = false
- }: Props = $props();
- const triggerWs = getTriggerWorkspace()
- const wsId = $derived(triggerWs?.() ?? $workspaceStore)
+ }: Props = $props()
+ const operatingWorkspace = useOperatingWorkspace()
+ const wsId = $derived($operatingWorkspace)
let deletingSlot: boolean = $state(false)
let loadingSlot: boolean = $state(false)
diff --git a/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte b/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte
index baa89bd068..54f4b6587e 100644
--- a/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte
+++ b/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte
@@ -30,7 +30,7 @@
type Schedule,
type ErrorHandler
} from '$lib/gen'
- import { enterpriseLicense, workspaceStore } from '$lib/stores'
+ import { enterpriseLicense } from '$lib/stores'
import { canWrite, emptyString, formatCron, sendUserToast, cronV1toV2 } from '$lib/utils'
import { base } from '$lib/base'
import Section from '$lib/components/Section.svelte'
@@ -50,8 +50,8 @@
import TextInput from '$lib/components/text_input/TextInput.svelte'
import { twMerge } from 'tailwind-merge'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
- import { getTriggerWorkspace } from '$lib/components/triggers/triggerWorkspace'
import { useActingUser } from '$lib/actingUser.svelte'
+ import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte'
let {
useDrawer = true,
@@ -138,8 +138,8 @@
let selectedPermissionedAs = $state(undefined)
let preservePermissionedAs = $state(false)
- const triggerWs = getTriggerWorkspace()
- const wsId = $derived(triggerWs?.() ?? $workspaceStore)
+ const operatingWorkspace = useOperatingWorkspace()
+ const wsId = $derived($operatingWorkspace)
// `undefined` while the lookup is in flight or after it failed; the checks below then
// refuse rather than fall back to rights that belong to another workspace.
const acting = useActingUser(() => wsId)
@@ -159,9 +159,9 @@
emptyString(errorHandlerExtraArgs['channel'])) ||
!can_write
)
- // Carry the acting workspace onto "create from template" routes when a
- // session override is set, so the script is created in the session workspace.
- const wsParam = $derived(triggerWs?.() ? `&workspace=${encodeURIComponent(wsId!)}` : '')
+ // Carry the acting workspace onto "create from template" routes, so the script is created
+ // in the workspace this schedule lives in.
+ const wsParam = $derived(wsId ? `&workspace=${encodeURIComponent(wsId)}` : '')
const scheduleCfg = $derived.by(getScheduleCfg)
const draftSync = useTriggerDraftSync({
diff --git a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte
index 6aa7b025cc..7a648ab63b 100644
--- a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte
+++ b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte
@@ -13,11 +13,10 @@
import VariableEditor from '$lib/components/VariableEditor.svelte'
import { Button } from '$lib/components/common'
import { VariableService, type AwsAuthResourceType } from '$lib/gen'
- import { workspaceStore } from '$lib/stores'
- import { getTriggerWorkspace } from '$lib/components/triggers/triggerWorkspace'
import TestingBadge from '../testingBadge.svelte'
import MultiSelect from '$lib/components/select/MultiSelect.svelte'
import { safeSelectItems } from '$lib/components/select/utils.svelte'
+ import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte'
interface Props {
can_write?: boolean
@@ -40,8 +39,8 @@
message_attributes = $bindable([]),
showTestingBadge = false
}: Props = $props()
- const triggerWs = getTriggerWorkspace()
- const wsId = $derived(triggerWs?.() ?? $workspaceStore)
+ const operatingWorkspace = useOperatingWorkspace()
+ const wsId = $derived($operatingWorkspace)
async function loadVariables() {
return await VariableService.listVariable({ workspace: wsId ?? '' })
diff --git a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte
index d20bc35fee..deb12846b5 100644
--- a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte
+++ b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte
@@ -9,8 +9,7 @@
import Drawer from '$lib/components/common/drawer/Drawer.svelte'
import DrawerContent from '$lib/components/common/drawer/DrawerContent.svelte'
import Path from '$lib/components/Path.svelte'
- 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 { withForkConflictRetry } from '$lib/utils/forkConflict'
import { Loader2 } from 'lucide-svelte'
@@ -39,6 +38,7 @@
import { deepEqual } from 'fast-equals'
import { useTriggerDraftSync } from '../useTriggerDraftSync.svelte'
import LocalDraftBanner from '$lib/components/LocalDraftBanner.svelte'
+ import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte'
interface Props {
useDrawer?: boolean
@@ -78,8 +78,8 @@
onDelete = undefined,
onReset = undefined
}: Props = $props()
- const triggerWs = getTriggerWorkspace()
- const wsId = $derived(triggerWs?.() ?? $workspaceStore)
+ const operatingWorkspace = useOperatingWorkspace()
+ const wsId = $derived($operatingWorkspace)
let drawer: Drawer | undefined = $state(undefined)
let is_flow: boolean = $state(false)
diff --git a/frontend/src/lib/components/triggers/triggerWorkspace.ts b/frontend/src/lib/components/triggers/triggerWorkspace.ts
deleted file mode 100644
index 290db9da37..0000000000
--- a/frontend/src/lib/components/triggers/triggerWorkspace.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { getContext, setContext } from 'svelte'
-
-const TRIGGER_WORKSPACE_KEY = 'triggerWorkspace'
-
-/**
- * Context seam letting the native-trigger editors operate on a workspace other
- * than the globally-active `$workspaceStore`. An AI session can run against a
- * (possibly forked) workspace that differs from the nav workspace WITHOUT
- * switching `$workspaceStore` (see `SessionPicker`), so a host that embeds the
- * trigger editors in that context registers a resolver here.
- *
- * Every workspace-scoped backend call / navigation inside the trigger subtree
- * reads its workspace via {@link getTriggerWorkspace} and falls back to
- * `$workspaceStore` when no resolver is set — the default everywhere outside
- * such a host, so behavior there is unchanged. Mirrors the AI chat manager's
- * `operatingWorkspace` resolver.
- */
-export function setTriggerWorkspace(resolver: () => string | undefined): void {
- setContext(TRIGGER_WORKSPACE_KEY, resolver)
-}
-
-/**
- * The trigger-workspace resolver set by an embedding host, or `undefined` when
- * none is set (fall back to `$workspaceStore`). Read once during component init;
- * use in a `$derived`: `const ws = $derived(triggerWs?.() ?? $workspaceStore)`.
- */
-export function getTriggerWorkspace(): (() => string | undefined) | undefined {
- return getContext<(() => string | undefined) | undefined>(TRIGGER_WORKSPACE_KEY)
-}
diff --git a/frontend/src/lib/components/triggers/webhook/WebhooksCapture.svelte b/frontend/src/lib/components/triggers/webhook/WebhooksCapture.svelte
index b6392bf41b..18a95d01c6 100644
--- a/frontend/src/lib/components/triggers/webhook/WebhooksCapture.svelte
+++ b/frontend/src/lib/components/triggers/webhook/WebhooksCapture.svelte
@@ -4,9 +4,11 @@
import { isObject } from '$lib/utils'
import CopyableCodeBlock from '../../details/CopyableCodeBlock.svelte'
import CaptureSection, { type CaptureInfo } from '../CaptureSection.svelte'
- import { workspaceStore } from '$lib/stores'
import { Url } from '$lib/components/common'
import { fade } from 'svelte/transition'
+ import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte'
+
+ const operatingWorkspace = useOperatingWorkspace()
interface Props {
isFlow?: boolean
@@ -33,7 +35,7 @@
)
let captureUrl = $derived(
- `${location.origin}/api/w/${$workspaceStore}/capture_u/webhook/${
+ `${location.origin}/api/w/${$operatingWorkspace}/capture_u/webhook/${
isFlow ? 'flow' : 'script'
}/${path}`
)
diff --git a/frontend/src/lib/components/triggers/webhook/WebhooksConfigSection.svelte b/frontend/src/lib/components/triggers/webhook/WebhooksConfigSection.svelte
index 36bb8e36d5..9033aab3cf 100644
--- a/frontend/src/lib/components/triggers/webhook/WebhooksConfigSection.svelte
+++ b/frontend/src/lib/components/triggers/webhook/WebhooksConfigSection.svelte
@@ -18,11 +18,11 @@
// import { page } from '$app/state'
import { base } from '$lib/base'
import TriggerTokens from '../TriggerTokens.svelte'
- import { workspaceStore, userStore } from '$lib/stores'
- import { getTriggerWorkspace } from '$lib/components/triggers/triggerWorkspace'
+ import { userStore } from '$lib/stores'
import UserSettings from '../../UserSettings.svelte'
import { generateRandomString } from '$lib/utils'
import TextInput from '$lib/components/text_input/TextInput.svelte'
+ import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte'
interface Props {
isFlow?: boolean
@@ -43,8 +43,8 @@
triggerTokens = $bindable(undefined),
scopes = []
}: Props = $props()
- const triggerWs = getTriggerWorkspace()
- const wsId = $derived(triggerWs?.() ?? $workspaceStore)
+ const operatingWorkspace = useOperatingWorkspace()
+ const wsId = $derived($operatingWorkspace)
const WEBHOOK_BASE_URL = $derived(`${location.origin}${base}/api/w/${wsId}/jobs`)
diff --git a/frontend/src/lib/components/triggers/websocket/WebsocketEditorConfigSection.svelte b/frontend/src/lib/components/triggers/websocket/WebsocketEditorConfigSection.svelte
index 5d56329901..50ef769ce2 100644
--- a/frontend/src/lib/components/triggers/websocket/WebsocketEditorConfigSection.svelte
+++ b/frontend/src/lib/components/triggers/websocket/WebsocketEditorConfigSection.svelte
@@ -8,10 +8,9 @@
import { sendUserToast } from '$lib/utils'
import type { Schema } from '$lib/common'
import { FlowService, ScriptService, type Flow, type Script } from '$lib/gen'
- import { workspaceStore } from '$lib/stores'
- import { getTriggerWorkspace } from '$lib/components/triggers/triggerWorkspace'
import TestTriggerConnection from '../TestTriggerConnection.svelte'
import TestingBadge from '$lib/components/triggers/testingBadge.svelte'
+ import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte'
interface Props {
url: string | undefined
@@ -32,8 +31,8 @@
isValid = $bindable(false),
showTestingBadge = false
}: Props = $props()
- const triggerWs = getTriggerWorkspace()
- const wsId = $derived(triggerWs?.() ?? $workspaceStore)
+ const operatingWorkspace = useOperatingWorkspace()
+ const wsId = $derived($operatingWorkspace)
let areRunnableArgsValid: boolean = $state(true)
diff --git a/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte
index b36e6da9ad..4223b247b7 100644
--- a/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte
+++ b/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte
@@ -25,8 +25,7 @@
type ErrorHandler,
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, emptySchema, emptyString, sendUserToast } from '$lib/utils'
import { withForkConflictRetry } from '$lib/utils/forkConflict'
import Section from '$lib/components/Section.svelte'
@@ -55,6 +54,7 @@
import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte'
import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte'
import { capitalize } from '$lib/utils'
+ import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte'
interface Props {
useDrawer?: boolean
@@ -95,8 +95,8 @@
onReset = undefined,
cloudDisabled = false
}: Props = $props()
- const triggerWs = getTriggerWorkspace()
- const wsId = $derived(triggerWs?.() ?? $workspaceStore)
+ const operatingWorkspace = useOperatingWorkspace()
+ const wsId = $derived($operatingWorkspace)
let drawer: Drawer | undefined = $state()
let is_flow: boolean = $state(false)