From 9f184ca4f21aeee0574fd98b1e1b860d29c1d0f5 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Mon, 3 Feb 2025 08:34:43 +0000 Subject: [PATCH 01/13] fix(frontend) : fix history input arg null (#5194) * fix null arg * fix badge height jump --- frontend/src/lib/components/SchemaFormWithArgPicker.svelte | 2 +- frontend/src/lib/components/schema/InputSelectedBadge.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/SchemaFormWithArgPicker.svelte b/frontend/src/lib/components/SchemaFormWithArgPicker.svelte index 29ec803557..040af5cd96 100644 --- a/frontend/src/lib/components/SchemaFormWithArgPicker.svelte +++ b/frontend/src/lib/components/SchemaFormWithArgPicker.svelte @@ -119,7 +119,7 @@ {runnableId} {runnableType} on:select={(e) => { - dispatch('select', { payload: e.detail.args, type: 'history' }) + dispatch('select', { payload: e.detail?.args, type: 'history' }) }} /> diff --git a/frontend/src/lib/components/schema/InputSelectedBadge.svelte b/frontend/src/lib/components/schema/InputSelectedBadge.svelte index fce85ccf5d..9538fffc95 100644 --- a/frontend/src/lib/components/schema/InputSelectedBadge.svelte +++ b/frontend/src/lib/components/schema/InputSelectedBadge.svelte @@ -7,7 +7,7 @@ export let inputSelected: 'history' | 'captures' | 'saved' | undefined = undefined -
+
Date: Mon, 3 Feb 2025 13:28:38 +0000 Subject: [PATCH 02/13] trigger panels new item is collapsed by default * fix null arg * fix badge height jump * Make new trigger collapsable * keep new trigger section open when using capture * fix spelling * remove animation * rename new trigger to + new * nit --- frontend/src/lib/components/Section.svelte | 22 +++-- .../details/EmailTriggerPanel.svelte | 1 + .../triggers/TriggersEditorSection.svelte | 97 ++++++++++--------- .../triggers/http/RoutesPanel.svelte | 80 ++++++++------- .../triggers/kafka/KafkaTriggersPanel.svelte | 67 ++++++------- .../triggers/nats/NatsTriggersPanel.svelte | 69 +++++++------ .../triggers/webhook/WebhooksPanel.svelte | 1 + .../websocket/WebsocketTriggersPanel.svelte | 73 +++++++------- 8 files changed, 206 insertions(+), 204 deletions(-) diff --git a/frontend/src/lib/components/Section.svelte b/frontend/src/lib/components/Section.svelte index f102c18fe6..d4babb09c1 100644 --- a/frontend/src/lib/components/Section.svelte +++ b/frontend/src/lib/components/Section.svelte @@ -1,8 +1,9 @@
@@ -27,11 +29,14 @@ > {#if collapsable} {:else} @@ -58,7 +63,10 @@
{/if} {#if !collapsable || !collapsed} -
+
{/if} diff --git a/frontend/src/lib/components/details/EmailTriggerPanel.svelte b/frontend/src/lib/components/details/EmailTriggerPanel.svelte index 9b31103702..3687c1e710 100644 --- a/frontend/src/lib/components/details/EmailTriggerPanel.svelte +++ b/frontend/src/lib/components/details/EmailTriggerPanel.svelte @@ -74,6 +74,7 @@ on:updateSchema on:testWithArgs {newItem} + alwaysOpened={true} /> {:else}
diff --git a/frontend/src/lib/components/triggers/TriggersEditorSection.svelte b/frontend/src/lib/components/triggers/TriggersEditorSection.svelte index 251f55b465..f684bf69a0 100644 --- a/frontend/src/lib/components/triggers/TriggersEditorSection.svelte +++ b/frontend/src/lib/components/triggers/TriggersEditorSection.svelte @@ -21,23 +21,26 @@ export let canHavePreprocessor: boolean = false export let hasPreprocessor: boolean = false export let newItem: boolean + export let openForm: boolean = false + export let alwaysOpened: boolean = false + export let showCapture: boolean = false const captureTypeLabels: Record = { - http: 'New custom HTTP route', - websocket: 'New WebSocket trigger', + http: '+ New custom HTTP route', + websocket: '+ New WebSocket trigger', webhook: 'Webhook', - kafka: 'New Kafka trigger', + kafka: '+ New Kafka trigger', email: 'Email trigger', - nats: 'NATS trigger' + nats: '+ New NATS trigger' } const { captureOn } = getContext('TriggerContext') let args: Record = {} + $: collapsed = !openForm const dispatch = createEventDispatcher() - let showCapture = false let init = false $: updateShowCapture(!!$captureOn) function updateShowCapture(show: boolean) { @@ -49,55 +52,57 @@ } -
+
-
- {#if isEditor} - - {/if} - - {#if !noSave} - {@const disabled = newItem || cloudDisabled} - + {#if !collapsed || alwaysOpened} +
+ {#if isEditor} - - {#if disabled} - {#if newItem} - Deploy the runnable to enable trigger creation - {:else if cloudDisabled} - {capitalize(triggerType)} triggers are disabled in the multi-tenant cloud + {/if} + + {#if !noSave} + {@const disabled = newItem || cloudDisabled} + + + + {#if disabled} + {#if newItem} + Deploy the runnable to enable trigger creation + {:else if cloudDisabled} + {capitalize(triggerType)} triggers are disabled in the multi-tenant cloud + {/if} + {:else} + Create new {captureTypeLabels[triggerType].toLowerCase()} {/if} - {:else} - Create new {captureTypeLabels[triggerType].toLowerCase()} - {/if} - - - {/if} -
+ +
+ {/if} +
+ {/if}
{#if isEditor} diff --git a/frontend/src/lib/components/triggers/http/RoutesPanel.svelte b/frontend/src/lib/components/triggers/http/RoutesPanel.svelte index b05d98f1d9..4c215022d4 100644 --- a/frontend/src/lib/components/triggers/http/RoutesPanel.svelte +++ b/frontend/src/lib/components/triggers/http/RoutesPanel.svelte @@ -5,7 +5,7 @@ import { canWrite } from '$lib/utils' import { getContext, onMount } from 'svelte' import Section from '$lib/components/Section.svelte' - import { Alert, Skeleton } from '$lib/components/common' + import { Alert } from '$lib/components/common' import Description from '$lib/components/Description.svelte' import type { TriggerContext } from '$lib/components/triggers' import TriggersEditorSection from '../TriggersEditorSection.svelte' @@ -19,6 +19,8 @@ export let args: Record = {} let routeEditor: RouteEditor + let openForm = true + let dontCloseOnLoad = false $: path && loadTriggers() const { triggersCount, selectedTrigger, defaultValues } = @@ -48,6 +50,7 @@ return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } }) $triggersCount = { ...($triggersCount ?? {}), http_routes_count: httpTriggers?.length } + openForm = httpTriggers?.length === 0 || dontCloseOnLoad } catch (e) { console.error('impossible to load http routes', e) } @@ -61,11 +64,42 @@ bind:this={routeEditor} /> -
+
Routes expose your scripts and flows as HTTP endpoints. Each route can be configured with a specific HTTP method and path. + {#if !newItem && httpTriggers && httpTriggers.length > 0} +
+ {#if !$userStore?.is_admin && !$userStore?.is_super_admin} + + {/if} + +
+ {#each httpTriggers as httpTriggers (httpTriggers.path)} +
+
{httpTriggers.path}
+
+ {httpTriggers.http_method.toUpperCase()} /{httpTriggers.route_path} +
+
+ +
+
+ {/each} +
+
+ {/if} + { routeEditor?.openNew(isFlow, path, e.detail.config) @@ -74,6 +108,7 @@ on:addPreprocessor on:updateSchema on:testWithArgs + bind:showCapture={dontCloseOnLoad} cloudDisabled={false} triggerType="http" {isFlow} @@ -83,43 +118,6 @@ {hasPreprocessor} {newItem} data={{ args }} + bind:openForm /> - {#if !newItem} -
- {#if !$userStore?.is_admin && !$userStore?.is_super_admin} - - {/if} - - {#if httpTriggers} - {#if httpTriggers.length == 0} -
No http routes
- {:else} -
- {#each httpTriggers as httpTriggers (httpTriggers.path)} -
-
{httpTriggers.path}
-
- {httpTriggers.http_method.toUpperCase()} /{httpTriggers.route_path} -
-
- -
-
- {/each} -
- {/if} - {:else} - - {/if} -
- {/if} -
\ No newline at end of file +
diff --git a/frontend/src/lib/components/triggers/kafka/KafkaTriggersPanel.svelte b/frontend/src/lib/components/triggers/kafka/KafkaTriggersPanel.svelte index 5e710676d1..364a976921 100644 --- a/frontend/src/lib/components/triggers/kafka/KafkaTriggersPanel.svelte +++ b/frontend/src/lib/components/triggers/kafka/KafkaTriggersPanel.svelte @@ -6,7 +6,6 @@ import KafkaTriggerEditor from './KafkaTriggerEditor.svelte' import { isCloudHosted } from '$lib/cloud' import Section from '$lib/components/Section.svelte' - import Skeleton from '$lib/components/common/skeleton/Skeleton.svelte' import Description from '$lib/components/Description.svelte' import { Alert } from '$lib/components/common' import type { TriggerContext } from '$lib/components/triggers' @@ -20,6 +19,8 @@ export let hasPreprocessor: boolean = false let kafkaTriggerEditor: KafkaTriggerEditor + let openForm = true + let dontCloseOnLoad = false $: path && loadTriggers() @@ -50,6 +51,7 @@ return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } }) $triggersCount = { ...($triggersCount ?? {}), kafka_count: kafkaTriggers?.length } + openForm = kafkaTriggers?.length === 0 || dontCloseOnLoad } catch (e) { console.error('impossible to load Kafka triggers', e) } @@ -85,6 +87,32 @@ Kafka triggers execute scripts and flows in response to messages published to Kafka topics. + {#if !newItem && kafkaTriggers && kafkaTriggers.length > 0} +
+
+ {#each kafkaTriggers as kafkaTrigger (kafkaTrigger.path)} +
+
{kafkaTrigger.path}
+
+ {kafkaTrigger.kafka_resource_path} +
+
+ +
+
+ {/each} +
+
+ {/if} { saveTrigger(path, e.detail.config) @@ -102,41 +130,8 @@ {canHavePreprocessor} {hasPreprocessor} {newItem} + {openForm} + bind:showCapture={dontCloseOnLoad} /> - - {#if !newItem} - {#if kafkaTriggers} -
- {#if kafkaTriggers.length == 0} -
No Kafka triggers
- {:else} -
- {#each kafkaTriggers as kafkaTrigger (kafkaTrigger.path)} -
-
{kafkaTrigger.path}
-
- {kafkaTrigger.kafka_resource_path} -
-
- -
-
- {/each} -
- {/if} -
- {:else} - - {/if} - {/if}
{/if} diff --git a/frontend/src/lib/components/triggers/nats/NatsTriggersPanel.svelte b/frontend/src/lib/components/triggers/nats/NatsTriggersPanel.svelte index c7950ebacc..12cd385e3a 100644 --- a/frontend/src/lib/components/triggers/nats/NatsTriggersPanel.svelte +++ b/frontend/src/lib/components/triggers/nats/NatsTriggersPanel.svelte @@ -6,7 +6,6 @@ import NatsTriggerEditor from './NatsTriggerEditor.svelte' import { isCloudHosted } from '$lib/cloud' import Section from '$lib/components/Section.svelte' - import Skeleton from '$lib/components/common/skeleton/Skeleton.svelte' import Alert from '$lib/components/common/alert/Alert.svelte' import Description from '$lib/components/Description.svelte' import type { TriggerContext } from '$lib/components/triggers' @@ -20,6 +19,8 @@ export let hasPreprocessor: boolean = false let natsTriggerEditor: NatsTriggerEditor + let openForm = true + let dontCloseOnLoad = false $: path && loadTriggers() @@ -50,6 +51,7 @@ return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } }) $triggersCount = { ...($triggersCount ?? {}), nats_count: natsTriggers?.length } + openForm = natsTriggers?.length === 0 || dontCloseOnLoad } catch (e) { console.error('impossible to load nats triggers', e) } @@ -85,6 +87,34 @@ NATS triggers execute scripts and flows in response to messages published to NATS subjects. + + {#if !newItem && natsTriggers && natsTriggers.length > 0} +
+
+ {#each natsTriggers as natsTrigger (natsTrigger.path)} +
+
{natsTrigger.path}
+
+ {natsTrigger.nats_resource_path} +
+
+ +
+
+ {/each} +
+
+ {/if} + { saveTrigger(path, e.detail.config) @@ -100,41 +130,8 @@ {canHavePreprocessor} {hasPreprocessor} {newItem} + {openForm} + bind:showCapture={dontCloseOnLoad} /> - - {#if !newItem} - {#if natsTriggers} -
- {#if natsTriggers.length == 0} -
No nats triggers
- {:else} -
- {#each natsTriggers as natsTrigger (natsTrigger.path)} -
-
{natsTrigger.path}
-
- {natsTrigger.nats_resource_path} -
-
- -
-
- {/each} -
- {/if} -
- {:else} - - {/if} - {/if}
{/if} diff --git a/frontend/src/lib/components/triggers/webhook/WebhooksPanel.svelte b/frontend/src/lib/components/triggers/webhook/WebhooksPanel.svelte index 948624646b..485a433e97 100644 --- a/frontend/src/lib/components/triggers/webhook/WebhooksPanel.svelte +++ b/frontend/src/lib/components/triggers/webhook/WebhooksPanel.svelte @@ -53,5 +53,6 @@ {canHavePreprocessor} {hasPreprocessor} {newItem} + alwaysOpened={true} />
diff --git a/frontend/src/lib/components/triggers/websocket/WebsocketTriggersPanel.svelte b/frontend/src/lib/components/triggers/websocket/WebsocketTriggersPanel.svelte index 7b633a1262..12142f8343 100644 --- a/frontend/src/lib/components/triggers/websocket/WebsocketTriggersPanel.svelte +++ b/frontend/src/lib/components/triggers/websocket/WebsocketTriggersPanel.svelte @@ -7,7 +7,7 @@ import WebsocketTriggerEditor from './WebsocketTriggerEditor.svelte' import { isCloudHosted } from '$lib/cloud' import Section from '$lib/components/Section.svelte' - import { Alert, Skeleton } from '$lib/components/common' + import { Alert } from '$lib/components/common' import Description from '$lib/components/Description.svelte' import type { TriggerContext } from '$lib/components/triggers' import TriggersEditorSection from '../TriggersEditorSection.svelte' @@ -19,6 +19,8 @@ export let hasPreprocessor: boolean = false let wsTriggerEditor: WebsocketTriggerEditor + let openForm = true + let dontCloseOnLoad = false $: path && loadTriggers() @@ -49,6 +51,7 @@ return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } }) $triggersCount = { ...($triggersCount ?? {}), websocket_count: wsTriggers?.length } + openForm = wsTriggers?.length === 0 || dontCloseOnLoad } catch (e) { console.error('impossible to load WS triggers', e) } @@ -72,6 +75,36 @@ WebSocket triggers allow real-time bidirectional communication between your scripts/flows and external systems. Each trigger creates a unique WebSocket endpoint. + + {#if !newItem && wsTriggers && wsTriggers.length > 0} +
+
+
+ {#each wsTriggers as wsTriggers (wsTriggers.path)} +
+
{wsTriggers.path}
+
+ {wsTriggers.url} +
+
+ +
+
+ {/each} +
+
+
+ {/if} + { @@ -88,43 +121,7 @@ {canHavePreprocessor} {hasPreprocessor} {newItem} + {openForm} /> - - {#if !newItem} -
-
- {#if wsTriggers} - {#if wsTriggers.length == 0} -
No WebSocket triggers
- {:else} -
- {#each wsTriggers as wsTriggers (wsTriggers.path)} -
-
{wsTriggers.path}
-
- {wsTriggers.url} -
-
- -
-
- {/each} -
- {/if} - {:else} - - {/if} -
-
- {/if}
{/if} From fd0cd587bbe8f453893ae600ae553ee74eb1ba04 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 3 Feb 2025 19:11:19 +0100 Subject: [PATCH 03/13] fix: timeout on list_user_usage after 300s --- backend/windmill-api/src/users.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/backend/windmill-api/src/users.rs b/backend/windmill-api/src/users.rs index b603259664..c0159480e7 100644 --- a/backend/windmill-api/src/users.rs +++ b/backend/windmill-api/src/users.rs @@ -10,6 +10,7 @@ use std::sync::atomic::AtomicBool; use std::sync::Arc; +use std::time::Duration; use crate::db::ApiAuthed; @@ -464,9 +465,11 @@ async fn list_user_usage( require_admin(authed.is_admin, &authed.username)?; } let mut tx = user_db.begin(&authed).await?; - let rows = sqlx::query_as!( - UserWithUsage, - " + let rows = tokio::time::timeout( + Duration::from_secs(300), + sqlx::query_as!( + UserWithUsage, + " SELECT usr.email, usage.executions FROM usr , LATERAL ( @@ -479,10 +482,12 @@ async fn list_user_usage( ) usage WHERE workspace_id = $1 ", - w_id + w_id + ) + .fetch_all(&mut *tx), ) - .fetch_all(&mut *tx) - .await?; + .await + .map_err(|e| Error::InternalErr(format!("Timed out while fetching user usage: {e:#}")))??; tx.commit().await?; Ok(Json(rows)) } From 0e80775d6d2bd1931fed6d5a1d63fc2e70980d55 Mon Sep 17 00:00:00 2001 From: pyranota <92104930+pyranota@users.noreply.github.com> Date: Mon, 3 Feb 2025 21:31:55 +0300 Subject: [PATCH 04/13] feat(python): make S3 cache arch specific (#5196) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add .minio-data to .gitignore * feat(python): make S3 cache arch specific Current schema: S3-Bucket ├── python_311 │   ├── wheel==1.0 │   └── wheel2==1.0 └── python_312 ├── wheel==1.0 └── wheel2==1.0 New schema: S3-Bucket ├── linux_aarch64 │ └── ... └── linux_x86_64 ├── python_311 │   ├── wheel==1.0 │   └── wheel2==1.0 └── python_312 ├── wheel==1.0 └── wheel2==1.0 * remove .minio-data from .gitignore * remove unneeded tracing::error --- .gitignore | 2 +- backend/windmill-worker/src/global_cache.rs | 7 +++++-- backend/windmill-worker/src/python_executor.rs | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 27885185f1..3e6c2f3a75 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ CaddyfileRemoteMalo *.swp **/.idea/ .direnv -.vscode \ No newline at end of file +.vscode diff --git a/backend/windmill-worker/src/global_cache.rs b/backend/windmill-worker/src/global_cache.rs index 57ded13ee7..8239ab77d4 100644 --- a/backend/windmill-worker/src/global_cache.rs +++ b/backend/windmill-worker/src/global_cache.rs @@ -13,6 +13,9 @@ use windmill_common::error; #[cfg(all(feature = "enterprise", feature = "parquet", unix))] use std::sync::Arc; +#[cfg(all(feature = "enterprise", feature = "parquet"))] +pub const TARGET: &str = const_format::concatcp!(std::env::consts::OS, "_", std::env::consts::ARCH); + #[cfg(all(feature = "enterprise", feature = "parquet", unix))] pub async fn build_tar_and_push( s3_client: Arc, @@ -57,7 +60,7 @@ pub async fn build_tar_and_push( if let Err(e) = s3_client .put( &Path::from(format!( - "/tar/{}/{folder_name}.tar", + "/tar/{TARGET}/{}/{folder_name}.tar", if no_uv { "pip" } else { &python_xyz } )), std::fs::read(&tar_path)?.into(), @@ -100,7 +103,7 @@ pub async fn pull_from_tar( let start = Instant::now(); let tar_path = format!( - "tar/{}/{folder_name}.tar", + "tar/{TARGET}/{}/{folder_name}.tar", if no_uv { "pip".to_owned() } else { python_xyz } ); let bytes = attempt_fetch_bytes(client, &tar_path).await?; diff --git a/backend/windmill-worker/src/python_executor.rs b/backend/windmill-worker/src/python_executor.rs index 8c134166a0..a48e1cb396 100644 --- a/backend/windmill-worker/src/python_executor.rs +++ b/backend/windmill-worker/src/python_executor.rs @@ -632,7 +632,7 @@ pub async fn uv_pip_compile( if *NATIVE_CERT { args.extend(["--native-tls"]); } - tracing::error!("uv args: {:?}", args); + tracing::debug!("uv args: {:?}", args); #[cfg(windows)] let uv_cmd = "uv"; From 76afbc3df33ec87aff47b0db8c57e64209f8f613 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 4 Feb 2025 01:09:11 +0100 Subject: [PATCH 05/13] fix: support specialization of list of strings to list of enums --- frontend/src/lib/components/ArgInput.svelte | 2 + .../lib/components/ArrayTypeNarrowing.svelte | 65 ++++++++++--------- .../components/schema/PropertyEditor.svelte | 6 +- frontend/src/lib/inferArgSig.ts | 41 +++++++----- 4 files changed, 67 insertions(+), 47 deletions(-) diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index 5ebb4b6cc2..f5b6eeda27 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -489,6 +489,7 @@
-{#if canEditResourceType} +{#if canEditResourceType || originalType == 'string[]' || originalType == 'object[]'} {:else if itemsType?.resourceType} @@ -121,31 +124,33 @@
{/each}
-
- - -
+ {#if canEditResourceType || originalType == 'string[]'} +
+ + +
+ {/if} {/if} diff --git a/frontend/src/lib/components/schema/PropertyEditor.svelte b/frontend/src/lib/components/schema/PropertyEditor.svelte index 5acf1d7ef4..f9e479a9ff 100644 --- a/frontend/src/lib/components/schema/PropertyEditor.svelte +++ b/frontend/src/lib/components/schema/PropertyEditor.svelte @@ -160,7 +160,11 @@ {#if type == 'array'} - + {:else if type == 'string' || ['number', 'integer', 'object'].includes(type ?? '')}
{/each} - {#if canEditResourceType || originalType == 'string[]'} + {#if canEditResourceType || originalType == 'string[]' || originalType == 'object[]'}
+ {#if apiKey} + Test key + {:else} + Test + {/if} + diff --git a/frontend/src/lib/components/copilot/completion.ts b/frontend/src/lib/components/copilot/completion.ts index b30a3fe7e0..01c90035c6 100644 --- a/frontend/src/lib/components/copilot/completion.ts +++ b/frontend/src/lib/components/copilot/completion.ts @@ -1,6 +1,7 @@ -import type { ChatCompletionMessageParam } from 'openai/resources/chat/index.mjs' -import { getNonStreamingCompletion, type AiProviderTypes } from './lib' +import type { AIProvider } from '$lib/gen' import { codeCompletionLoading } from '$lib/stores' +import type { ChatCompletionMessageParam } from 'openai/resources/chat/index.mjs' +import { getNonStreamingCompletion } from './lib' const systemPrompt = `You are a code completion assistant, return the code that should go instead of the . @@ -74,7 +75,7 @@ export async function editorCodeCompletion( after: string, lang: string, abortController: AbortController, - aiProvider: AiProviderTypes + aiProvider: AIProvider ) { codeCompletionLoading.set(true) const messages: ChatCompletionMessageParam[] = [ diff --git a/frontend/src/lib/components/copilot/flow.ts b/frontend/src/lib/components/copilot/flow.ts index 7867a2f2d5..1c5f8685bd 100644 --- a/frontend/src/lib/components/copilot/flow.ts +++ b/frontend/src/lib/components/copilot/flow.ts @@ -1,21 +1,17 @@ import { - type FlowModule, ScriptService, - type RawScript, - type PathScript, + type AIProvider, + type FlowModule, type InputTransform, + type PathScript, + type RawScript, type Script } from '$lib/gen' -import { - addResourceTypes, - deltaCodeCompletion, - getNonStreamingCompletion, - type AiProviderTypes -} from './lib' +import { scriptLangToEditorLang } from '$lib/scripts' import type { Writable } from 'svelte/store' import type Editor from '../Editor.svelte' import type { Drawer } from '../common' -import { scriptLangToEditorLang } from '$lib/scripts' +import { addResourceTypes, deltaCodeCompletion, getNonStreamingCompletion } from './lib' export type FlowCopilotModule = { id: string @@ -259,7 +255,7 @@ export async function stepCopilot( | undefined, isFirstInLoop: boolean, abortController: AbortController, - aiProvider: AiProviderTypes + aiProvider: AIProvider ) { if (module.source !== 'custom') { throw new Error('Not a custom module') @@ -328,7 +324,7 @@ export async function glueCopilot( }, isFirstInLoop: boolean, abortController: AbortController, - aiProvider: AiProviderTypes + aiProvider: AIProvider ) { const { prevCode, prevLang } = await getPreviousStepContent(pastModule, workspace) diff --git a/frontend/src/lib/components/copilot/lib.ts b/frontend/src/lib/components/copilot/lib.ts index fe7028dc1e..69d5ac9b7d 100644 --- a/frontend/src/lib/components/copilot/lib.ts +++ b/frontend/src/lib/components/copilot/lib.ts @@ -1,56 +1,130 @@ -import { OpenAI } from 'openai' -import { OpenAPI, ResourceService, type Script } from '../../gen' -import type { Writable } from 'svelte/store' +import type { AIProvider } from '$lib/gen' +import { + copilotInfo, + copilotSessionModel, + type DBSchema, + type GraphqlSchema, + type SQLSchema +} from '$lib/stores' import { Anthropic } from '@anthropic-ai/sdk' -import type { DBSchema, GraphqlSchema, SQLSchema } from '$lib/stores' -import { formatResourceTypes } from './utils' -import { EDIT_CONFIG, FIX_CONFIG, GEN_CONFIG } from './prompts' import { Mistral } from '@mistralai/mistralai' import { buildClientSchema, printSchema } from 'graphql' +import { OpenAI } from 'openai' import type { ChatCompletionCreateParamsStreaming, ChatCompletionMessageParam } from 'openai/resources/index.mjs' +import { get, type Writable } from 'svelte/store' +import { OpenAPI, ResourceService, type Script } from '../../gen' +import { EDIT_CONFIG, FIX_CONFIG, GEN_CONFIG } from './prompts' +import { formatResourceTypes } from './utils' import type { MessageCreateParams, MessageParam } from '@anthropic-ai/sdk/resources/messages.mjs' -import type { ChatCompletionRequest } from '@mistralai/mistralai/models/components/chatcompletionrequest' import type { - SystemMessage, - UserMessage, AssistantMessage, - ToolMessage, CompletionEvent, - ContentChunk + ContentChunk, + SystemMessage, + ToolMessage, + UserMessage } from '@mistralai/mistralai/models/components' +import type { ChatCompletionRequest } from '@mistralai/mistralai/models/components/chatcompletionrequest' export const SUPPORTED_LANGUAGES = new Set(Object.keys(GEN_CONFIG.prompts)) -export type AiProviderTypes = 'openai' | 'anthropic' | 'mistral' - -interface AiProvider { - init: (workspace: string, updateClient: boolean, token?: string) => void +export const AI_DEFAULT_MODELS: Record = { + openai: ['gpt-4o', 'gpt-4o-mini'], + anthropic: ['claude-3-5-sonnet-latest', 'claude-3-5-haiku-latest'], + mistral: ['codestral-latest'], + deepseek: ['deepseek-chat', 'deepseek-reasoner'], + groq: ['llama-3.3-70b-versatile', 'llama-3.1-8b-instant'], + openrouter: ['meta-llama/llama-3.2-3b-instruct:free'], + customai: [] } -class WorkspacedMistral implements AiProvider { - private client: Mistral | undefined +export const OPENAI_COMPATIBLE_BASE_URLS = { + groq: 'https://api.groq.com/openai/v1', + openrouter: 'https://openrouter.ai/api/v1', + deepseek: 'https://api.deepseek.com/v1' +} as const - init(workspace: string, updateClient: boolean, token?: string) { - if (!this.client || updateClient) { - this.client = initWorkspaceAiProvider(workspace, 'mistral', token) as unknown as Mistral - } +class WorkspacedAIClients { + private openaiClient: OpenAI | undefined + private anthropicClient: Anthropic | undefined + private mistralClient: Mistral | undefined + + init(workspace: string) { + this.initOpenai(workspace) + this.initAnthropic(workspace) + this.initMistral(workspace) } - getClient() { - if (!this.client) { - throw new Error('AnthropicAi not initialized') + private getBaseURL(workspace: string) { + return `${location.origin}${OpenAPI.BASE}/w/${workspace}/ai/proxy` + } + + private initOpenai(workspace: string) { + const baseURL = this.getBaseURL(workspace) + this.openaiClient = new OpenAI({ + baseURL, + apiKey: 'fake-key', + defaultHeaders: { + Authorization: '' // a non empty string will be unable to access Windmill backend proxy + }, + dangerouslyAllowBrowser: true + }) + } + + private initAnthropic(workspace: string) { + const baseURL = this.getBaseURL(workspace) + this.anthropicClient = new Anthropic({ + baseURL, + apiKey: 'fake-key', + dangerouslyAllowBrowser: true + }) + } + + private initMistral(workspace: string) { + const baseURL = this.getBaseURL(workspace) + this.mistralClient = new Mistral({ + serverURL: baseURL + }) + } + + getOpenaiClient() { + if (!this.openaiClient) { + throw new Error('OpenAI not initialized') } - return this.client + return this.openaiClient + } + + getAnthropicClient() { + if (!this.anthropicClient) { + throw new Error('Anthropic not initialized') + } + return this.anthropicClient + } + + getMistralClient() { + if (!this.mistralClient) { + throw new Error('Mistral not initialized') + } + return this.mistralClient } } -export namespace MistralAi { - export let workspace = new WorkspacedMistral() +export const workspaceAIClients = new WorkspacedAIClients() +const DEFAULT_COMPLETION_CONFIG: ChatCompletionCreateParamsStreaming = { + model: '', + max_tokens: 8000, //TODO: make this dynamic + temperature: 0, + seed: 42, + stream: true, + messages: [] +} + +namespace MistralAI { export const mistralConfig: ChatCompletionRequest = { temperature: 0, model: null, @@ -78,30 +152,11 @@ export namespace MistralAi { } } -class WorkspacedAnthropic implements AiProvider { - private client: Anthropic | undefined - - init(workspace: string, updateClient: boolean, token: string | undefined = undefined) { - if (!this.client || updateClient) { - this.client = initWorkspaceAiProvider(workspace, 'anthropic', token) as unknown as Anthropic - } - } - - getClient() { - if (!this.client) { - throw new Error('AnthropicAi not initialized') - } - return this.client - } -} - -export namespace AnthropicAi { - export let workspace = new WorkspacedAnthropic() - +export namespace AnthropicAI { export const config: MessageCreateParams = { temperature: 0, max_tokens: 8192, - model: 'claude-3-5-sonnet-20241022', + model: '', messages: [] } @@ -135,30 +190,11 @@ export namespace AnthropicAi { } } -class WorkspacedOpenai implements AiProvider { - private client: OpenAI | undefined - - init(workspace: string, updateClient: boolean, token: string | undefined = undefined) { - if (!this.client || updateClient) { - this.client = initWorkspaceAiProvider(workspace, 'openai', token) as unknown as OpenAI - } - } - - getClient() { - if (!this.client) { - throw new Error('OpenAI not initialized') - } - return this.client - } -} - -export namespace OpenAi { - export let workspace = new WorkspacedOpenai() - +namespace OpenAi { export const openaiConfig: ChatCompletionCreateParamsStreaming = { temperature: 0, max_tokens: 16384, - model: 'gpt-4o-2024-08-06', + model: '', seed: 42, stream: true, messages: [] @@ -169,125 +205,38 @@ export namespace OpenAi { } } -export function initAllAiWorkspace(workspace: string, updateClient: boolean = false) { - OpenAi.workspace.init(workspace, updateClient) - AnthropicAi.workspace.init(workspace, updateClient) - MistralAi.workspace.init(workspace, updateClient) -} - -function initWorkspaceAiProvider( - workspace: string, - aiProvider: AiProviderTypes, - token: string | undefined = undefined -): Anthropic | OpenAI | Mistral { - const baseURL = `${location.origin}${OpenAPI.BASE}/w/${workspace}/ai/proxy` - let client - switch (aiProvider) { - case 'openai': { - client = new OpenAI({ - baseURL, - apiKey: 'fake-key', - defaultHeaders: { - Authorization: token ? `Bearer ${token}` : '' - }, - dangerouslyAllowBrowser: true - }) - break - } - case 'anthropic': { - client = new Anthropic({ - baseURL, - apiKey: 'fake-key', - defaultHeaders: { - Authorization: token ? `Bearer ${token}` : '' - }, - dangerouslyAllowBrowser: true - }) - break - } - case 'mistral': { - client = new Mistral({ - serverURL: baseURL - }) - } - } - return client -} - export async function testKey({ apiKey, + resourcePath, + model, abortController, messages, aiProvider }: { apiKey?: string + resourcePath?: string + model: string | undefined messages: ChatCompletionMessageParam[] abortController: AbortController - aiProvider: AiProviderTypes + aiProvider: AIProvider }) { - if (apiKey) { - switch (aiProvider) { - case 'openai': { - const openai = new OpenAI({ - apiKey, - dangerouslyAllowBrowser: true - }) - await openai.chat.completions.create( - { - ...OpenAi.openaiConfig, - messages, - stream: false - }, - { - signal: abortController.signal - } - ) - break - } - case 'anthropic': { - const anthropic = new Anthropic({ - apiKey, - dangerouslyAllowBrowser: true - }) - const [, anthropicMessages] = AnthropicAi.getSystemPromptAndArrayMessages(messages) - await anthropic.messages.create( - { - ...AnthropicAi.config, - messages: anthropicMessages, - stream: false - }, - { - signal: abortController.signal - } - ) - break - } - case 'mistral': { - const mistral = new Mistral({ - apiKey - }) - await mistral.chat.complete( - { - ...MistralAi.mistralConfig, - model: 'codestral-latest', - stream: false, - messages: messages as MistralAi.MistralParamsMessage[] - }, - { - fetchOptions: { - signal: abortController.signal, - headers: { - 'content-type': 'application/json' - } - } - } - ) - break - } - } - } else { - await getNonStreamingCompletion(messages, abortController, aiProvider, undefined, true) + if (!apiKey && !resourcePath) { + throw new Error('API key or resource path is required') } + const modelToTest = model ?? AI_DEFAULT_MODELS[aiProvider][0] + + if (!modelToTest) { + throw new Error('Missing a model to test') + } + + await getNonStreamingCompletion( + messages, + abortController, + aiProvider, + apiKey, + resourcePath, + modelToTest + ) } interface BaseOptions { @@ -410,7 +359,9 @@ function addDBSChema(scriptOptions: CopilotOptions, prompt: string) { const { dbSchema, language } = scriptOptions if ( dbSchema && - ['postgresql', 'mysql', 'snowflake', 'bigquery', 'mssql', 'graphql', 'oracledb'].includes(language) && // make sure we are using a SQL/query language + ['postgresql', 'mysql', 'snowflake', 'bigquery', 'mssql', 'graphql', 'oracledb'].includes( + language + ) && // make sure we are using a SQL/query language language === dbSchema.lang // make sure we are using the same language as the schema ) { let { stringified } = dbSchema @@ -467,66 +418,109 @@ const PROMPTS_CONFIGS = { export async function getNonStreamingCompletion( messages: ChatCompletionMessageParam[], abortController: AbortController, - aiProvider: AiProviderTypes, - model = OpenAi.openaiConfig.model, - noCache?: boolean + aiProvider: AIProvider, + apiKey?: string, // testing API KEY directly from the frontend + resourcePath?: string, // testing resource path passed as a header to the backend proxy + forceModel?: string ) { let response: string | undefined = '' - const queryOptions = { - query: { - no_cache: noCache - }, + let model = forceModel + + if (!model) { + model = get(copilotSessionModel) + let info = get(copilotInfo) + const { ai_models: aiModels } = info + + if (!model || !aiModels.includes(model)) { + console.warn('Invalid model, using default model:', aiModels[0]) + model = aiModels[0] + } + } + + if (!model) { + throw new Error('No model found') + } + + const fetchOptions: { + signal: AbortSignal + headers?: Record + } = { signal: abortController.signal } - switch (aiProvider) { - case 'openai': { - const openaiClient = OpenAi.workspace.getClient() - const completion = await openaiClient.chat.completions.create( - { - ...OpenAi.openaiConfig, - messages, - stream: false, - model - }, - queryOptions - ) - response = completion.choices[0]?.message.content || '' - break + if (resourcePath) { + fetchOptions.headers = { + 'X-Resource-Path': resourcePath } + } + switch (aiProvider) { case 'anthropic': { - const anthropicClient = AnthropicAi.workspace.getClient() - const [system, anthropicMessages] = AnthropicAi.getSystemPromptAndArrayMessages(messages) + const anthropicClient = apiKey + ? new Anthropic({ + apiKey, + dangerouslyAllowBrowser: true + }) + : workspaceAIClients.getAnthropicClient() + const [system, anthropicMessages] = AnthropicAI.getSystemPromptAndArrayMessages(messages) const message = await anthropicClient.messages.create( { - ...AnthropicAi.config, + ...AnthropicAI.config, system, + model, messages: anthropicMessages, stream: false }, - queryOptions + fetchOptions ) response = message.content[0].type === 'text' ? message.content[0].text : '' break } case 'mistral': { - const mistralClient = MistralAi.workspace.getClient() + const mistralClient = apiKey + ? new Mistral({ + apiKey + }) + : workspaceAIClients.getMistralClient() const message = await mistralClient.chat.complete( { - ...MistralAi.mistralConfig, - model: 'codestral-latest', + ...MistralAI.mistralConfig, + model, stream: false, - messages: messages as MistralAi.MistralParamsMessage[] + messages: messages as MistralAI.MistralParamsMessage[] }, { - fetchOptions: { - signal: abortController.signal, - cache: 'no-store' - } + fetchOptions: fetchOptions } ) - response = MistralAi.retrieveTextValue(message.choices && message.choices[0].message.content) + response = MistralAI.retrieveTextValue(message.choices && message.choices[0].message.content) break } + default: { + if (aiProvider === 'customai' && apiKey) { + throw new Error('Cannot test API key for Custom AI, only resource path is supported') + } + const baseURL = OPENAI_COMPATIBLE_BASE_URLS[aiProvider] + + if (apiKey && aiProvider !== 'openai' && !baseURL) { + throw new Error('No base URL for this provider: ' + aiProvider) + } + const openaiClient = apiKey + ? new OpenAI({ + apiKey, + baseURL, + dangerouslyAllowBrowser: true + }) + : workspaceAIClients.getOpenaiClient() + const completion = await openaiClient.chat.completions.create( + { + ...(aiProvider === 'openai' ? OpenAi.openaiConfig : DEFAULT_COMPLETION_CONFIG), + messages, + model, + stream: false + }, + fetchOptions + ) + response = completion.choices[0]?.message.content || '' + } } return response } @@ -534,17 +528,30 @@ export async function getNonStreamingCompletion( export async function getCompletion( messages: ChatCompletionMessageParam[], abortController: AbortController, - aiProvider: AiProviderTypes, - model = OpenAi.openaiConfig.model + aiProvider: AIProvider ) { + let model = get(copilotSessionModel) + let info = get(copilotInfo) + const { ai_models: aiModels } = info + + if (!model || !aiModels.includes(model)) { + console.warn('Invalid model, using default model:', aiModels[0]) + model = aiModels[0] + } + + if (!model) { + throw new Error('No model found') + } + switch (aiProvider) { case 'anthropic': { - const anthropicClient = AnthropicAi.workspace.getClient() - const [system, anthropicMessages] = AnthropicAi.getSystemPromptAndArrayMessages(messages) + const anthropicClient = workspaceAIClients.getAnthropicClient() + const [system, anthropicMessages] = AnthropicAI.getSystemPromptAndArrayMessages(messages) const completion = await anthropicClient.messages.create( { - ...AnthropicAi.config, + ...AnthropicAI.config, + model, system, messages: anthropicMessages, stream: true @@ -553,13 +560,29 @@ export async function getCompletion( ) return completion } - case 'openai': { - const openaiClient = OpenAi.workspace.getClient() + case 'mistral': { + const mistralClient = workspaceAIClients.getMistralClient() + const message = await mistralClient.chat.stream( + { + ...MistralAI.mistralConfig, + model, + messages: messages as MistralAI.MistralParamsMessage[] + }, + { + fetchOptions: { + signal: abortController.signal + } + } + ) + return message + } + default: { + const openaiClient = workspaceAIClients.getOpenaiClient() const completion = await openaiClient.chat.completions.create( { - ...OpenAi.openaiConfig, - messages, - model + ...(aiProvider === 'openai' ? OpenAi.openaiConfig : DEFAULT_COMPLETION_CONFIG), + model, + messages }, { signal: abortController.signal @@ -567,23 +590,6 @@ export async function getCompletion( ) return completion } - case 'mistral': { - const mistralClient = MistralAi.workspace.getClient() - const message = await mistralClient.chat.stream( - { - ...MistralAi.mistralConfig, - model: 'codestral-latest', - messages: messages as MistralAi.MistralParamsMessage[] - }, - { - fetchOptions: { - signal: abortController.signal, - cache: 'no-store' - } - } - ) - return message - } } } @@ -592,21 +598,20 @@ export function getResponseFromEvent( | Anthropic.Messages.RawMessageStreamEvent | OpenAI.Chat.Completions.ChatCompletionChunk | CompletionEvent, - aiProvider: AiProviderTypes + aiProvider: AIProvider ): string { switch (aiProvider) { - case 'openai': { - const messages = part as OpenAI.Chat.Completions.ChatCompletionChunk - return OpenAi.retrieveTextValue(messages) - } case 'anthropic': { const messages = part as Anthropic.Messages.RawMessageStreamEvent - return AnthropicAi.retrieveTextValue(messages) + return AnthropicAI.retrieveTextValue(messages) } case 'mistral': { const messages = part as CompletionEvent - return MistralAi.retrieveTextValue(messages.data.choices[0].delta.content) + return MistralAI.retrieveTextValue(messages.data.choices[0].delta.content) } + default: + const messages = part as OpenAI.Chat.Completions.ChatCompletionChunk + return OpenAi.retrieveTextValue(messages) } } @@ -614,7 +619,7 @@ export async function copilot( scriptOptions: CopilotOptions, generatedCode: Writable, abortController: AbortController, - aiProvider: AiProviderTypes, + aiProvider: AIProvider, generatedExplanation?: Writable ) { const { prompt, systemPrompt } = await getPrompts(scriptOptions) @@ -704,7 +709,7 @@ export async function deltaCodeCompletion( messages: ChatCompletionMessageParam[], generatedCodeDelta: Writable, abortController: AbortController, - aiProvider: AiProviderTypes + aiProvider: AIProvider ) { const completion = await getCompletion(messages, abortController, aiProvider) diff --git a/frontend/src/lib/components/instanceSettings.ts b/frontend/src/lib/components/instanceSettings.ts index 75af6e568c..b94ba7a19a 100644 --- a/frontend/src/lib/components/instanceSettings.ts +++ b/frontend/src/lib/components/instanceSettings.ts @@ -8,11 +8,11 @@ export interface Setting { key: string // If value is not specified for first element, it will automatcally use undefined select_items?: { - label: string, - tooltip?: string, + label: string + tooltip?: string // If not specified, label will be used - value?: any, - }[], + value?: any + }[] fieldType: | 'text' | 'number' @@ -41,7 +41,7 @@ export interface Setting { isValid?: (value: any) => boolean error?: string defaultValue?: () => any - codeAreaLang?: string, + codeAreaLang?: string } export type SettingStorage = 'setting' @@ -81,9 +81,9 @@ export const settings: Record = { isValid: (value: string | undefined) => value ? value?.startsWith('http') && - value.includes('://') && - !value?.endsWith('/') && - !value?.endsWith(' ') + value.includes('://') && + !value?.endsWith('/') && + !value?.endsWith(' ') : false }, { @@ -182,7 +182,7 @@ export const settings: Record = { { label: 'Azure OpenAI base path', description: - 'All Windmill AI features will run on the specified deployed model. Format: https://{your-resource-name}.openai.azure.com/openai/deployments/{deployment-id}. Learn more', + 'All workspaces using an OpenAI resource for Windmill AI will run on the specified deployed model. Format: https://{your-resource-name}.openai.azure.com/openai/deployments/{deployment-id}. Learn more', key: 'openai_azure_base_path', fieldType: 'text', storage: 'setting', @@ -236,24 +236,26 @@ export const settings: Record = { // 2. Change LATEST_STABLE_PY in dockerfile // 3. Change #[default] annotation for PyVersion in backend placeholder: '3.10,3.11,3.12,3.13', - select_items: [{ - label: "Latest Stable", - value: "default", - tooltip: "python-3.11", - }, - { - label: "3.10", - }, - { - label: "3.11", - }, - { - label: "3.12", - }, - { - label: "3.13", - }], - storage: 'setting', + select_items: [ + { + label: 'Latest Stable', + value: 'default', + tooltip: 'python-3.11' + }, + { + label: '3.10' + }, + { + label: '3.11' + }, + { + label: '3.12' + }, + { + label: '3.13' + } + ], + storage: 'setting' }, { label: 'Pip index url', @@ -294,8 +296,7 @@ export const settings: Record = { }, { label: 'Nuget Config', - description: - 'Write a nuget.config file to set custom package sources and credentials', + description: 'Write a nuget.config file to set custom package sources and credentials', key: 'nuget_config', fieldType: 'codearea', codeAreaLang: 'xml', diff --git a/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte b/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte index 7b75c77ab1..b17055ac52 100644 --- a/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte +++ b/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte @@ -19,7 +19,7 @@ import MenuButton from './MenuButton.svelte' import { MenuItem } from '@rgossiaux/svelte-headlessui' import { isCloudHosted } from '$lib/cloud' - import { initAllAiWorkspace } from '../copilot/lib' + import { workspaceAIClients } from '../copilot/lib' import { twMerge } from 'tailwind-merge' export let isCollapsed: boolean = false @@ -31,7 +31,7 @@ if ($workspaceStore === id) { return } - initAllAiWorkspace(id, true) + workspaceAIClients.init(id) const editPages = [ '/scripts/edit/', '/flows/edit/', @@ -82,8 +82,11 @@ >
-
{workspace.name}
-
+
{workspace.name}
+
{workspace.id}
@@ -91,7 +94,7 @@
+ /> {/if}
diff --git a/frontend/src/lib/stores.ts b/frontend/src/lib/stores.ts index 98886e1bc0..ec158f371a 100644 --- a/frontend/src/lib/stores.ts +++ b/frontend/src/lib/stores.ts @@ -1,13 +1,14 @@ import { BROWSER } from 'esm-env' import { derived, type Readable, writable } from 'svelte/store' +import type { IntrospectionQuery } from 'graphql' import { - type WorkspaceDefaultScripts, + type AIProvider, + type OperatorSettings, type TokenResponse, type UserWorkspaceList, - type OperatorSettings + type WorkspaceDefaultScripts } from './gen' -import type { IntrospectionQuery } from 'graphql' import { getLocalSetting } from './utils' export interface UserExt { @@ -82,13 +83,14 @@ export const userWorkspaces: Readable< } }) export const copilotInfo = writable<{ - ai_provider: string + ai_provider: AIProvider exists_ai_resource: boolean - code_completion_enabled: boolean + code_completion_model?: string + ai_models: string[] }>({ - ai_provider: '', + ai_provider: 'openai', exists_ai_resource: false, - code_completion_enabled: false + ai_models: [] }) export const codeCompletionLoading = writable(false) export const metadataCompletionEnabled = writable(true) @@ -103,6 +105,9 @@ export const vimMode = writable(getLocalSetting(VIM_MODE_SETTING_NAME) export const codeCompletionSessionEnabled = writable( getLocalSetting(CODE_COMPLETION_SETTING_NAME) != 'false' ) +export const copilotSessionModel = writable( + getLocalSetting(CODE_COMPLETION_SETTING_NAME) ?? undefined +) export const usedTriggerKinds = writable([]) type SQLBaseSchema = { diff --git a/frontend/src/routes/(root)/(logged)/+layout.svelte b/frontend/src/routes/(root)/(logged)/+layout.svelte index 90b49a3ed2..f94049271c 100644 --- a/frontend/src/routes/(root)/(logged)/+layout.svelte +++ b/frontend/src/routes/(root)/(logged)/+layout.svelte @@ -44,7 +44,7 @@ import { syncTutorialsTodos } from '$lib/tutorialUtils' import { ArrowLeft, Search } from 'lucide-svelte' import { getUserExt } from '$lib/user' - import { initAllAiWorkspace } from '$lib/components/copilot/lib' + import { workspaceAIClients } from '$lib/components/copilot/lib' import { twMerge } from 'tailwind-merge' import OperatorMenu from '$lib/components/sidebar/OperatorMenu.svelte' import GlobalSearchModal from '$lib/components/search/GlobalSearchModal.svelte' @@ -192,11 +192,9 @@ async function loadUsedTriggerKinds() { let usedKinds: string[] = [] const { http_routes_used, websocket_used, kafka_used, postgres_used, nats_used } = - await WorkspaceService.getUsedTriggers( - { - workspace: $workspaceStore ?? '' - } - ) + await WorkspaceService.getUsedTriggers({ + workspace: $workspaceStore ?? '' + }) if (http_routes_used) { usedKinds.push('http') } @@ -242,15 +240,19 @@ let devOnly = $page.url.pathname.startsWith(base + '/scripts/dev') async function loadCopilot(workspace: string) { - initAllAiWorkspace(workspace) + workspaceAIClients.init(workspace) try { - copilotInfo.set(await WorkspaceService.getCopilotInfo({ workspace })) - } catch (err) { - console.log(err) + const info = await WorkspaceService.getCopilotInfo({ workspace }) copilotInfo.set({ - ai_provider: '', + ...info, + ai_provider: info.ai_provider ?? 'openai' + }) + } catch (err) { + copilotInfo.set({ + ai_provider: 'openai', exists_ai_resource: false, - code_completion_enabled: false + code_completion_model: undefined, + ai_models: [] }) console.error('Could not get copilot info') } @@ -294,7 +296,13 @@ setContext('openSearchWithPrefilledText', openSearchModal) $: { - if ($enterpriseLicense && $workspaceStore && $userStore && $devopsRole !== undefined && ($devopsRole || $userStore.is_admin)) { + if ( + $enterpriseLicense && + $workspaceStore && + $userStore && + $devopsRole !== undefined && + ($devopsRole || $userStore.is_admin) + ) { mountModal = true loadCriticalAlertsMuted() } diff --git a/frontend/src/routes/(root)/(logged)/user/(user)/create_workspace/+page.svelte b/frontend/src/routes/(root)/(logged)/user/(user)/create_workspace/+page.svelte index 11697cad39..a5fb6ee636 100644 --- a/frontend/src/routes/(root)/(logged)/user/(user)/create_workspace/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/user/(user)/create_workspace/+page.svelte @@ -6,7 +6,8 @@ SettingService, UserService, VariableService, - WorkspaceService + WorkspaceService, + type AIProvider } from '$lib/gen' import { validateUsername } from '$lib/utils' import { logoutWithRedirect } from '$lib/logout' @@ -18,12 +19,12 @@ import Tooltip from '$lib/components/Tooltip.svelte' import { onMount } from 'svelte' import { sendUserToast } from '$lib/toast' - import TestAiKey from '$lib/components/copilot/TestAiKey.svelte' + import TestAIKey from '$lib/components/copilot/TestAIKey.svelte' import { switchWorkspace } from '$lib/storeUtils' import { isCloudHosted } from '$lib/cloud' import ToggleButtonGroup from '$lib/components/common/toggleButton-v2/ToggleButtonGroup.svelte' import ToggleButton from '$lib/components/common/toggleButton-v2/ToggleButton.svelte' - import type { AiProviderTypes } from '$lib/components/copilot/lib' + import { AI_DEFAULT_MODELS } from '$lib/components/copilot/lib' const rd = $page.url.searchParams.get('rd') @@ -41,8 +42,12 @@ let colorEnabled = false function generateRandomColor() { - const randomColor = '#' + Math.floor(Math.random() * 16777215).toString(16).padStart(6, '0'); - workspaceColor = randomColor; + const randomColor = + '#' + + Math.floor(Math.random() * 16777215) + .toString(16) + .padStart(6, '0') + workspaceColor = randomColor } $: id = name.toLowerCase().replace(/\s/gi, '-') @@ -111,7 +116,8 @@ workspace: id, requestBody: { ai_resource: { path, provider: selected }, - code_completion_enabled: codeCompletionEnabled + ai_models: aiKey ? AI_DEFAULT_MODELS[selected].slice(0, 1) : [], + code_completion_model: codeCompletionEnabled ? AI_DEFAULT_MODELS[selected][0] : undefined } }) } @@ -178,7 +184,7 @@ let auto_invite = false let operatorOnly = false - let selected: AiProviderTypes = 'openai' + let selected: Exclude = 'openai' @@ -198,11 +204,23 @@ @@ -230,9 +248,12 @@
- + + + +
@@ -243,7 +264,12 @@ bind:value={aiKey} on:keyup={handleKeyUp} /> - +
{#if aiKey} { - // in JS, an empty string is also falsy - aiResourceInitialPath = aiResourcePath - aiResourceInitialProvider = aiProvider + async function editCopilotConfig(): Promise { if (aiResourcePath) { await WorkspaceService.editCopilotConfig({ workspace: $workspaceStore!, @@ -203,26 +205,30 @@ path: aiResourcePath, provider: aiProvider }, - code_completion_enabled: codeCompletionEnabled + code_completion_model: codeCompletionModel, + ai_models: aiModels } }) copilotInfo.set({ ai_provider: aiProvider, exists_ai_resource: true, - code_completion_enabled: codeCompletionEnabled + code_completion_model: codeCompletionModel, + ai_models: aiModels }) } else { await WorkspaceService.editCopilotConfig({ workspace: $workspaceStore!, requestBody: { ai_resource: undefined, - code_completion_enabled: codeCompletionEnabled + code_completion_model: codeCompletionModel, + ai_models: [] } }) copilotInfo.set({ - ai_provider: '', + ai_provider: 'openai', exists_ai_resource: false, - code_completion_enabled: codeCompletionEnabled + code_completion_model: codeCompletionModel, + ai_models: [] }) } sendUserToast(`Copilot settings updated`) @@ -382,6 +388,7 @@ }, 1000 - (timeEnd - timeStart)) } + let loadedSettings = false async function loadSettings(): Promise { const settings = await WorkspaceService.getSettings({ workspace: $workspaceStore! }) team_name = settings.slack_name @@ -395,9 +402,12 @@ customer_id = settings.customer_id workspaceToDeployTo = settings.deploy_to webhook = settings.webhook - aiResourceInitialPath = settings.ai_resource?.path - aiResourceInitialProvider = settings.ai_resource?.provider - selected = (aiResourceInitialProvider as AiProviderTypes) ?? 'openai' + + aiResourcePath = settings.ai_resource?.path + aiProvider = settings.ai_resource?.provider ?? 'openai' + codeCompletionModel = settings.code_completion_model + aiModels = settings.ai_models + errorHandlerItemKind = settings.error_handler?.split('/')[0] as 'flow' | 'script' errorHandlerScriptPath = (settings.error_handler ?? '').split('/').slice(1).join('/') errorHandlerInitialScriptPath = errorHandlerScriptPath @@ -415,7 +425,6 @@ : 'custom' } errorHandlerExtraArgs = settings.error_handler_extra_args ?? {} - codeCompletionEnabled = settings.code_completion_enabled workspaceDefaultAppPath = settings.default_app s3ResourceSettings = convertBackendSettingsToFrontendSettings(settings.large_file_storage) @@ -508,6 +517,8 @@ workspace: $workspaceStore!, path: 'openai_client_credentials_oauth' }) + + loadedSettings = true } let deployUiSettings: { @@ -698,7 +709,9 @@ - {#if tab == 'users'} + {#if !loadedSettings} + + {:else if tab == 'users'} {:else if tab == 'deploy_to'}
@@ -1044,43 +1057,104 @@
- { - aiResourceInitialPath = '' - aiResourceInitialProvider = '' - }} - > - - - - -
- {#key [aiResourceInitialPath, aiResourceInitialProvider, usingOpenaiClientCredentialsOauth, selected]} - { - editCopilotConfig(ev.detail, selected) - }} - /> - - {/key} -
-
- { - editCopilotConfig(aiResourceInitialPath || '', aiResourceInitialProvider || '') + +
+ { + aiResourcePath = '' + aiModels = [] + codeCompletionModel = undefined }} - /> + > + + + + + + + + +
+ {#key aiProvider} + { + if (aiResourcePath && aiModels.length === 0) { + if (aiProvider !== 'customai') { + aiModels = AI_DEFAULT_MODELS[aiProvider].slice(0, 1) + } + } + }} + /> + + {/key} +
+ + {#if aiResourcePath} + + +
+ { + if (codeCompletionModel != undefined) { + codeCompletionModel = undefined + } else { + codeCompletionModel = AI_DEFAULT_MODELS[aiProvider][0] ?? '' + } + }} + checked={codeCompletionModel != undefined} + options={{ + right: 'Code completion' + }} + /> + + {#if codeCompletionModel != undefined} + + {/if} +
+ {/if} +
{:else if tab == 'windmill_lfs'}
From b09ff9787209a76eb1f834751fa476a01fbc9a20 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 4 Feb 2025 22:37:19 +0100 Subject: [PATCH 12/13] chore(main): release 1.457.0 (#5201) * chore(main): release 1.457.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 16 + backend/Cargo.lock | 371 +++++++++--------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 218 insertions(+), 203 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f664e6685..6ea285221a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [1.457.0](https://github.com/windmill-labs/windmill/compare/v1.456.0...v1.457.0) (2025-02-04) + + +### Features + +* more AI models ([#5207](https://github.com/windmill-labs/windmill/issues/5207)) ([245c871](https://github.com/windmill-labs/windmill/commit/245c8719fc4bf9779be6c653f057d9ffb2724886)) +* **python:** make S3 cache arch specific ([#5196](https://github.com/windmill-labs/windmill/issues/5196)) ([0e80775](https://github.com/windmill-labs/windmill/commit/0e80775d6d2bd1931fed6d5a1d63fc2e70980d55)) + + +### Bug Fixes + +* hide values of WHITELIST_ENVS ([62bfec0](https://github.com/windmill-labs/windmill/commit/62bfec029c00fd067b9906f546b3c9597a54c319)) +* **python:** clear env before installing/finding python ([#5209](https://github.com/windmill-labs/windmill/issues/5209)) ([97c1134](https://github.com/windmill-labs/windmill/commit/97c11340c3175ba946ac6fc77481899fed508af5)) +* support specialization of list of strings to list of enums ([76afbc3](https://github.com/windmill-labs/windmill/commit/76afbc3df33ec87aff47b0db8c57e64209f8f613)) +* timeout on list_user_usage after 300s ([fd0cd58](https://github.com/windmill-labs/windmill/commit/fd0cd587bbe8f453893ae600ae553ee74eb1ba04)) + ## [1.456.0](https://github.com/windmill-labs/windmill/compare/v1.455.2...v1.456.0) (2025-02-01) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index a50ea3f309..10eeca03b0 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -442,7 +442,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -538,7 +538,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -560,7 +560,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -596,7 +596,7 @@ checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -651,9 +651,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-config" -version = "1.5.15" +version = "1.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc47e70fc35d054c8fcd296d47a61711f043ac80534a10b4f741904f81e73a90" +checksum = "50236e4d60fe8458de90a71c0922c761e41755adf091b1b03de1cef537179915" dependencies = [ "aws-credential-types", "aws-runtime", @@ -693,9 +693,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee7643696e7fdd74c10f9eb42848a87fe469d35eae9c3323f80aa98f350baac" +checksum = "76dd04d39cc12844c0994f2c9c5a6f5184c22e9188ec1ff723de41910a21dcad" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -718,9 +718,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.57.0" +version = "1.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54bab121fe1881a74c338c5f723d1592bf3b53167f80268a1274f404e1acc38" +checksum = "16ff718c9ee45cc1ebd4774a0e086bb80a6ab752b4902edf1c9f56b86ee1f770" dependencies = [ "aws-credential-types", "aws-runtime", @@ -740,9 +740,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.58.0" +version = "1.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c8234fd024f7ac61c4e44ea008029bde934250f371efe7d4a39708397b1080c" +checksum = "5183e088715cc135d8d396fdd3bc02f018f0da4c511f53cb8d795b6a31c55809" dependencies = [ "aws-credential-types", "aws-runtime", @@ -762,9 +762,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.58.0" +version = "1.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba60e1d519d6f23a9df712c04fdeadd7872ac911c84b2f62a8bda92e129b7962" +checksum = "c9f944ef032717596639cea4a2118a3a457268ef51bbb5fde9637e54c465da00" dependencies = [ "aws-credential-types", "aws-runtime", @@ -785,9 +785,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.2.7" +version = "1.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "690118821e46967b3c4501d67d7d52dd75106a9c54cf36cefa1985cedbe94e05" +checksum = "0bc5bbd1e4a2648fd8c5982af03935972c24a2f9846b396de661d351ee3ce837" dependencies = [ "aws-credential-types", "aws-smithy-http", @@ -858,9 +858,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.7.7" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865f7050bbc7107a6c98a397a9fcd9413690c27fa718446967cf03b2d3ac517e" +checksum = "d526a12d9ed61fadefda24abe2e682892ba288c2018bcb38b1b4c111d13f6d92" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -902,9 +902,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.12" +version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28f6feb647fb5e0d5b50f0472c19a7db9462b74e2fec01bb0b44eedcc834e97" +checksum = "c7b8a53819e42f10d0821f56da995e1470b199686a1809168db6ca485665f042" dependencies = [ "base64-simd 0.8.0", "bytes", @@ -937,9 +937,9 @@ dependencies = [ [[package]] name = "aws-types" -version = "1.3.4" +version = "1.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0df5a18c4f951c645300d365fec53a61418bcf4650f604f85fe2a665bfaa0c2" +checksum = "dfbd0a668309ec1f66c0f6bda4840dd6d4796ae26d699ebc266d7cc95c6d040f" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -1136,7 +1136,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.96", + "syn 2.0.98", "which 4.4.2", ] @@ -1157,7 +1157,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1332,7 +1332,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1434,7 +1434,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1445,9 +1445,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" dependencies = [ "serde", ] @@ -1552,9 +1552,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.11" +version = "1.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4730490333d58093109dc02c23174c3f4d490998c3fed3cc8e82d57afedb9cf" +checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" dependencies = [ "jobserver", "libc", @@ -1668,9 +1668,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.27" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" dependencies = [ "clap_builder", "clap_derive", @@ -1690,14 +1690,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.24" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2082,7 +2082,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2154,7 +2154,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2187,7 +2187,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2714,7 +2714,7 @@ dependencies = [ "stringcase", "strum 0.25.0", "strum_macros 0.25.3", - "syn 2.0.96", + "syn 2.0.98", "thiserror 1.0.69", ] @@ -2892,15 +2892,15 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3005,7 +3005,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3028,7 +3028,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3185,7 +3185,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3205,7 +3205,7 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3410,7 +3410,7 @@ checksum = "32016f1242eb82af5474752d00fd8ebcd9004bd69b462b1c91de833972d08ed4" dependencies = [ "proc-macro2", "swc_macros_common", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3534,7 +3534,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3799,7 +3799,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3964,7 +3964,7 @@ checksum = "f208758247e68e239acaa059e72e4ce1f30f2a4b6523f19c1b923d25b7e9cceb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4527,7 +4527,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4649,7 +4649,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -5099,9 +5099,9 @@ dependencies = [ [[package]] name = "malachite-base" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7d99f6446827fb878a005ea5cf7db1d78d236391733012216a9b8eb5dbd824" +checksum = "5ea0ed76adf7defc1a92240b5c36d5368cfe9251640dcce5bd2d0b7c1fd87aeb" dependencies = [ "hashbrown 0.14.5", "itertools 0.11.0", @@ -5124,9 +5124,9 @@ dependencies = [ [[package]] name = "malachite-nz" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36157fa6b969ca652feefe159e202ebd85683e57463074492a7ec3eaa468c97" +checksum = "34a79feebb2bc9aa7762047c8e5495269a367da6b5a90a99882a0aeeac1841f7" dependencies = [ "itertools 0.11.0", "libm", @@ -5135,9 +5135,9 @@ dependencies = [ [[package]] name = "malachite-q" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dde29a4fcf7025f482745247951f7c5d0459671f59aedf09035b2e2c3746fdf" +checksum = "50f235d5747b1256b47620f5640c2a17a88c7569eebdf27cd9cb130e1a619191" dependencies = [ "itertools 0.11.0", "malachite-base", @@ -5302,7 +5302,7 @@ checksum = "a7ce64b975ed4f123575d11afd9491f2e37bbd5813fbfbc0f09ae1fbddea74e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -5341,7 +5341,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "termcolor", "thiserror 1.0.69", ] @@ -5616,7 +5616,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -5701,9 +5701,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oneshot" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e296cf87e61c9cfc1a61c3c63a0f7f286ed4554e0e22be84e8a38e1d264a2a29" +checksum = "79d72a7c0f743d2ebb0a2ad1d219db75fdc799092ed3a884c9144c42a31225bd" [[package]] name = "onig" @@ -5777,9 +5777,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.69" +version = "0.10.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e534d133a060a3c19daec1eb3e98ec6f4685978834f2dbadfe2ec215bab64e" +checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" dependencies = [ "bitflags 2.8.0", "cfg-if", @@ -5798,7 +5798,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -5818,9 +5818,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" dependencies = [ "cc", "libc", @@ -6196,7 +6196,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6222,22 +6222,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6285,19 +6285,6 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" -[[package]] -name = "postgres-native-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d442770e2b1e244bb5eb03b31c79b65bb2568f413b899eaba850fa945a65954" -dependencies = [ - "futures", - "native-tls", - "tokio", - "tokio-native-tls", - "tokio-postgres 0.7.12", -] - [[package]] name = "postgres-native-tls" version = "0.5.0" @@ -6309,11 +6296,22 @@ dependencies = [ "tokio-postgres 0.7.11", ] +[[package]] +name = "postgres-native-tls" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f39498473c92f7b6820ae970382c1d83178a3454c618161cb772e8598d9f6f" +dependencies = [ + "native-tls", + "tokio", + "tokio-native-tls", + "tokio-postgres 0.7.13", +] + [[package]] name = "postgres-protocol" version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acda0ebdebc28befa84bee35e651e4c5f09073d668c7aed4cf7e23c3cda84b23" +source = "git+https://github.com/imor/rust-postgres?rev=20265ef38e32a06f76b6f9b678e2077fc2211f6b#20265ef38e32a06f76b6f9b678e2077fc2211f6b" dependencies = [ "base64 0.22.1", "byteorder", @@ -6329,8 +6327,9 @@ dependencies = [ [[package]] name = "postgres-protocol" -version = "0.6.7" -source = "git+https://github.com/imor/rust-postgres?rev=20265ef38e32a06f76b6f9b678e2077fc2211f6b#20265ef38e32a06f76b6f9b678e2077fc2211f6b" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" dependencies = [ "base64 0.22.1", "byteorder", @@ -6339,7 +6338,7 @@ dependencies = [ "hmac", "md-5 0.10.6", "memchr", - "rand 0.8.5", + "rand 0.9.0", "sha2 0.10.8", "stringprep", ] @@ -6351,21 +6350,21 @@ source = "git+https://github.com/imor/rust-postgres?rev=20265ef38e32a06f76b6f9b6 dependencies = [ "bytes", "fallible-iterator", - "postgres-protocol 0.6.7 (git+https://github.com/imor/rust-postgres?rev=20265ef38e32a06f76b6f9b678e2077fc2211f6b)", + "postgres-protocol 0.6.7", ] [[package]] name = "postgres-types" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66ea23a2d0e5734297357705193335e0a957696f34bed2f2faefacb2fec336f" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" dependencies = [ "array-init", "bit-vec", "bytes", "chrono", "fallible-iterator", - "postgres-protocol 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "postgres-protocol 0.6.8", "serde", "serde_json", "uuid 1.12.1", @@ -6409,7 +6408,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6449,7 +6448,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6460,7 +6459,7 @@ checksum = "07c277e4e643ef00c1233393c673f655e3672cf7eb3ba08a00bdd0ea59139b5f" dependencies = [ "proc-macro-rules-macros", "proc-macro2", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6472,7 +6471,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6533,7 +6532,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "syn 2.0.96", + "syn 2.0.98", "thiserror 1.0.69", "typify", "unicode-ident", @@ -6553,7 +6552,7 @@ dependencies = [ "serde_json", "serde_tokenstream", "serde_yaml", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6596,7 +6595,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6798,7 +6797,7 @@ checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.0", - "zerocopy 0.8.14", + "zerocopy 0.8.16", ] [[package]] @@ -6856,7 +6855,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" dependencies = [ "getrandom 0.3.1", - "zerocopy 0.8.14", + "zerocopy 0.8.16", ] [[package]] @@ -7280,7 +7279,7 @@ dependencies = [ "quote", "rust-embed-utils", "shellexpand", - "syn 2.0.96", + "syn 2.0.98", "walkdir", ] @@ -7314,7 +7313,7 @@ dependencies = [ "borsh", "bytes", "num-traits", - "postgres-types 0.2.8", + "postgres-types 0.2.9", "rand 0.8.5", "rkyv", "serde", @@ -7666,7 +7665,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7826,7 +7825,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7837,7 +7836,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7911,7 +7910,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7932,7 +7931,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7987,7 +7986,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8337,7 +8336,7 @@ checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8402,7 +8401,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8425,7 +8424,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.96", + "syn 2.0.98", "tempfile", "tokio", "url", @@ -8576,7 +8575,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8636,7 +8635,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8649,7 +8648,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8757,7 +8756,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8806,7 +8805,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8891,7 +8890,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8998,7 +8997,7 @@ checksum = "63db0adcff29d220c3d151c5b25c0eabe7e32dd936212b84cdaa1392e3130497" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -9009,7 +9008,7 @@ checksum = "f486687bfb7b5c560868f69ed2d458b880cebc9babebcb67e49f31b55c5bf847" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -9032,7 +9031,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -9048,9 +9047,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.96" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -9080,7 +9079,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -9355,7 +9354,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -9366,7 +9365,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -9601,7 +9600,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -9630,7 +9629,7 @@ dependencies = [ "percent-encoding", "phf", "pin-project-lite", - "postgres-protocol 0.6.7 (git+https://github.com/imor/rust-postgres?rev=20265ef38e32a06f76b6f9b678e2077fc2211f6b)", + "postgres-protocol 0.6.7", "postgres-types 0.2.7", "rand 0.8.5", "socket2", @@ -9641,9 +9640,9 @@ dependencies = [ [[package]] name = "tokio-postgres" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b5d3742945bc7d7f210693b0c58ae542c6fd47b17adbbda0885f3dcb34a6bdb" +checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" dependencies = [ "async-trait", "byteorder", @@ -9656,9 +9655,9 @@ dependencies = [ "percent-encoding", "phf", "pin-project-lite", - "postgres-protocol 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "postgres-types 0.2.8", - "rand 0.8.5", + "postgres-protocol 0.6.8", + "postgres-types 0.2.9", + "rand 0.9.0", "socket2", "tokio", "tokio-util", @@ -9828,7 +9827,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.0", + "winnow 0.7.1", ] [[package]] @@ -9995,7 +9994,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -10224,7 +10223,7 @@ dependencies = [ "regress", "schemars", "serde_json", - "syn 2.0.96", + "syn 2.0.98", "thiserror 1.0.69", "unicode-ident", ] @@ -10241,7 +10240,7 @@ dependencies = [ "serde", "serde_json", "serde_tokenstream", - "syn 2.0.96", + "syn 2.0.98", "typify-impl", ] @@ -10656,7 +10655,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-shared", ] @@ -10690,7 +10689,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -10723,7 +10722,7 @@ checksum = "b7f89739351a2e03cb94beb799d47fb2cac01759b40ec441f7de39b00cbf7ef0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -10860,7 +10859,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "axum", @@ -10903,7 +10902,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "argon2", @@ -10948,7 +10947,7 @@ dependencies = [ "openssl", "pg_escape", "pin-project", - "postgres-native-tls 0.5.0 (git+https://github.com/imor/rust-postgres?rev=20265ef38e32a06f76b6f9b678e2077fc2211f6b)", + "postgres-native-tls 0.5.0", "prometheus", "quick_cache", "rand 0.9.0", @@ -10996,7 +10995,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.456.0" +version = "1.457.0" dependencies = [ "base64 0.22.1", "chrono", @@ -11014,7 +11013,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.456.0" +version = "1.457.0" dependencies = [ "chrono", "serde", @@ -11027,7 +11026,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "serde", @@ -11041,7 +11040,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "async-stream", @@ -11100,7 +11099,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.456.0" +version = "1.457.0" dependencies = [ "regex", "serde", @@ -11114,7 +11113,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "bytes", @@ -11137,19 +11136,19 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.456.0" +version = "1.457.0" dependencies = [ "itertools 0.14.0", "lazy_static", "proc-macro2", "quote", "regex", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "windmill-parser" -version = "1.456.0" +version = "1.457.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -11158,7 +11157,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "lazy_static", @@ -11170,7 +11169,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "serde_json", @@ -11182,7 +11181,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "gosyn", @@ -11194,7 +11193,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "lazy_static", @@ -11206,7 +11205,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -11217,7 +11216,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -11228,7 +11227,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "async-recursion", @@ -11248,7 +11247,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -11258,14 +11257,14 @@ dependencies = [ "quote", "regex", "serde_json", - "syn 2.0.96", + "syn 2.0.98", "toml 0.7.8", "windmill-parser", ] [[package]] name = "windmill-parser-sql" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "lazy_static", @@ -11277,7 +11276,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "lazy_static", @@ -11295,7 +11294,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "getrandom 0.2.15", @@ -11317,7 +11316,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "serde_json", @@ -11327,7 +11326,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "async-recursion", @@ -11360,7 +11359,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.456.0" +version = "1.457.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -11370,7 +11369,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.456.0" +version = "1.457.0" dependencies = [ "anyhow", "async-recursion", @@ -11410,7 +11409,7 @@ dependencies = [ "opentelemetry", "oracle", "pem 3.0.4", - "postgres-native-tls 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "postgres-native-tls 0.5.1", "prometheus", "rand 0.9.0", "regex", @@ -11423,7 +11422,7 @@ dependencies = [ "tar", "tiberius", "tokio", - "tokio-postgres 0.7.12", + "tokio-postgres 0.7.13", "tokio-util", "tracing", "urlencoding", @@ -11654,9 +11653,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e49d2d35d3fad69b39b94139037ecfb4f359f08958b9c11e7315ce770462419" +checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" dependencies = [ "memchr", ] @@ -11768,7 +11767,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -11784,11 +11783,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.14" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a367f292d93d4eab890745e75a778da40909cab4d6ff8173693812f79c4a2468" +checksum = "7b8c07a70861ce02bad1607b5753ecb2501f67847b9f9ada7c160fff0ec6300c" dependencies = [ - "zerocopy-derive 0.8.14", + "zerocopy-derive 0.8.16", ] [[package]] @@ -11799,18 +11798,18 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "zerocopy-derive" -version = "0.8.14" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3931cb58c62c13adec22e38686b559c86a30565e16ad6e8510a337cedc611e1" +checksum = "5226bc9a9a9836e7428936cde76bb6b22feea1a8bfdbc0d241136e4d13417e25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -11830,7 +11829,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -11859,7 +11858,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index c174739a84..ff72b9e51e 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.456.0" +version = "1.457.0" authors.workspace = true edition.workspace = true @@ -30,7 +30,7 @@ members = [ ] [workspace.package] -version = "1.456.0" +version = "1.457.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 9df3cda043..aff23d0216 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.456.0 + version: 1.457.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 47f2684855..afd49c9abd 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.456.0"; +export const VERSION = "v1.457.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index f02dbbe841..ac1ea6d6dd 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -60,7 +60,7 @@ export { // } // }); -export const VERSION = "1.456.0"; +export const VERSION = "1.457.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 95f0c35a97..a08ab6ef8e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.456.0", + "version": "1.457.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.456.0", + "version": "1.457.0", "license": "AGPL-3.0", "dependencies": { "@anthropic-ai/sdk": "^0.32.1", diff --git a/frontend/package.json b/frontend/package.json index 3ea5fd90b8..7d7d5c07db 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.456.0", + "version": "1.457.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 940df30fff..28a2bf1a73 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.456.0" -wmill_pg = ">=1.456.0" +wmill = ">=1.457.0" +wmill_pg = ">=1.457.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 2198173813..55d7780045 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.456.0 + version: 1.457.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index aac05daa78..24f2af00b1 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.456.0' + ModuleVersion = '1.457.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 0ee4ed7b5b..3022069d2a 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.456.0" +version = "1.457.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 2c213d557c..2a40adea41 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.456.0" +version = "1.457.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 0947f2c0ad..3281395edc 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.456.0", + "version": "1.457.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 347362bc92..02752456e7 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.456.0", + "version": "1.457.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index aaa526a611..2d336e491a 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.456.0 +1.457.0 From 8a446a658a1b8e82fd8c3a051dd7274df8c54c71 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Tue, 4 Feb 2025 23:34:03 +0100 Subject: [PATCH 13/13] fix: preprocessor args python (#5210) --- backend/windmill-worker/src/python_executor.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/windmill-worker/src/python_executor.rs b/backend/windmill-worker/src/python_executor.rs index b5cd49822e..98e1483421 100644 --- a/backend/windmill-worker/src/python_executor.rs +++ b/backend/windmill-worker/src/python_executor.rs @@ -1395,12 +1395,12 @@ async fn prepare_wrapper( } else { format!( r#"pre_args["{name}"] = kwargs.get("{name}") - if pre_args["{name}"] is None: - del pre_args["{name}"]"# + if pre_args["{name}"] is None: + del pre_args["{name}"]"# ) } }) - .join("\n ") + .join("\n ") }; Some(spread) } else {