Commit Graph

5593 Commits

Author SHA1 Message Date
Ruben Fiszel 57fd32b11d fix improve tags sensitivity behavior for certain backend apis 2026-01-09 17:32:44 +00:00
Diego Imbert 17d29cd8c7 fix: Better workspace storage settings (#7533)
* Better Workspace Storage settings

* nit

* super nit

* Permission settings in modal

* badge indicator

* nit width
2026-01-09 15:16:56 +00:00
claude[bot] 6f7cf2fb16 feat: add password reset flow using configured SMTP settings (#7525)
* feat: add password reset flow using configured SMTP settings

Implements password reset functionality for users with email/password login:

Backend:
- Add `/auth/request_password_reset` endpoint to request a password reset email
- Add `/auth/reset_password` endpoint to reset password using token
- Add `/auth/is_smtp_configured` endpoint to check if SMTP is available
- Uses existing `magic_link` table for storing reset tokens
- Tokens expire after 1 hour
- Invalidates all existing sessions on password reset
- Includes audit logging

Frontend:
- Add "Forgot password?" link on login page (shown when SMTP is configured)
- Add `/user/forgot-password` page for requesting password reset
- Add `/user/reset-password` page for entering new password
- Both pages follow existing Windmill design patterns

Security:
- Always returns success response to prevent email enumeration
- Password must be at least 8 characters
- Uses argon2 for password hashing (same as existing login)

Closes #7524

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>

* nits

* nits

* fix oss

* nits

* fix oss

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
Co-authored-by: HugoCasa <hugo@casademont.ch>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
2026-01-09 10:31:56 +00:00
Diego Imbert 668b1b0a89 Fix wonky operator menu (#7528)
* Fix wonky operator menu

* fix on close
2026-01-09 04:30:46 +00:00
Diego Imbert 08a88b302d fix wrong schema var (#7527) 2026-01-08 17:26:04 +00:00
Diego Imbert e513f143b7 fix oneOf infer bug (#7526) 2026-01-08 12:45:00 +00:00
Guilhem 61d357ff56 improve job preview popover layout (#7485) 2026-01-08 06:29:49 +00:00
Guilhem b8c8df080b fix(frontend): improve centered page overflow (#7515)
* center page top when needed

* remove debug message
2026-01-08 06:26:32 +00:00
Guilhem 7ca09455ea fix(frontend): auto-add invite workspace settings (#7522)
* fix auto add invite workspace settings

* nit
2026-01-08 06:24:23 +00:00
centdix 7ad6e87e16 feat(flow): allow additional inputs in chat mode (#7503)
* draft

* better

* cleaning

* cleaning

* show warning if missing required

* make it work with dyn args

* cleaning
2026-01-07 15:57:23 +00:00
hugocasa 4763eda6b7 feat: give access to results in early stop expr (#7514)
* feat: give access to results in early stop expr

* nit
2026-01-07 16:06:56 +09:00
Diego Imbert b26d2fe641 feat: DB Manager alter table (#7486) 2026-01-07 04:02:15 +00:00
hugocasa cf90bd4676 fix: make workspace id change faster and add 100k jobs limit (#7500) 2026-01-06 18:07:51 +00:00
Guilhem 69b44f3b68 fix(frontend): improve workspace page (#7502)
* nit

* Improve workspace view by showing a tree

* implement search for workspaces

* Add collapse expand button

* improve unarchive button

* nit

* move search

* nit

* add max h

* Add keyboard navigation

* clean code

* Show admin workspaces with other workspaces

* Update frontend/src/routes/(root)/(logged)/user/(user)/workspaces/+page.svelte

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* nit

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
2026-01-06 18:06:42 +00:00
centdix 63c3dd2688 nit stop button styling (#7499) 2026-01-06 18:03:56 +00:00
Diego Imbert e6757994d5 fix: ducklake default connection extra_args (#7509)
* Ducklake default extra_args

* indicator nit
2026-01-06 17:55:05 +00:00
Diego Imbert 15d1fb506d Fix invisible select dropdown in audit logs filter #7510 2026-01-06 17:40:20 +00:00
Alexander Petric e935f62f9c fix: git sync init script where WM_EMAIL doesn't match gpg resource email (#7508) 2026-01-06 17:01:50 +00:00
centdix 050e1f4585 feat(aichat): better diff viewer for inputs in flow mode (#7490)
* better diff viewer for inputs

* nit

* fix

* better

* nit

* fix undefined access

* fix order

* cleaning
2026-01-06 10:08:14 +00:00
Guilhem bce64bbf48 set app button loading state to true before worker execution (#7493) 2026-01-05 22:28:20 +00:00
Guilhem c69d0e242f fix workspace settings save buttons (#7492) 2026-01-05 22:24:28 +00:00
Guilhem 2eeb63e033 fix(frontend): improve workspace picker menu UI (#7491)
* Improve sidebar workspace picker

* nit

* nit
2026-01-05 22:23:51 +00:00
hugocasa ba4bcbba92 fix(frontend): keep full raw flow / raw code in flow status when queued (#7480) 2026-01-05 12:41:08 +00:00
Diego Imbert b53f01022c fix: Fix db manager null access when closing it (#7487)
* fix null access

* inspect
2026-01-05 12:08:48 +00:00
centdix 62cb147847 fix tool validation (#7482) 2026-01-05 10:58:02 +00:00
Bryan 912e0af07a fix(agent): ignore Enter event when event.isComposing is true (#7474) 2026-01-02 08:57:43 +00:00
Ruben Fiszel c3a040ad1c update monaco to 24 (#7462)
* monaco24

* update

* update

* update

* update

* update

* update

* remove graphql support

* diff more pro-eminent
2025-12-27 12:35:19 +00:00
Ruben Fiszel dbcf5c3590 chore(internal): upgrade vite (#7461)
* vite 8

* add .npmrc

* popperjs to svelte 5

* popperjs to svelte 5

* revert to rolldown-vite

* vite 7.3.0
2025-12-27 10:23:21 +00:00
Ruben Fiszel 2bd9c1fc73 fix(vscode): improve paste support for vscode extension 2025-12-26 23:21:42 +00:00
Ruben Fiszel 940b85b17b fix: add an flow editor drawer for editing flows in same page 2025-12-26 17:36:36 +00:00
Ruben Fiszel 94493fa4f5 allow edit button for scripts directly 2025-12-26 17:01:39 +00:00
Ruben Fiszel 66c8e2f6da feat: allow code selection to be added as context to the AI Chat 2025-12-26 14:44:09 +00:00
Ruben Fiszel db6f2f2762 feat: allow @ selection for raw apps 2025-12-26 14:15:13 +00:00
Ruben Fiszel c90d878bc1 feat: implement item selection for raw app builder 2025-12-26 13:14:14 +00:00
claude[bot] 77d3004a2f fix: add CORS headers to static assets for iframe context sharing (#7454)
* fix: add CORS headers to static assets for iframe context sharing

Add Cross-Origin-Opener-Policy, Cross-Origin-Embedder-Policy, and
Cross-Origin-Resource-Policy headers to static assets served by the backend
to match the vite preview config. This enables the TypeScript worker to work
correctly when ui_builder is loaded in an iframe.

Fixes #7453

Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>

* fix: add CORS headers only for /apps_raw paths and force reload on navigation

- Only add Cross-Origin-Opener-Policy, Cross-Origin-Embedder-Policy, and
  Cross-Origin-Resource-Policy headers for /apps_raw/ paths (not all static assets)
- Add frontend navigation handler to force page reload when navigating from
  non-apps_raw paths to /apps_raw/add or /apps_raw/edit
- This ensures the TypeScript worker works correctly while avoiding CORS issues
  for external iframe embeds in other parts of the app

Co-authored-by: Ruben Fiszel <rubenfiszel@users.noreply.github.com>

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: also reload when navigating from /apps/get_raw/ to apps_raw editor

When viewing a raw app at /apps/get_raw/, the cross-origin isolation
headers are not present. Force a page reload when navigating from
this path to /apps_raw/add or /apps_raw/edit to ensure the headers
are fetched from the server.

Co-authored-by: Ruben Fiszel <rubenfiszel@users.noreply.github.com>

* Update +layout.svelte

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Ruben Fiszel <rubenfiszel@users.noreply.github.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
2025-12-25 14:53:33 +02:00
Ruben Fiszel 3dd4579d0a feat: raw apps can be built by agents fully locally (#7448) 2025-12-24 21:00:04 +00:00
Pyra cbcf0aa344 feat(python): set latest stable to 3.12 (#7405)
Signed-off-by: pyranota <pyra@duck.com>
2025-12-23 20:50:43 +00:00
Tristan TR e96da54001 fix: New tutorials (#7427)
* Put back banner a new tutorial is available for a user that completed all his tutorials and never skipped all

* Create onboarding tutorial for operators in tutorial config file

* Add router and steps for onboarding tutorial for operators

* Improve onboarding tutorial for operators

* Improve the tutorial UX

* Refactor

* Remove cursor from last step of operator onboarding tutorial

* Improve filtering per role

* Add Runs page tutorial

* Improve Runs page tutorial

* Add failed run

* Simplify Runs tutorial with job clicks into one unique step

* Finish overall structure of Runs tutorial

* Improve wordings

* Prevent breaking animations by clicking on Next or Previous

* Add success and failure logo to step title

* Improve wording

* Create util function for moving cursor

* Nits

* Improve wordings

* Differentiate successfull and failed jobs steps

* Remove delete flows if operator to prevent permission errors

* Add comment
2025-12-23 18:19:30 +00:00
claude[bot] 15a4b26d44 feat(aichat): add get_lint_errors tool for script and flow mode (#7431)
* feat(aichat): add get_lint_errors tool for script and flow mode

This adds a new `get_lint_errors` tool to the AI chat for script and flow modes,
similar to what exists for app mode.

For script mode:
- Added `getLintErrors` function to Editor.svelte that returns lint errors from Monaco
- Added `ScriptLintResult` and `ScriptLintError` interfaces
- Added `get_lint_errors` tool definition and implementation
- Updated system prompt to instruct AI to use the tool after code changes

For flow mode:
- Added `FlowLintResult` interface for flow-level lint results
- Added `get_lint_errors` tool that gets lint errors from the currently selected module
- Updated system prompt to include linting in the tool selection guide

The AI is now instructed to always use `get_lint_errors` after making code changes
and fix any errors before proceeding with testing.

Closes #7430

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>

* fix for script

* fix for flow

* cleaning

* fix DatatableCreationPolicy

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
Co-authored-by: centdix <farhadg110@gmail.com>
2025-12-23 16:41:42 +00:00
Ruben Fiszel 50b59464f6 cli now handle data part of raw apps 2025-12-23 15:44:17 +00:00
hugocasa 4071e3c004 improve windmill-components compat with hub (#7437) 2025-12-23 15:26:23 +00:00
centdix 532c50024f feat(aiagent): handle custom memory_id (#7432)
* first draft

* fix

* nit

* cleaning

* fix on deploy if not set

* add off mode to memory
2025-12-23 13:47:50 +00:00
Pyra 1f82e2d432 fix ci (#7438)
* fix frontend

Signed-off-by: pyranota <pyra@duck.com>

* chore: update ee-repo-ref to 5c2a8854e7ff014063a69dd8f7829a935129c31e

This commit updates the EE repository reference after PR #370 was merged in windmill-ee-private.

Previous ee-repo-ref: 8c75fc5b1372a790dc74b374cd72f9caf51a4595

New ee-repo-ref: 5c2a8854e7ff014063a69dd8f7829a935129c31e

Automated by sync-ee-ref workflow.

---------

Signed-off-by: pyranota <pyra@duck.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
2025-12-23 13:47:03 +00:00
Pyra 9d698dabb4 feat: v2 job debouncing (#7411)
* rework everything again

Signed-off-by: pyranota <pyra@duck.com>

* updcate sqlx

Signed-off-by: pyranota <pyra@duck.com>

* update ref

Signed-off-by: pyranota <pyra@duck.com>

* fix things

Signed-off-by: pyranota <pyra@duck.com>

* fix function

Signed-off-by: pyranota <pyra@duck.com>

* final fixes

Signed-off-by: pyranota <pyra@duck.com>

* update sqlx

Signed-off-by: pyranota <pyra@duck.com>

* fix script creation

Signed-off-by: pyranota <pyra@duck.com>

* address todo

Signed-off-by: pyranota <pyra@duck.com>

* cleanup

Signed-off-by: pyranota <pyra@duck.com>

* remove dbg

Signed-off-by: pyranota <pyra@duck.com>

* cleanup

Signed-off-by: pyranota <pyra@duck.com>

* fix

Signed-off-by: pyranota <pyra@duck.com>

* fixups

Signed-off-by: pyranota <pyra@duck.com>

* fix cargo.toml

Signed-off-by: pyranota <pyra@duck.com>

* update ee repo

Signed-off-by: pyranota <pyra@duck.com>

* fix ci

Signed-off-by: pyranota <pyra@duck.com>

* nit

Signed-off-by: pyranota <pyra@duck.com>

* ref

Signed-off-by: pyranota <pyra@duck.com>

* fix

Signed-off-by: pyranota <pyra@duck.com>

* ee repo

Signed-off-by: pyranota <pyra@duck.com>

* sqlx

Signed-off-by: pyranota <pyra@duck.com>

* ee ref

Signed-off-by: pyranota <pyra@duck.com>

* remove dbg

Signed-off-by: pyranota <pyra@duck.com>

* sqlx

Signed-off-by: pyranota <pyra@duck.com>

* feat: v2 job debouncing

Signed-off-by: pyranota <pyra@duck.com>

* v2 debouncing

Signed-off-by: pyranota <pyra@duck.com>

* compat

Signed-off-by: pyranota <pyra@duck.com>

* fix all

Signed-off-by: pyranota <pyra@duck.com>

* remove legacy logic

Signed-off-by: pyranota <pyra@duck.com>

* nit

Signed-off-by: pyranota <pyra@duck.com>

* finish

Signed-off-by: pyranota <pyra@duck.com>

* nits

Signed-off-by: pyranota <pyra@duck.com>

* stage import

Signed-off-by: pyranota <pyra@duck.com>

* remove unused import

Signed-off-by: pyranota <pyra@duck.com>

* remove comments

Signed-off-by: pyranota <pyra@duck.com>

* ee ref

Signed-off-by: pyranota <pyra@duck.com>

* ee ref

Signed-off-by: pyranota <pyra@duck.com>

* nits

Signed-off-by: pyranota <pyra@duck.com>

* Update backend/windmill-queue/src/jobs.rs

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* Update backend/windmill-common/src/runnable_settings/settings.rs

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* Update frontend/src/lib/components/flows/DebounceLimit.svelte

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* fix nits

Signed-off-by: pyranota <pyra@duck.com>

* force no compat in ci

Signed-off-by: pyranota <pyra@duck.com>

* better default key handling

Signed-off-by: pyranota <pyra@duck.com>

* simplify

Signed-off-by: pyranota <pyra@duck.com>

* sqlx

Signed-off-by: pyranota <pyra@duck.com>

* optimize

Signed-off-by: pyranota <pyra@duck.com>

* sqlx

Signed-off-by: pyranota <pyra@duck.com>

* fix flow step

Signed-off-by: pyranota <pyra@duck.com>

* add openapi

Signed-off-by: pyranota <pyra@duck.com>

* fix ci

Signed-off-by: pyranota <pyra@duck.com>

* ee ref

Signed-off-by: pyranota <pyra@duck.com>

* rename WMDEBUG flag

Signed-off-by: pyranota <pyra@duck.com>

* ee ref

Signed-off-by: pyranota <pyra@duck.com>

* remove gate for is_flow_step on pull

Signed-off-by: pyranota <pyra@duck.com>

* remove dead code

Signed-off-by: pyranota <pyra@duck.com>

* nits

Signed-off-by: pyranota <pyra@duck.com>

* chore: update ee-repo-ref to 71d872d27de44227b82f75a9c0879d8428684880

This commit updates the EE repository reference after PR #369 was merged in windmill-ee-private.

Previous ee-repo-ref: 4c7642dc9f7f4467fc055136bd56558b66ef2d54

New ee-repo-ref: 71d872d27de44227b82f75a9c0879d8428684880

Automated by sync-ee-ref workflow.

---------

Signed-off-by: pyranota <pyra@duck.com>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
2025-12-23 13:24:04 +00:00
Ruben Fiszel 91a00857a8 add proper jobs timings for raw apps 2025-12-23 11:39:48 +00:00
Ruben Fiszel ad2232e4cb feat: full-code app builder reachable from home in preview 2025-12-23 09:12:47 +00:00
Ruben Fiszel 6a67869040 feat: data table integrations for raw apps (#7436) 2025-12-23 00:17:37 +00:00
claude[bot] 6be060bea8 feat(ai): add websearch tool for AI agents (#7399)
* refactor(ai): use responses API for OpenAI/Azure, create 'other' provider for completion endpoint

- Created new 'other.rs' provider using the OpenAI-compatible completion endpoint
- Refactored 'openai.rs' to use the Responses API for both text and image output
- Updated query_builder to route OpenAI/AzureOpenAI to OpenAIQueryBuilder
- All other providers (Mistral, DeepSeek, Groq, etc.) now use OtherQueryBuilder
- Updated OpenRouter to delegate to OtherQueryBuilder instead of OpenAIQueryBuilder

This prepares the codebase for adding websearch tool support using the Responses API.

Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>

* feat(ai): add websearch as AI agent tool type

- Added WebsearchToolValue to ToolValue enum in flows.rs
- Updated all pattern matches to handle websearch tool type
- Added has_websearch parameter to run_agent function
- Websearch tools don't require additional configuration

This prepares the backend for provider-specific websearch implementations.

Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>

* feat(frontend): add websearch as tool option in AI agent UI

- Added WebsearchTool type and utility functions to agentToolUtils.ts
- Added "Web Search" option in tool insertion menu (InsertModuleInner)
- Updated NewAIToolNode to handle pickWebsearchTool event
- Updated AIToolNode to render websearch tools properly
- Updated FlowModuleSchemaMap to create websearch tools

Users can now add websearch tools to AI agents through the UI.

Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>

* feat(ai): implement websearch for OpenAI provider

- Added has_websearch parameter to BuildRequestArgs
- OpenAI provider now adds web_search tool to requests when enabled
- Uses OpenAI Responses API web_search tool type
- Websearch tool is added before other custom tools in the request

Implements websearch functionality for OpenAI and Azure OpenAI providers.

Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>

* feat(ai): implement websearch for Anthropic provider

- Created anthropic.rs provider with native Anthropic API format
- Added web_search tool to Anthropic requests when enabled
- Anthropic uses /messages endpoint with x-api-key authentication
- Updated query_builder to route Anthropic to new provider

Implements websearch functionality for Anthropic Claude models.

Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>

* feat(ai): implement websearch for Gemini/GoogleAI provider

- GoogleAI now uses completion endpoint (other.rs) for text instead of responses API
- Added Google Search grounding when websearch is enabled
- Uses google_search_retrieval tool in request when has_websearch is true
- Updated parse methods to use OtherQueryBuilder for completion endpoint

Implements websearch functionality for Google Gemini models.

Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>

* fix frontend

* fix anthropic and openai

* better for gemini

* structured output

* cleaning

* fix validate tool

* fixes

* cleaning

* cleaning

* fix for openai

* no responses api for azure

* fixes

* fix

* add tests for ai agent

* avoid panic

* better tests

* test user images

* fix tool choice

* always use streaming backend side

* big cleaning

* show annotations plus agent action for open ai websearch use

* show annotations plus agent action for anthropic websearch use

* show annotations plus agent action for google websearch use

* nit forntend

* rm

* fix

* add test for image ouptut

* fix for azure

* add in openflow

* fix

* fix

* nit tests

* fixes

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
Co-authored-by: centdix <farhadg110@gmail.com>
2025-12-22 11:41:28 +00:00
Diego Imbert 980dfcc366 fix: clear app form on submit option (#7428) 2025-12-22 10:40:11 +00:00
centdix 5f2101a32b feat(aiagent): allow giving messages history (#7395)
* handle messages array for ai agent

* better

* nit

* make tool_calls and tool_call_id nullable

* fix empty json behavior

* nits

* cleaning

* feat(backend): replace messages/messages_context_length with history oneOf field

Replace the separate 'messages' array and 'messages_context_length' fields with
a single 'history' field that uses a oneOf discriminator.

The 'history' field can be either:
- 'auto' mode: automatically manages conversation history with memory, takes a
  'context_length' number parameter
- 'manual' mode: bypasses memory and uses explicitly provided messages array

Backward compatibility is maintained: if 'messages_context_length' is provided
in the old schema format, it is automatically converted to 'auto' mode with the
specified context_length.

Co-authored-by: centdix <centdix@users.noreply.github.com>

* feat(frontend): replace messages/messages_context_length with history oneOf field

Replace the separate 'messages' array and 'messages_context_length' fields with
a single 'history' field in the AI agent schema.

The 'history' field uses a oneOf discriminator with two modes:
- 'auto': { mode: 'auto', context_length: number } - automatically manages
  conversation history with memory
- 'manual': { mode: 'manual', messages: array } - bypasses memory and uses
  explicitly provided messages

The schema includes comprehensive descriptions for each mode explaining the
behavior. The order array has been updated to include 'history' in place of
the old 'messages_context_length' and 'messages' fields.

Co-authored-by: centdix <centdix@users.noreply.github.com>

* fix(frontend): add support for 'mode' discriminator in oneOf rendering

Update ArgInput.svelte to properly handle oneOf schemas that use 'mode' as the
discriminator field, in addition to the existing 'kind' and 'label' support.

Changes:
- Updated tagKey derivation to check for 'mode' first, then 'kind', then 'label'
- Added 'mode' to the onOneOfChange function to track mode changes
- Added 'mode' to the list of keys excluded from enum validation
- Added 'mode' to hiddenArgs to prevent it from being shown in the form
- Added title fields to the history oneOf variants in flowInfers.ts

This allows the AI agent's history field to properly render with toggle buttons
for 'auto' and 'manual' modes.

Co-authored-by: centdix <centdix@users.noreply.github.com>

* fixes

* frontend fix

* nit

* cleaning

* cleaning

* better

* reword

* reword

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: centdix <centdix@users.noreply.github.com>
2025-12-20 15:43:44 +02:00