diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index e33a53c091..efe3d64cbd 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "windmill-components",
- "version": "1.502.2",
+ "version": "1.502.5",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "windmill-components",
- "version": "1.502.2",
+ "version": "1.502.5",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
@@ -151,7 +151,7 @@
"fsevents": "^2.3.3"
},
"peerDependencies": {
- "svelte": "^4.0.0"
+ "svelte": "^5.0.0"
}
},
"node_modules/@alloc/quick-lru": {
diff --git a/frontend/package.json b/frontend/package.json
index 12778fc663..cdd5241f4b 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -5,7 +5,7 @@
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
- "postinstall": "node scripts/untar_ui_builder.js && node scripts/patch_files.js",
+ "postinstall": "if [ -f ./scripts/untar_ui_builder.js ]; then node ./scripts/untar_ui_builder.js && node ./scripts/patch_files.js; fi",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --threshold warning",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .",
@@ -161,7 +161,7 @@
"zod-to-json-schema": "^3.24.5"
},
"peerDependencies": {
- "svelte": "^4.0.0"
+ "svelte": "^5.0.0"
},
"exports": {
"./package.json": "./package.json",
@@ -169,7 +169,16 @@
"types": "./dist/index.d.ts",
"svelte": "./dist/index.js"
},
+ "./scripts/untar_ui_builder.js": "./scripts/untar_ui_builder.js",
"./assets/app.css": "./package/assets/app.css",
+ "./components/custom_ui": {
+ "types": "./package/components/custom_ui.d.ts",
+ "default": "./package/components/custom_ui.js"
+ },
+ "./components/scriptBuilder": {
+ "types": "./package/components/scriptBuilder.d.ts",
+ "default": "./package/components/scriptBuilder.js"
+ },
"./components/TestJobLoader.svelte": {
"types": "./package/components/TestJobLoader.svelte.d.ts",
"svelte": "./package/components/TestJobLoader.svelte",
@@ -255,20 +264,20 @@
"svelte": "./package/components/FlowStatusViewer.svelte",
"default": "./package/components/FlowStatusViewer.svelte"
},
- "./components/FlowBuilder.svelte": {
- "types": "./package/components/FlowBuilder.svelte.d.ts",
- "svelte": "./package/components/FlowBuilder.svelte",
- "default": "./package/components/FlowBuilder.svelte"
+ "./components/FlowWrapper.svelte": {
+ "types": "./package/components/FlowWrapper.svelte.d.ts",
+ "svelte": "./package/components/FlowWrapper.svelte",
+ "default": "./package/components/FlowWrapper.svelte"
},
- "./components/AppEditor.svelte": {
- "types": "./package/components/apps/editor/AppEditor.svelte.d.ts",
- "svelte": "./package/components/apps/editor/AppEditor.svelte",
- "default": "./package/components/apps/editor/AppEditor.svelte"
+ "./components/AppWrapper.svelte": {
+ "types": "./package/components/AppWrapper.svelte.d.ts",
+ "svelte": "./package/components/AppWrapper.svelte",
+ "default": "./package/components/AppWrapper.svelte"
},
- "./components/ScriptBuilder.svelte": {
- "types": "./package/components/ScriptBuilder.svelte.d.ts",
- "svelte": "./package/components/ScriptBuilder.svelte",
- "default": "./package/components/ScriptBuilder.svelte"
+ "./components/ScriptWrapper.svelte": {
+ "types": "./package/components/ScriptWrapper.svelte.d.ts",
+ "svelte": "./package/components/ScriptWrapper.svelte",
+ "default": "./package/components/ScriptWrapper.svelte"
},
"./components/FlowEditor.svelte": {
"types": "./package/components/flows/FlowEditor.svelte.d.ts",
@@ -285,10 +294,10 @@
"svelte": "./package/components/SchemaForm.svelte",
"default": "./package/components/SchemaForm.svelte"
},
- "./components/EditableSchemaWrapper.svelte": {
- "types": "./package/components/schema/EditableSchemaWrapper.svelte.d.ts",
- "svelte": "./package/components/schema/EditableSchemaWrapper.svelte",
- "default": "./package/components/schema/EditableSchemaWrapper.svelte"
+ "./components/EditableSchemaSdkWrapper.svelte": {
+ "types": "./package/components/schema/EditableSchemaSdkWrapper.svelte.d.ts",
+ "svelte": "./package/components/schema/EditableSchemaSdkWrapper.svelte",
+ "default": "./package/components/schema/EditableSchemaSdkWrapper.svelte"
},
"./components/ResourceEditor.svelte": {
"types": "./package/components/ResourceEditor.svelte.d.ts",
@@ -451,14 +460,14 @@
"components/FlowBuilder.svelte": [
"./package/components/FlowBuilder.svelte.d.ts"
],
- "components/AppEditor.svelte": [
- "./package/components/apps/editor/AppEditor.svelte.d.ts"
+ "components/AppWrapper.svelte": [
+ "./package/components/AppWrapper.svelte.d.ts"
],
- "components/ScriptBuilder.svelte": [
- "./package/components/ScriptBuilder.svelte.d.ts"
+ "components/ScriptWrapper.svelte": [
+ "./package/components/ScriptWrapper.svelte.d.ts"
],
- "components/FlowEditor.svelte": [
- "./package/components/flows/FlowEditor.svelte.d.ts"
+ "components/FlowWrapper.svelte": [
+ "./package/components/FlowWrapper.svelte.d.ts"
],
"components/SchemaViewer.svelte": [
"./package/components/SchemaViewer.svelte.d.ts"
@@ -466,8 +475,8 @@
"components/SchemaEditor.svelte": [
"./package/components/SchemaEditor.svelte.d.ts"
],
- "components/EditableSchemaWrapper.svelte": [
- "./package/components/schema/EditableSchemaWrapper.svelte.d.ts"
+ "components/EditableSchemaSdkWrapper.svelte": [
+ "./package/components/schema/EditableSchemaSdkWrapper.svelte.d.ts"
],
"components/flows/FlowHistoryInner.svelte": [
"./package/components/flows/FlowHistoryInner.svelte.d.ts"
@@ -519,6 +528,12 @@
],
"tailwindUtils": [
"./package/components/apps/editor/componentsPanel/tailwindUtils.d.ts"
+ ],
+ "components/scriptBuilder": [
+ "./package/components/scriptBuilder.d.ts"
+ ],
+ "components/custom_ui": [
+ "./package/components/custom_ui.d.ts"
]
}
},
@@ -526,4 +541,4 @@
"@rollup/rollup-linux-x64-gnu": "^4.35.0",
"fsevents": "^2.3.3"
}
-}
+}
\ No newline at end of file
diff --git a/frontend/scripts/untar_ui_builder.js b/frontend/scripts/untar_ui_builder.js
index c64b1b1484..f0ebbd8c87 100644
--- a/frontend/scripts/untar_ui_builder.js
+++ b/frontend/scripts/untar_ui_builder.js
@@ -1,6 +1,23 @@
import path from 'path'
import fs from 'fs'
+
+// Check if we're in node_modules (installed as dependency)
+if (process.cwd().includes('node_modules')) {
+ console.log('Skipping postinstall - running as dependency');
+ process.exit(0);
+}
+
+// Check if we're in the root project
+if (process.env.INIT_CWD && process.env.INIT_CWD !== process.cwd()) {
+ console.log('Skipping postinstall - not root project');
+ process.exit(0);
+}
+
+// Your actual postinstall logic here
+console.log('Running postinstall for root project');
+
+
import { x } from 'tar'
const tarUrl = 'https://pub-06154ed168a24e73a86ab84db6bf15d8.r2.dev/ui_builder-d44b577.tar.gz'
@@ -18,16 +35,6 @@ const response = await fetch(tarUrl)
const buffer = await response.arrayBuffer()
await fs.promises.writeFile(outputTarPath, Buffer.from(buffer))
-// Check if this script is being run from the package root
-const isRootInstall = process.cwd() + '/scripts' === __dirname
-
-if (isRootInstall) {
- console.log('Running postinstall: direct install')
- // Your postinstall logic here
-} else {
- console.log('Skipping postinstall: installed as dependency')
- process.exit(0)
-}
// Create extract directory if it doesn't exist
try {
diff --git a/frontend/src/lib/components/AppWrapper.svelte b/frontend/src/lib/components/AppWrapper.svelte
new file mode 100644
index 0000000000..37e5bdfc2e
--- /dev/null
+++ b/frontend/src/lib/components/AppWrapper.svelte
@@ -0,0 +1,10 @@
+
+
+
diff --git a/frontend/src/lib/components/CliHelpBox.svelte b/frontend/src/lib/components/CliHelpBox.svelte
index e05ba0f763..7c992d9154 100644
--- a/frontend/src/lib/components/CliHelpBox.svelte
+++ b/frontend/src/lib/components/CliHelpBox.svelte
@@ -1,9 +1,8 @@
diff --git a/frontend/src/lib/components/FirstStepInputs.svelte b/frontend/src/lib/components/FirstStepInputs.svelte
index ef7856828b..bd71e6a4b3 100644
--- a/frontend/src/lib/components/FirstStepInputs.svelte
+++ b/frontend/src/lib/components/FirstStepInputs.svelte
@@ -1,6 +1,6 @@
+
+
+
+
diff --git a/frontend/src/lib/components/ResourceEditor.svelte b/frontend/src/lib/components/ResourceEditor.svelte
index 7b71759eb8..9030c0ea2e 100644
--- a/frontend/src/lib/components/ResourceEditor.svelte
+++ b/frontend/src/lib/components/ResourceEditor.svelte
@@ -20,7 +20,6 @@
import autosize from '$lib/autosize'
import GfmMarkdown from './GfmMarkdown.svelte'
import TestTriggerConnection from './triggers/TestTriggerConnection.svelte'
- import { createDispatcherIfMounted } from '$lib/createDispatcherIfMounted'
import GitHubAppIntegration from './GitHubAppIntegration.svelte'
interface Props {
@@ -29,7 +28,7 @@
path?: string
newResource?: boolean
hidePath?: boolean
- watchChanges?: boolean
+ onChange?: (args: { path: string; args: Record
; description: string }) => void
defaultValues?: Record | undefined
}
@@ -39,7 +38,7 @@
path = $bindable(''),
newResource = false,
hidePath = false,
- watchChanges = false,
+ onChange,
defaultValues = undefined
}: Props = $props()
@@ -62,7 +61,6 @@
let viewJsonSchema = $state(false)
const dispatch = createEventDispatcher()
- const dispatchIfMounted = createDispatcherIfMounted(dispatch)
let rawCode: string | undefined = $state(undefined)
@@ -181,8 +179,8 @@
run(() => {
canSave = can_write && isValid && jsonError == ''
})
- run(() => {
- watchChanges && dispatchIfMounted('change', { path, args, description })
+ $effect(() => {
+ onChange && onChange({ path, args, description })
})
run(() => {
rawCode && untrack(() => parseJson())
diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte
index 480cb03e18..31ece0aab1 100644
--- a/frontend/src/lib/components/ScriptBuilder.svelte
+++ b/frontend/src/lib/components/ScriptBuilder.svelte
@@ -11,7 +11,8 @@
type TriggersCount,
PostgresTriggerService,
CaptureService,
- type ScriptLang
+ type ScriptLang,
+ WorkerService
} from '$lib/gen'
import { inferArgs } from '$lib/infer'
import { initialCode } from '$lib/script_helpers'
@@ -21,6 +22,7 @@
enterpriseLicense,
usedTriggerKinds,
userStore,
+ workerTags,
workspaceStore
} from '$lib/stores'
import {
@@ -65,16 +67,15 @@
import ScriptSchema from './ScriptSchema.svelte'
import Section from './Section.svelte'
import Label from './Label.svelte'
- import type DiffDrawer from './DiffDrawer.svelte'
import type Editor from './Editor.svelte'
import WorkerTagPicker from './WorkerTagPicker.svelte'
import MetadataGen from './copilot/MetadataGen.svelte'
import { writable } from 'svelte/store'
import { defaultScriptLanguages, processLangs } from '$lib/scripts'
import DefaultScripts from './DefaultScripts.svelte'
- import { createEventDispatcher, onMount, setContext, untrack } from 'svelte'
+ import { onMount, setContext, untrack } from 'svelte'
import Summary from './Summary.svelte'
- import type { ScriptBuilderWhitelabelCustomUi } from './custom_ui'
+
import DeployOverrideConfirmationModal from '$lib/components/common/confirmationModal/DeployOverrideConfirmationModal.svelte'
import TriggersEditor from './triggers/TriggersEditor.svelte'
import type { ScheduleTrigger, TriggerContext } from './triggers'
@@ -86,7 +87,6 @@
} from '$lib/script_helpers'
import CaptureTable from './triggers/CaptureTable.svelte'
import type { SavedAndModifiedValue } from './common/confirmationModal/unsavedTypes'
- import type { ScriptBuilderFunctionExports } from './scriptBuilder'
import DeployButton from './DeployButton.svelte'
import {
type NewScriptWithDraftAndDraftTriggers,
@@ -97,29 +97,12 @@
} from './triggers/utils'
import DraftTriggersConfirmationModal from './common/confirmationModal/DraftTriggersConfirmationModal.svelte'
import { Triggers } from './triggers/triggers.svelte'
-
- interface Props {
- script: NewScript & { draft_triggers?: Trigger[] }
- fullyLoaded?: boolean
- initialPath?: string
- template?: 'docker' | 'bunnative' | 'script'
- initialArgs?: Record
- lockedLanguage?: boolean
- showMeta?: boolean
- neverShowMeta?: boolean
- diffDrawer?: DiffDrawer | undefined
- savedScript?: NewScriptWithDraftAndDraftTriggers | undefined
- searchParams?: URLSearchParams
- disableHistoryChange?: boolean
- replaceStateFn?: (url: string) => void
- customUi?: ScriptBuilderWhitelabelCustomUi
- savedPrimarySchedule?: ScheduleTrigger | undefined
- functionExports?: ((exports: ScriptBuilderFunctionExports) => void) | undefined
- children?: import('svelte').Snippet
- }
+ import type { ScriptBuilderProps } from './script_builder'
+ import type { DiffDrawerI } from './diff_drawer'
+ import WorkerTagSelect from './WorkerTagSelect.svelte'
let {
- script = $bindable(),
+ script,
fullyLoaded = true,
initialPath = $bindable(''),
template = $bindable('script'),
@@ -135,8 +118,15 @@
customUi = {},
savedPrimarySchedule = undefined,
functionExports = undefined,
- children
- }: Props = $props()
+ children,
+ onDeploy,
+ onDeployError,
+ onSaveInitial,
+ onSeeDetails,
+ onSaveDraftError,
+ onSaveDraft,
+ disableAi
+ }: ScriptBuilderProps = $props()
export function getInitialAndModifiedValues(): SavedAndModifiedValue {
return {
@@ -153,7 +143,7 @@
'u/' +
($userStore?.username?.includes('@')
? $userStore?.username.split('@')[0].replace(/[^a-zA-Z0-9_]/g, '')
- : $userStore?.username!) +
+ : $userStore?.username) +
'/' +
generateRandomString(12)
@@ -210,8 +200,6 @@
loadTriggers()
}
- const dispatch = createEventDispatcher()
-
onMount(() => {
if (functionExports) {
console.log('functionExports set')
@@ -573,10 +561,10 @@
script.parent_hash = newHash
sendUserToast('Deployed')
} else {
- dispatch('deploy', newHash)
+ onDeploy?.({ path: script.path, hash: newHash })
}
} catch (error) {
- dispatch('deployError', error)
+ onDeployError?.({ path: script.path, error })
sendUserToast(`Error while saving the script: ${error.body || error.message}`, true)
}
loadingSave = false
@@ -629,7 +617,7 @@
} catch (error) {
sendUserToast(`Could not parse code, are you sure it is valid?`, true)
}
-
+ let newHash = ''
if (initialPath == '' || savedScript?.draft_only) {
if (savedScript?.draft_only) {
await ScriptService.deleteScriptByPath({
@@ -649,7 +637,7 @@
runnableKind: 'script'
})
}
- await ScriptService.createScript({
+ newHash = await ScriptService.createScript({
workspace: $workspaceStore!,
requestBody: {
path: script.path,
@@ -709,9 +697,9 @@
if (initialPath == '' || (savedScript?.draft_only && script.path !== initialPath)) {
savedAtNewPath = true
initialPath = script.path
- dispatch('saveInitial', script.path)
+ onSaveInitial?.({ path: script.path, hash: newHash })
}
- dispatch('saveDraft', { path: script.path, savedAtNewPath, script })
+ onSaveDraft?.({ path: script.path, savedAtNewPath, script })
sendUserToast('Saved as draft')
} catch (error) {
@@ -719,7 +707,7 @@
`Error while saving the script as a draft: ${error.body || error.message}`,
true
)
- dispatch('saveDraftError', error)
+ onSaveDraftError?.({ path: script.path, error })
}
loadingDraft = false
}
@@ -727,7 +715,7 @@
function computeDropdownItems(
initialPath: string,
savedScript: NewScriptWithDraftAndDraftTriggers | undefined,
- diffDrawer: DiffDrawer | undefined
+ diffDrawer: DiffDrawerI | undefined
) {
let dropdownItems: { label: string; onClick: () => void }[] =
initialPath != '' && customUi?.topBar?.extraDeployOptions != false
@@ -777,7 +765,7 @@
{
label: 'Exit & See details',
onClick: () => {
- dispatch('seeDetails', initialPath)
+ onSeeDetails?.({ path: initialPath })
}
}
]
@@ -945,14 +933,21 @@
$effect(() => {
!disableHistoryChange && untrack(() => encodeScriptState(script))
})
+
+ loadWorkerTags()
+ async function loadWorkerTags() {
+ if (!$workerTags) {
+ $workerTags = await WorkerService.getCustomTags({ workspace: $workspaceStore })
+ }
+ }
{@render children?.()}
- {#if script.schema}
+ {#if script.schema && !disableAi && !customUi?.settingsPanel?.metadata?.disableAiFilling}
-
-
- {#snippet action()}
-
- {/snippet}
- {#if lockedLanguage}
-
- As a forked script, the language '{script.language}' cannot be modified.
-
- {/if}
-
- {#each langs as [label, lang] (lang)}
- {@const isPicked =
- (lang == script.language && template == 'script') ||
- (template == 'bunnative' && lang == 'bunnative') ||
- (template == 'docker' && lang == 'docker')}
-
- onScriptLanguageTrigger(lang)}
- disabled={lockedLanguage ||
- (enterpriseLangs.includes(lang) && !$enterpriseLicense)}
+ {#if !customUi?.settingsPanel?.metadata?.languages || customUi?.settingsPanel?.metadata?.languages?.length > 1}
+
+ {#snippet action()}
+
+ {/snippet}
+ {#if lockedLanguage}
+
+ As a forked script, the language '{script.language}' cannot be modified.
+
+ {/if}
+
+ {#each langs as [label, lang] (lang)}
+ {@const isPicked =
+ (lang == script.language && template == 'script') ||
+ (template == 'bunnative' && lang == 'bunnative') ||
+ (template == 'docker' && lang == 'docker')}
+
-
- {label}
- {#if lang === 'nu'}
- BETA
- {/if}
-
- {#snippet text()}
- {label} is only available with an enterprise license
- {/snippet}
-
- {/each}
-
-
-
+ onScriptLanguageTrigger(lang)}
+ disabled={lockedLanguage ||
+ (enterpriseLangs.includes(lang) && !$enterpriseLicense)}
+ >
+
+ {label}
+ {#if lang === 'nu'}
+ BETA
+ {/if}
+
+ {#snippet text()}
+ {label} is only available with an enterprise license
+ {/snippet}
+
+ {/each}
+
+
+ {/if}
{#if customUi?.settingsPanel?.metadata?.disableScriptKind !== true}
{#snippet header()}
@@ -1172,6 +1167,14 @@
{/if}
+ {#if customUi?.settingsPanel?.disableRuntime}
+
+ {/if}
@@ -1239,7 +1242,10 @@
group tag (queue). For instance, you could setup an "highmem", or "gpu" tag.
{/snippet}
-
+
{#snippet header()}
@@ -1693,6 +1699,18 @@
{/if}
+ {#if $workerTags}
+ {#if $workerTags?.length ?? 0 > 0}
+
+
+
+ {/if}
+ {/if}
{#if customUi?.topBar?.settings != false}
{/if}
- {#if !aiChatManager.open}
+ {#if !aiChatManager.open && !disableAi}
{#if customUi?.editorBar?.aiGen != false && SUPPORTED_CHAT_SCRIPT_LANGUAGES.includes(lang ?? '')}
+ import ScriptBuilder from '$lib/components/ScriptBuilder.svelte'
+ import AiChatLayout from './copilot/chat/AiChatLayout.svelte'
+ import type { ScriptBuilderProps } from './script_builder'
+
+ let { script: oldScript, disableAi, ...props }: ScriptBuilderProps = $props()
+
+ let script = $state(oldScript)
+
+
+
+
+
diff --git a/frontend/src/lib/components/WorkerTagPicker.svelte b/frontend/src/lib/components/WorkerTagPicker.svelte
index 83b0ecd018..431d7c03f0 100644
--- a/frontend/src/lib/components/WorkerTagPicker.svelte
+++ b/frontend/src/lib/components/WorkerTagPicker.svelte
@@ -6,12 +6,22 @@
import { WorkerService } from '$lib/gen'
import WorkerTagSelect from './WorkerTagSelect.svelte'
- export let tag: string | undefined
- export let popupPlacement: 'bottom-end' | 'top-end' = 'bottom-end'
- export let disabled = false
+ interface Props {
+ tag: string | undefined
+ popupPlacement?: 'bottom-end' | 'top-end'
+ disabled?: boolean
+ placeholder?: string
+ }
- loadWorkerGroups()
- async function loadWorkerGroups() {
+ let {
+ tag = $bindable(),
+ popupPlacement = 'bottom-end',
+ disabled = false,
+ placeholder
+ }: Props = $props()
+
+ loadWorkerTags()
+ async function loadWorkerTags() {
if (!$workerTags) {
$workerTags = await WorkerService.getCustomTags({ workspace: $workspaceStore })
}
@@ -22,7 +32,7 @@
{#if $workerTags}
{#if $workerTags?.length ?? 0 > 0}
-
+
{:else}
No custom worker group tag defined on this instance in "Workers {'->'} Custom tags"
@@ -48,7 +58,7 @@
color="light"
on:click={() => {
$workerTags = undefined
- loadWorkerGroups()
+ loadWorkerTags()
}}
startIcon={{ icon: RotateCw }}
{disabled}
diff --git a/frontend/src/lib/components/WorkerTagSelect.svelte b/frontend/src/lib/components/WorkerTagSelect.svelte
index e337c55631..baac15cb6d 100644
--- a/frontend/src/lib/components/WorkerTagSelect.svelte
+++ b/frontend/src/lib/components/WorkerTagSelect.svelte
@@ -10,12 +10,18 @@
tag = $bindable(),
noLabel = false,
nullTag = undefined,
- disabled = false
+ disabled = false,
+ placeholder,
+ inputClass
}: {
tag: string | undefined
noLabel?: boolean
nullTag?: string | undefined
disabled?: boolean
+ placeholder?: string
+ language?: string
+ class?: string
+ inputClass?: string
} = $props()
loadWorkerGroups()
@@ -35,13 +41,14 @@
{#if !noLabel}
-
tag
+
{placeholder ?? 'tag'}
{/if}
tag, (value) => ((tag = value), dispatch('change', value))}
/>
diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte
index 75db79da69..62424662a0 100644
--- a/frontend/src/lib/components/apps/editor/AppEditor.svelte
+++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte
@@ -12,6 +12,7 @@
import type {
App,
AppEditorContext,
+ AppEditorProps,
AppViewerContext,
ConnectingInput,
ContextPanelContext,
@@ -33,7 +34,7 @@
import ItemPicker from '$lib/components/ItemPicker.svelte'
import VariableEditor from '$lib/components/VariableEditor.svelte'
- import { VariableService, type Policy } from '$lib/gen'
+ import { VariableService } from '$lib/gen'
import { initHistory } from '$lib/history'
import { Component, Minus, Paintbrush, Plus, Smartphone, Scan, Hand, Grab } from 'lucide-svelte'
import { animateTo, findGridItem, findGridItemParentGrid } from './appUtils'
@@ -51,37 +52,10 @@
import DarkModeObserver from '$lib/components/DarkModeObserver.svelte'
import { getTheme } from './componentsPanel/themeUtils'
import StylePanel from './settingsPanel/StylePanel.svelte'
- import type DiffDrawer from '$lib/components/DiffDrawer.svelte'
import HideButton from './settingsPanel/HideButton.svelte'
import AppEditorBottomPanel from './AppEditorBottomPanel.svelte'
import panzoom from 'panzoom'
- interface Props {
- app: App
- path: string
- policy: Policy
- summary: string
- fromHub?: boolean
- diffDrawer?: DiffDrawer | undefined
- savedApp?:
- | {
- value: App
- draft?: any
- path: string
- summary: string
- policy: any
- draft_only?: boolean
- custom_path?: string
- }
- | undefined
- version?: number | undefined
- newApp?: boolean
- newPath?: string | undefined
- replaceStateFn?: (path: string) => void
- gotoFn?: (path: string, opt?: Record | undefined) => void
- unsavedConfirmationModal?: import('svelte').Snippet<[any]>
- }
-
let {
app,
path,
@@ -95,8 +69,9 @@
newPath = undefined,
replaceStateFn = (path: string) => window.history.replaceState(null, '', path),
gotoFn = (path: string, opt?: Record) => window.history.pushState(null, '', path),
- unsavedConfirmationModal
- }: Props = $props()
+ unsavedConfirmationModal,
+ onSavedNewAppPath
+ }: AppEditorProps = $props()
migrateApp(app)
@@ -872,13 +847,13 @@
leftPanelHidden={leftPanelSize === 0}
rightPanelHidden={rightPanelSize === 0}
bottomPanelHidden={runnablePanelSize === 0}
- on:savedNewAppPath
- on:showLeftPanel={() => showLeftPanel()}
- on:showRightPanel={() => showRightPanel()}
- on:hideLeftPanel={() => hideLeftPanel()}
- on:hideRightPanel={() => hideRightPanel()}
- on:hideBottomPanel={() => hideBottomPanel()}
- on:showBottomPanel={() => showBottomPanel()}
+ {onSavedNewAppPath}
+ onShowLeftPanel={() => showLeftPanel()}
+ onShowRightPanel={() => showRightPanel()}
+ onShowBottomPanel={() => showBottomPanel()}
+ onHideLeftPanel={() => hideLeftPanel()}
+ onHideRightPanel={() => hideRightPanel()}
+ onHideBottomPanel={() => hideBottomPanel()}
>
{#snippet unsavedConfirmationModal({
diffDrawer,
diff --git a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte
index 731cf7e2fc..84dddecd14 100644
--- a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte
+++ b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte
@@ -32,7 +32,7 @@
Globe,
AlertTriangle
} from 'lucide-svelte'
- import { createEventDispatcher, getContext, untrack } from 'svelte'
+ import { getContext, untrack } from 'svelte'
import {
cleanValueProperties,
orderedJsonStringify,
@@ -57,7 +57,6 @@
import { secondaryMenuLeftStore, secondaryMenuRightStore } from './settingsPanel/secondaryMenu'
import Dropdown from '$lib/components/DropdownV2.svelte'
import AppEditorTutorial from './AppEditorTutorial.svelte'
- import type DiffDrawer from '$lib/components/DiffDrawer.svelte'
import AppReportsDrawer from './AppReportsDrawer.svelte'
import { type ColumnDef, getPrimaryKeys } from '../components/display/dbtable/utils'
import DebugPanel from './contextPanel/DebugPanel.svelte'
@@ -82,6 +81,7 @@
import { collectStaticFields, type TriggerableV2 } from './commonAppUtils'
import LazyModePanel from './contextPanel/LazyModePanel.svelte'
import { Sha256 } from '@aws-crypto/sha256-js'
+ import type { DiffDrawerI } from '$lib/components/diff_drawer'
async function hash(message) {
try {
@@ -103,7 +103,7 @@
interface Props {
policy: Policy
fromHub?: boolean
- diffDrawer?: DiffDrawer | undefined
+ diffDrawer?: DiffDrawerI | undefined
savedApp?:
| {
value: App
@@ -122,6 +122,13 @@
newApp: boolean
newPath?: string
unsavedConfirmationModal?: import('svelte').Snippet<[any]>
+ onSavedNewAppPath?: (path: string) => void
+ onShowRightPanel?: () => void
+ onShowLeftPanel?: () => void
+ onShowBottomPanel?: () => void
+ onHideRightPanel?: () => void
+ onHideLeftPanel?: () => void
+ onHideBottomPanel?: () => void
}
let {
@@ -135,7 +142,14 @@
bottomPanelHidden = false,
newApp,
newPath = '',
- unsavedConfirmationModal
+ unsavedConfirmationModal,
+ onSavedNewAppPath,
+ onShowLeftPanel,
+ onShowRightPanel,
+ onShowBottomPanel,
+ onHideLeftPanel,
+ onHideRightPanel,
+ onHideBottomPanel
}: Props = $props()
let newEditedPath = $state('')
@@ -406,7 +420,7 @@
} catch (e) {
console.error('error interacting with local storage', e)
}
- dispatch('savedNewAppPath', path)
+ onSavedNewAppPath?.(path)
} catch (e) {
sendUserToast('Error creating app', e)
}
@@ -509,7 +523,7 @@
} catch (e) {
console.error('error interacting with local storage', e)
}
- dispatch('savedNewAppPath', npath)
+ onSavedNewAppPath?.(npath)
}
}
@@ -589,7 +603,7 @@
}
draftDrawerOpen = false
- dispatch('savedNewAppPath', newEditedPath)
+ onSavedNewAppPath?.(newEditedPath)
} catch (e) {
sendUserToast('Error saving initial draft', e)
}
@@ -686,7 +700,7 @@
}
loading.saveDraft = false
if (newApp || savedApp.draft_only) {
- dispatch('savedNewAppPath', newEditedPath || path)
+ onSavedNewAppPath?.(newEditedPath || path)
}
} catch (e) {
loading.saveDraft = false
@@ -891,8 +905,6 @@
debugAppDrawerOpen = true
}
- const dispatch = createEventDispatcher()
-
function setTheme(newDarkMode: boolean | undefined) {
let globalDarkMode = window.localStorage.getItem('dark-mode')
? window.localStorage.getItem('dark-mode') === 'dark'
@@ -981,8 +993,8 @@
})}
{/if}
{
if (leftPanelHidden) {
- dispatch('showLeftPanel')
+ onShowLeftPanel?.()
} else {
- dispatch('hideLeftPanel')
+ onHideLeftPanel?.()
}
}}
/>
@@ -1453,9 +1465,9 @@
direction="bottom"
on:click={() => {
if (bottomPanelHidden) {
- dispatch('showBottomPanel')
+ onShowBottomPanel?.()
} else {
- dispatch('hideBottomPanel')
+ onHideBottomPanel?.()
}
}}
/>
@@ -1464,9 +1476,9 @@
direction="right"
on:click={() => {
if (rightPanelHidden) {
- dispatch('showRightPanel')
+ onShowRightPanel?.()
} else {
- dispatch('hideRightPanel')
+ onHideRightPanel?.()
}
}}
/>
diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts
index 5e20f29358..0985f5416c 100644
--- a/frontend/src/lib/components/apps/types.ts
+++ b/frontend/src/lib/components/apps/types.ts
@@ -141,13 +141,42 @@ export type HiddenRunnable = {
export type AppTheme =
| {
- type: 'path'
- path: string
- }
+ type: 'path'
+ path: string
+ }
| {
- type: 'inlined'
- css: string
- }
+ type: 'inlined'
+ css: string
+ }
+
+import type { DiffDrawerI } from "$lib/components/diff_drawer"
+
+export interface AppEditorProps {
+ app: App
+ path: string
+ policy: Policy
+ summary: string
+ fromHub?: boolean
+ diffDrawer?: DiffDrawerI | undefined
+ savedApp?:
+ | {
+ value: App
+ draft?: any
+ path: string
+ summary: string
+ policy: any
+ draft_only?: boolean
+ custom_path?: string
+ }
+ | undefined
+ version?: number | undefined
+ newApp?: boolean
+ newPath?: string | undefined
+ replaceStateFn?: (path: string) => void
+ gotoFn?: (path: string, opt?: Record | undefined) => void
+ unsavedConfirmationModal?: import('svelte').Snippet<[any]>
+ onSavedNewAppPath?: (path: string) => void
+}
export type App = {
grid: GridItem[]
diff --git a/frontend/src/lib/components/common/confirmationModal/DeployOverrideConfirmationModal.svelte b/frontend/src/lib/components/common/confirmationModal/DeployOverrideConfirmationModal.svelte
index d8e5f74bd1..ac4f9e7877 100644
--- a/frontend/src/lib/components/common/confirmationModal/DeployOverrideConfirmationModal.svelte
+++ b/frontend/src/lib/components/common/confirmationModal/DeployOverrideConfirmationModal.svelte
@@ -1,15 +1,26 @@
+ import { classNames } from '$lib/utils'
+ import { Pane, Splitpanes } from 'svelte-splitpanes'
+ import AiChat from './AIChat.svelte'
+ import { zIndexes } from '$lib/zIndexes'
+ import { loadCopilot, userStore, workspaceStore } from '$lib/stores'
+ import { chatState } from './sharedChatState.svelte'
+
+ interface Props {
+ noPadding?: boolean
+ isCollapsed?: boolean
+ children: any
+ onMenuOpen?: () => void
+ disableAi?: boolean
+ }
+ let {
+ noPadding: noBorder = false,
+ isCollapsed = false,
+ children,
+ onMenuOpen,
+ disableAi
+ }: Props = $props()
+
+ $effect(() => {
+ if (disableAi) {
+ chatState.size = 0
+ }
+ })
+
+ $effect(() => {
+ if ($workspaceStore && !disableAi) {
+ loadCopilot($workspaceStore)
+ }
+ })
+
+
+{#if !disableAi}
+
+
+
+
+
+
+
{
+ onMenuOpen?.()
+ }}
+ class="h-8 w-8 inline-flex items-center justify-center rounded-md text-tertiary hover:text-primary focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500"
+ >
+
+
+
+
+
+
+ {@render children?.()}
+
+
+
+
+
+
+
+
+
+{:else}
+ {@render children?.()}
+{/if}
diff --git a/frontend/src/lib/components/copilot/chat/navigator/core.ts b/frontend/src/lib/components/copilot/chat/navigator/core.ts
index 7e605dd8e2..aecf60bc30 100644
--- a/frontend/src/lib/components/copilot/chat/navigator/core.ts
+++ b/frontend/src/lib/components/copilot/chat/navigator/core.ts
@@ -1,4 +1,3 @@
-import { page } from '$app/state'
import type {
ChatCompletionSystemMessageParam,
ChatCompletionTool,
@@ -189,7 +188,7 @@ function getTriggerableComponents(): string {
// Function to get the current page name
function getCurrentPageName(): string {
try {
- const currentPage = page.url.pathname
+ const currentPage = window.location.pathname
switch (currentPage) {
case '/':
return 'Home Page'
diff --git a/frontend/src/lib/components/custom_ui.ts b/frontend/src/lib/components/custom_ui.ts
index 2ca87e626b..20c2829f82 100644
--- a/frontend/src/lib/components/custom_ui.ts
+++ b/frontend/src/lib/components/custom_ui.ts
@@ -35,6 +35,8 @@ export type FlowBuilderWhitelabelCustomUi = {
tagEdit?: boolean
editorBar?: EditorBarUi
downloadLogs?: boolean
+ tagSelectPlaceholder?: string
+ tagSelectNoLabel?: boolean
}
export type DisplayResultUi = {
@@ -78,6 +80,7 @@ export type SettingsPanelMetadataUi = {
disableScriptKind?: boolean
editableSchemaForm?: EditableSchemaFormUi
disableMute?: boolean
+ disableAiFilling?: boolean
}
export type SettingsPanelUi = {
@@ -105,7 +108,7 @@ export type ScriptBuilderWhitelabelCustomUi = {
}
settingsPanel?: SettingsPanelUi
disableTooltips?: boolean
-
editorBar?: EditorBarUi
previewPanel?: PreviewPanelUi
+ tagSelectPlaceholder?: string
}
diff --git a/frontend/src/lib/components/diff_drawer.ts b/frontend/src/lib/components/diff_drawer.ts
new file mode 100644
index 0000000000..108eddf8fc
--- /dev/null
+++ b/frontend/src/lib/components/diff_drawer.ts
@@ -0,0 +1,24 @@
+import type { Value } from "$lib/utils"
+
+export type DiffDrawerDiff =
+| {
+ mode: 'normal'
+ deployed: Value
+ draft: Value | undefined
+ current: Value
+ defaultDiffType?: 'deployed' | 'draft'
+ button?: { text: string; onClick: () => void }
+}
+| {
+ mode: 'simple'
+ original: Value
+ current: Value
+ title: string
+ button?: { text: string; onClick: () => void }
+}
+
+export interface DiffDrawerI {
+ openDrawer: () => void
+ closeDrawer: () => void
+ setDiff: (diff: DiffDrawerDiff) => void
+}
\ No newline at end of file
diff --git a/frontend/src/lib/components/flow_builder.ts b/frontend/src/lib/components/flow_builder.ts
new file mode 100644
index 0000000000..c133ef18b4
--- /dev/null
+++ b/frontend/src/lib/components/flow_builder.ts
@@ -0,0 +1,52 @@
+import type { OpenFlow } from '$lib/gen'
+import type { StateStore } from '$lib/utils'
+import type { Writable } from 'svelte/store'
+import type { FlowState } from './flows/flowState'
+import type { FlowWithDraftAndDraftTriggers, Trigger } from './triggers/utils'
+import type { DiffDrawerI } from './diff_drawer'
+import type { FlowBuilderWhitelabelCustomUi } from './custom_ui'
+import type { ScheduleTrigger } from './triggers'
+import type { stepState } from './stepHistoryLoader.svelte'
+
+export type FlowBuilderProps = {
+ initialPath?: string
+ pathStoreInit?: string | undefined
+ newFlow: boolean
+ selectedId: string | undefined
+ initialArgs?: Record
+ loading?: boolean
+ flowStore: StateStore
+ flowStateStore: Writable
+ savedFlow?: FlowWithDraftAndDraftTriggers | undefined
+ diffDrawer?: DiffDrawerI | undefined
+ customUi?: FlowBuilderWhitelabelCustomUi
+ disableAi?: boolean
+ disabledFlowInputs?: boolean
+ savedPrimarySchedule?: ScheduleTrigger | undefined // used to set the primary schedule in the legacy primaryScheduleStore
+ version?: number | undefined
+ setSavedraftCb?: ((cb: () => void) => void) | undefined
+ draftTriggersFromUrl?: Trigger[] | undefined
+ selectedTriggerIndexFromUrl?: number | undefined
+ children?: import('svelte').Snippet
+ loadedFromHistoryFromUrl?: {
+ flowJobInitial: boolean | undefined
+ stepsState: Record
+ }
+ noInitial?: boolean
+ onSaveInitial?: ({ path, id }: { path: string; id: string }) => void
+ onSaveDraft?: ({
+ path,
+ savedAtNewPath,
+ newFlow
+ }: {
+ path: string
+ savedAtNewPath: boolean
+ newFlow: boolean
+ }) => void
+ onSaveDraftError?: ({ error }: { error: any }) => void
+ onSaveDraftOnlyAtNewPath?: ({ path, selectedId }: { path: string; selectedId: string }) => void
+ onDeploy?: ({ path }: { path: string }) => void
+ onDeployError?: ({ error }: { error: any }) => void
+ onDetails?: ({ path }: { path: string }) => void
+ onHistoryRestore?: () => void
+}
diff --git a/frontend/src/lib/components/flows/CreateActionsFlow.svelte b/frontend/src/lib/components/flows/CreateActionsFlow.svelte
index 1671a84e5b..1a424641ad 100644
--- a/frontend/src/lib/components/flows/CreateActionsFlow.svelte
+++ b/frontend/src/lib/components/flows/CreateActionsFlow.svelte
@@ -6,7 +6,7 @@
import { Button } from '$lib/components/common'
import Drawer from '$lib/components/common/drawer/Drawer.svelte'
import DrawerContent from '$lib/components/common/drawer/DrawerContent.svelte'
- import { importFlowStore } from '$lib/components/flows/flowStore.svelte'
+ import { importFlowStore } from '$lib/components/flows/flowStore'
import { Loader2, Plus } from 'lucide-svelte'
import YAML from 'yaml'
diff --git a/frontend/src/lib/components/flows/FlowHistory.svelte b/frontend/src/lib/components/flows/FlowHistory.svelte
index 5349de4333..32b1a2af08 100644
--- a/frontend/src/lib/components/flows/FlowHistory.svelte
+++ b/frontend/src/lib/components/flows/FlowHistory.svelte
@@ -1,18 +1,20 @@
@@ -25,9 +27,9 @@
>
{
- drawer.closeDrawer()
- dispatch('historyRestore')
+ onHistoryRestore={() => {
+ drawer?.closeDrawer()
+ onHistoryRestore?.()
}}
{path}
/>
diff --git a/frontend/src/lib/components/flows/FlowHistoryInner.svelte b/frontend/src/lib/components/flows/FlowHistoryInner.svelte
index 296971c0f1..9e116e5244 100644
--- a/frontend/src/lib/components/flows/FlowHistoryInner.svelte
+++ b/frontend/src/lib/components/flows/FlowHistoryInner.svelte
@@ -1,4 +1,7 @@
@@ -85,7 +92,7 @@
{#if versions.length > 0}
{#each versions ?? [] as version}
-
+
{
+ onclick={() => {
selectedVersion = version
}}
>
@@ -124,10 +131,11 @@
type="text"
bind:value={deploymentMsgUpdate}
class="!w-auto grow"
- on:click|stopPropagation={() => {}}
- on:keydown|stopPropagation
- on:keypress|stopPropagation={({ key }) => {
- if (key === 'Enter') updateDeploymentMsg(selectedVersion?.id)
+ onclick={stopPropagation(() => {})}
+ onkeydown={stopPropagation(bubble('keydown'))}
+ onkeypress={(e) => {
+ e.stopPropagation()
+ if (e.key === 'Enter') updateDeploymentMsg(selectedVersion?.id)
}}
/>
{
+ onclick={() => {
deploymentMsgUpdate = selectedVersion?.deployment_msg
deploymentMsgUpdateMode = true
}}
diff --git a/frontend/src/lib/components/flows/common/FlowCardHeader.svelte b/frontend/src/lib/components/flows/common/FlowCardHeader.svelte
index 0a6419e21d..1fa16b2674 100644
--- a/frontend/src/lib/components/flows/common/FlowCardHeader.svelte
+++ b/frontend/src/lib/components/flows/common/FlowCardHeader.svelte
@@ -1,3 +1,12 @@
+
+
{title}
{/if}
-
+ {@render children?.()}
diff --git a/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte b/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte
index 566b2cddbf..463933e618 100644
--- a/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte
+++ b/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte
@@ -73,7 +73,7 @@
{#if $selectedId?.startsWith('settings')}
-
+
{:else if $selectedId === 'Input'}
{
+ $effect.pre(() => {
$selectedId && untrack(() => onSelectedIdChange())
})
$effect(() => {
@@ -296,6 +297,10 @@
}, 100)
}
})
+
+ let rawScriptLang = $derived(
+ flowModule.value.type == 'rawscript' ? flowModule.value.language : undefined
+ )
@@ -318,7 +323,7 @@
>
{#snippet header()}
{
console.log('tagChange', e.detail)
@@ -468,7 +473,8 @@
{#key forceReload}
dispatch('tagChange', e.detail)}
@@ -192,6 +194,9 @@
{#if module.value.type === 'rawscript'}
dispatch('tagChange', e.detail)}
/>
diff --git a/frontend/src/lib/components/flows/content/FlowModuleScript.svelte b/frontend/src/lib/components/flows/content/FlowModuleScript.svelte
index fcfdd4d72b..31d2e536e9 100644
--- a/frontend/src/lib/components/flows/content/FlowModuleScript.svelte
+++ b/frontend/src/lib/components/flows/content/FlowModuleScript.svelte
@@ -1,25 +1,92 @@
+
+
@@ -72,7 +135,7 @@
script not found at {path} in workspace {$workspaceStore}
{:else if showAllCode}
{#if showDiff}
- {#key previousCode + code}
+ {#key (previousCode ?? '') + (code ?? '')}
{#await import('$lib/components/DiffEditor.svelte')}
{:then Module}
@@ -94,7 +157,7 @@
-
Show all
+
Show all
{/if}
{#if lock}
diff --git a/frontend/src/lib/components/flows/content/FlowModuleWorkerTagSelect.svelte b/frontend/src/lib/components/flows/content/FlowModuleWorkerTagSelect.svelte
index 489837a2cb..21b689206c 100644
--- a/frontend/src/lib/components/flows/content/FlowModuleWorkerTagSelect.svelte
+++ b/frontend/src/lib/components/flows/content/FlowModuleWorkerTagSelect.svelte
@@ -5,9 +5,16 @@
import { WorkerService } from '$lib/gen'
import WorkerTagSelect from '$lib/components/WorkerTagSelect.svelte'
- let { tag = $bindable(), nullTag = $bindable() }: {
+ let {
+ tag = $bindable(),
+ nullTag,
+ placeholder,
+ noLabel
+ }: {
tag: string | undefined
nullTag?: string | undefined
+ placeholder?: string
+ noLabel?: boolean
} = $props()
const { flowStore, selectedId } = getContext
('FlowEditorContext')
@@ -26,7 +33,13 @@
{#if $workerTags?.length > 0}
{#if flowStore.val.tag == undefined}
-
dispatch('change', e.detail)} />
+ dispatch('change', e.detail)}
+ />
{:else}
('FlowEditorContext')
@@ -125,7 +126,7 @@
/>
- {#if flowStore.val.schema}
+ {#if flowStore.val.schema && enableAi}
(undefined)
-
-export async function initFlow(
- flow: Flow,
- flowStore: StateStore,
- flowStateStore: Writable
-) {
- await initFlowState(flow, flowStateStore)
- flowStore.val = flow
-}
-
-export async function copyFirstStepSchema(
- flowState: FlowState,
- flowStore: StateStore
-): Promise {
- const firstModuleId = flowStore.val.value.modules[0]?.id
-
- if (flowState[firstModuleId] && firstModuleId) {
- flowStore.val.schema = structuredClone($state.snapshot(flowState[firstModuleId].schema))
- const v = flowStore.val.value.modules[0].value
- if (v.type == 'rawscript' || v.type == 'script') {
- Object.keys(v.input_transforms ?? {}).forEach((key) => {
- v.input_transforms[key] = {
- type: 'javascript',
- expr: `flow_input.${key}`
- }
- })
- return
- }
- return sendUserToast('Only scripts can be used as a input schema', true)
- }
- return sendUserToast('No first step found', true)
-}
-
-export async function getFirstStepSchema(flowState: FlowState, flow: OpenFlow) {
- const firstModuleId = flow.value.modules[0]?.id
-
- if (!firstModuleId || !flowState[firstModuleId]) {
- throw new Error('no first step found')
- }
-
- const schema = structuredClone(flowState[firstModuleId].schema)
- const v = flow.value.modules[0].value
-
- if (v.type !== 'rawscript' && v.type !== 'script') {
- throw new Error('only scripts can be used as a input schema')
- }
-
- const simplifiedModule = {
- id: flow.value.modules[0].id,
- summary: flow.value.modules[0].summary,
- value: {
- type: flow.value.modules[0].value.type,
- ...('path' in flow.value.modules[0].value ? { path: flow.value.modules[0].value.path } : {}),
- ...('language' in flow.value.modules[0].value
- ? { language: flow.value.modules[0].value.language }
- : {})
- }
- }
-
- return {
- schema,
- mod: simplifiedModule,
- connectFirstNode: () => {
- Object.keys(v.input_transforms ?? {}).forEach((key) => {
- v.input_transforms[key] = {
- type: 'javascript',
- expr: `flow_input.${key}`
- }
- })
- }
- }
-}
-
-export function replaceId(expr: string, id: string, newId: string): string {
- return expr
- .replaceAll(`results.${id}`, `results.${newId}`)
- .replaceAll(`results?.${id}`, `results?.${newId}`)
-}
diff --git a/frontend/src/lib/components/flows/flowStore.ts b/frontend/src/lib/components/flows/flowStore.ts
index a429e77d4b..69d0667819 100644
--- a/frontend/src/lib/components/flows/flowStore.ts
+++ b/frontend/src/lib/components/flows/flowStore.ts
@@ -3,7 +3,6 @@ import { writable, type Writable } from 'svelte/store'
import { initFlowState, type FlowState } from './flowState'
import { sendUserToast } from '$lib/toast'
import type { StateStore } from '$lib/utils'
-import { stateSnapshot } from '$lib/svelte5Utils.svelte'
export type FlowMode = 'push' | 'pull'
@@ -18,39 +17,37 @@ export async function initFlow(
flowStore.val = flow
}
-export async function copyFirstStepSchema(flowState: FlowState, flowStore: Writable) {
- flowStore.update((flow) => {
- const firstModuleId = flow.value.modules[0]?.id
+export async function copyFirstStepSchema(
+ flowState: FlowState,
+ flowStore: StateStore
+): Promise {
+ const firstModuleId = flowStore.val.value.modules[0]?.id
- if (flowState[firstModuleId] && firstModuleId) {
- flow.schema = structuredClone(stateSnapshot(flowState[firstModuleId].schema))
- const v = flow.value.modules[0].value
- if (v.type == 'rawscript' || v.type == 'script') {
- Object.keys(v.input_transforms ?? {}).forEach((key) => {
- v.input_transforms[key] = {
- type: 'javascript',
- expr: `flow_input.${key}`
- }
- })
- return flow
- }
- sendUserToast('Only scripts can be used as a input schema', true)
- return flow
+ if (flowState[firstModuleId] && firstModuleId) {
+ flowStore.val.schema = structuredClone($state.snapshot(flowState[firstModuleId].schema))
+ const v = flowStore.val.value.modules[0].value
+ if (v.type == 'rawscript' || v.type == 'script') {
+ Object.keys(v.input_transforms ?? {}).forEach((key) => {
+ v.input_transforms[key] = {
+ type: 'javascript',
+ expr: `flow_input.${key}`
+ }
+ })
+ return
}
- sendUserToast('No first step found', true)
- return flow
- })
+ return sendUserToast('Only scripts can be used as a input schema', true)
+ }
+ return sendUserToast('No first step found', true)
}
-export async function getFirstStepSchema(flowState: FlowState, flowStore: StateStore) {
- const flow = flowStore.val
+export async function getFirstStepSchema(flowState: FlowState, flow: OpenFlow) {
const firstModuleId = flow.value.modules[0]?.id
if (!firstModuleId || !flowState[firstModuleId]) {
throw new Error('no first step found')
}
- const schema = structuredClone(stateSnapshot(flowState[firstModuleId].schema))
+ const schema = structuredClone(flowState[firstModuleId].schema)
const v = flow.value.modules[0].value
if (v.type !== 'rawscript' && v.type !== 'script') {
diff --git a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte
index 87e41fb1d8..356a1065c3 100644
--- a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte
+++ b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte
@@ -28,7 +28,7 @@
import { Drawer } from '$lib/components/common'
import DrawerContent from '$lib/components/common/drawer/DrawerContent.svelte'
import { getDependeeAndDependentComponents } from '../flowExplorer'
- import { replaceId } from '../flowStore.svelte'
+ import { replaceId } from '../flowStore'
import FlowModuleSchemaItemViewer from './FlowModuleSchemaItemViewer.svelte'
import type { PropPickerContext } from '$lib/components/prop_picker'
import OutputPicker from '$lib/components/flows/propPicker/OutputPicker.svelte'
diff --git a/frontend/src/lib/components/flows/map/FlowModuleSchemaMap.svelte b/frontend/src/lib/components/flows/map/FlowModuleSchemaMap.svelte
index 51b20ca3a4..9a1535c30b 100644
--- a/frontend/src/lib/components/flows/map/FlowModuleSchemaMap.svelte
+++ b/frontend/src/lib/components/flows/map/FlowModuleSchemaMap.svelte
@@ -28,7 +28,7 @@
import { ignoredTutorials } from '$lib/components/tutorials/ignoredTutorials'
import { tutorialInProgress } from '$lib/tutorialUtils'
import FlowGraphV2 from '$lib/components/graph/FlowGraphV2.svelte'
- import { replaceId } from '../flowStore.svelte'
+ import { replaceId } from '../flowStore'
import { setScheduledPollSchedule, type TriggerContext } from '$lib/components/triggers'
import type { PropPickerContext } from '$lib/components/prop_picker'
import { JobService } from '$lib/gen'
diff --git a/frontend/src/lib/components/graph/FlowGraphV2.svelte b/frontend/src/lib/components/graph/FlowGraphV2.svelte
index e7dc28d78d..f873e68056 100644
--- a/frontend/src/lib/components/graph/FlowGraphV2.svelte
+++ b/frontend/src/lib/components/graph/FlowGraphV2.svelte
@@ -315,8 +315,7 @@
let moduleCounter = $state(0)
function onModulesChange2(modules) {
if (!deepEqual(modules, lastModules)) {
- console.log('modules changed', modules)
- lastModules = structuredClone($state.snapshot(modules))
+ lastModules = $state.snapshot(modules)
moduleCounter++
}
}
diff --git a/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte b/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte
index 2f54226839..037d297a85 100644
--- a/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte
+++ b/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte
@@ -659,8 +659,8 @@
+ import type { EditableSchemaWrapperProps } from './editable_schema_wrapper'
+ import EditableSchemaWrapper from './EditableSchemaWrapper.svelte'
+
+ let {
+ schema: oldSchema,
+ ...props
+ }: EditableSchemaWrapperProps = $props()
+
+ let schema = $state(oldSchema)
+
+
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/schema/EditableSchemaWrapper.svelte b/frontend/src/lib/components/schema/EditableSchemaWrapper.svelte
index e355dd289f..1cb88b18d0 100644
--- a/frontend/src/lib/components/schema/EditableSchemaWrapper.svelte
+++ b/frontend/src/lib/components/schema/EditableSchemaWrapper.svelte
@@ -1,8 +1,6 @@
+
+
+
+
diff --git a/frontend/src/routes/test_dev/sdk_script/+page.svelte b/frontend/src/routes/test_dev/sdk_script/+page.svelte
new file mode 100644
index 0000000000..0d82c59bcf
--- /dev/null
+++ b/frontend/src/routes/test_dev/sdk_script/+page.svelte
@@ -0,0 +1,41 @@
+
+
+
diff --git a/frontend/src/routes/test_dev_page/+page.svelte b/frontend/src/routes/test_dev_page/+page.svelte
deleted file mode 100644
index 1c9b602ae9..0000000000
--- a/frontend/src/routes/test_dev_page/+page.svelte
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-
- {#each showWhiteLabelOptions as option}
- {option.label}
- {/each}
-
-
-