* feat: add right-click context menu to ObjectViewer
Add a contextual menu to ObjectViewer.svelte that appears on right-click
with three actions:
- Copy value: copies the field's value to clipboard
- Copy object key: copies the property key name
- Copy entire object: copies the parent object as JSON
Uses setContext/getContext to share the context menu handler across
recursive ObjectViewer instances, rendering a single menu at the root
level via Portal. Reuses existing contextMenuStyles for visual consistency.
Closes#8177
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* Fix popover closing
* Use existing ContextMenuItem patterns
* hover style
* close contextmenu on pointerdown outside
* try catch for circular objects
* Fix copying undefined not working
---------
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: Diego Imbert <diego@windmill.dev>
Co-authored-by: Diego Imbert <70353967+diegoimbert@users.noreply.github.com>
* chore(workmux): add name field to config
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Update .workmux.yaml
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix: preserve debouncing settings for post-preprocessing arg accumulation
After preprocessing completes, store the flow's debouncing settings in
runnable_settings_handle on v2_job_queue so that maybe_apply_debouncing
can find them when the surviving job is pulled. Without this, the handle
is NULL and arg accumulation silently does nothing for flows with
preprocessors.
Also adds a debouncing badge in flow settings and 4 focused accumulation
tests covering scripts, flows without preprocessor, flows with
preprocessor (with and without the fix).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: update sqlx prepared query for worker_flow.rs change
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix(frontend): preserve keycloak realm url between instance settings saves
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(backend): preserve provider-specific oauth fields through round-trip
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* docs: move autonomous-mode reference from CLAUDE.md to system prompt
Remove the autonomous-mode.md bullet from CLAUDE.md and instead reference
it via the workmux system prompt, matching the workmux-web pattern. Also
remove the duplicated "Dev Environment (tmux)" section from
autonomous-mode.md since that info is already in the system prompt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add autonomous-mode.md reference to wmdev sandbox system prompt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add drag-and-drop node movement in flow editor
Replace the 2-step click-based move with drag-and-drop: grab a node's
Move icon, drag it near an insert point, see a visual drop indicator,
and drop to move. Click-based move is preserved as fallback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: hide insert buttons on edges during drag-and-drop
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: unify drop zone and legacy move target styles
Use consistent dot indicator for both drag-and-drop and click-based
move targets. Use text-accent theming, hide insert buttons during drag.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: render real SvelteFlow graph in drag ghost for subflows
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: center drag ghost on the dragged node instead of the whole subflow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: pass isSubflow prop through drag system and improve move UX
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: fade entire subflow during legacy move and drag-and-drop
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* style: use text-secondary for move and drop target indicators
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: improve drag-and-drop visual feedback with proximity cues
Ghost opacity reacts to drop zone proximity (dims when far, brightens
when near). Add move icon badge near cursor that highlights on valid
drop target. Switch hit detection from circular radius to axis-aligned
bounding box matching the node gap dimensions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: unify DragGhost to always use MiniFlowGraph
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: scale drag ghost using flow viewport zoom instead of fixed width
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: register drop zone positions from BaseEdge instead of recomputing from node data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: hide node UI clutter during drag and polish drag ghost
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: fade all deeply nested nodes when dragging a subflow
Previously only immediate children of a dragged subflow would fade —
deeply nested nodes (e.g. steps inside a forloop inside a branchall)
stayed at full opacity. Store the full set of dragged node IDs on
DragManager and check set membership instead of single-parent comparison.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: rename DragManager to MoveManager and eliminate moving prop drilling
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: unify subflow node computation for both move modes
Extract getSubflowNodeIds() to moveManager.svelte.ts and populate
draggedNodeIds via a single $effect in DragCoordinator for both legacy
click-to-move and drag-and-drop. Consumers (MapItem, NodeWrapper) now
only check draggedNodeIds set membership instead of dual-checking.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: clean up drag-and-drop code review issues
Fix toggle risk in DragCoordinator by using forceSetMoving instead of
the toggle-based setMoving. Remove dead code (DragInfo unused fields,
parentSubflowId, GHOST_ZOOM_FACTOR, debug log), extract duplicated
expressions to $derived variables, and add missing type annotations.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: clear click-to-move when drag starts to prevent dual mode activation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: centralize draggedNodeIds cleanup in $effect
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: adjust insertion index when moving node forward in same array
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: address PR review feedback for node move feature
- Snapshot drag ghost once at drag start using untrack() to avoid
recomputing on every nodes/edges change during drag
- Rename setMoving/forceSetMoving to toggleMoving/setMoving for clarity
- Add capture: true to DragCoordinator's Escape handler for consistency
- Rename MOVE_BTN_OFFSET to DRAG_HANDLE_OFFSET with descriptive comment
- Move misplaced import to top of moveManager.svelte.ts
- Replace (n.data as any).offset with typed nodeOffset() helper
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: register asset/AI node types in MiniFlowGraph for drag ghost
MiniFlowGraph was missing asset, assetsOverflowed, aiTool, and
newAiTool node types, so these nodes rendered as invisible elements
that inflated the drag ghost bounding box. Register them so the
ghost renders all node types correctly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: resolve relative positions to absolute for xyflow child nodes in drag ghost
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: use initialViewport instead of fitView so drag ghost matches flow zoom
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* style: format BaseEdge.svelte
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: fade asset and AI tool nodes when their parent is being moved
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: include child nodes of edge-matched nodes in subflow ID collection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: hide +Tool button when moving nodes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: address PR review feedback (listener cleanup, set iteration, dead code)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* style: position cancel move button on top of node instead of above it
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: compute draggedNodeIds eagerly via callback instead of reactive effect
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: remove redundant parentModuleId from NodeWrapper
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: address PR review comments for drag ghost and move manager
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add missing grant_types field to instance config OAuth structs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add missing display_name and tenant fields to instance config OAuthClient
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: use Nix profiles in sandbox Docker image
Replace manual tool installs (rustup, nodesource, curl installers) in
sandbox-image/Dockerfile.sandbox with a single `nix profile install .#sandbox`.
All tools (Rust, Node, Bun, Deno, Go, gh, sqlx-cli, cargo-watch, Chromium,
Playwright, etc.) are now managed declaratively via flake.nix.
- Add `packages.sandbox` and `packages.sandbox-full` buildEnv outputs to flake.nix
- Add `sandbox-env` helper script for browser tooling env vars
- Update playwrightWrapper to export PLAYWRIGHT_BROWSERS_PATH
- Rewrite Dockerfile.sandbox: Nix replaces ~50 lines of manual installs
- Update entrypoint.sh to source Nix profile PATH
- Delete deprecated root Dockerfile.sandbox
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: sandbox image runs as non-root user with wmdev
- Rewrite entrypoint.sh to start PostgreSQL as current user (no
chown/su needed), fixing "Operation not permitted" when wmdev
runs containers with --user
- Add chmod -R 777 /root and passwd entry for UID 1000 so non-root
containers can access bashrc, nix-profile, and tool configs
- Remove apt postgresql server (Nix profile provides it)
- Fix bash history expansion errors from literal `!` in system prompt
- Fix asciinema path reference (available on PATH, not hardcoded)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: wrap pkg-config in sandbox profiles to bake in Nix search path
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add openssh-client and sudo to sandbox image for full root access
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: use useradd instead of manual passwd entry for sandbox agent user
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
The wmill_pg package (psycopg2 wrapper for running PostgreSQL queries)
has been fully replaced by Windmill's native PostgreSQL support.
Remove the package directory and all references from build, publish,
install, version, LSP, and dependabot configs.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Show recurring toast every 15s (8s duration) when loading takes long, with stop button
- When streaming by batches of 25 and a batch takes >4s, offer to stream 1 by 1
- Expose batch size in progress bar with editable input to customize on the fly
- Make stop button more prominent (destructive Button component)
- Fix list_jobs UNION: exclude queue jobs when filtering by result or is_skipped=true
- Add "Show skipped" preset to runs filter
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* perf: batch large job list requests and fix loadExtraJobs cursor
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: replace timeout toast with batch progress banner for large job lists
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: show loading indicator on Load more buttons
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: distinguish load-more vs auto-refresh loading indicators
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: offer to stream by batches of 25 when loading is slow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: remove refreshing text on auto-refresh and clean up unused loading prop
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: batch progress race condition when restreaming with small batches
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
The email_domain setting was accidentally removed from the frontend
instance settings in a recent onboarding cleanup. The backend still
fully supports it. This restores the setting in the Core section.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
When failures are sparse (<1%), filtering by failure status on the runs
page required scanning millions of success rows. Add a partial index on
v2_job_completed (workspace_id, completed_at DESC) WHERE status IN
('failure', 'canceled') and switch ORDER BY to completed_at when
filtering failures, so Postgres walks the small partial index directly.
Benchmarked at 5.2M rows / 1% failure rate:
- LIMIT 30: 800ms -> 0.4ms (2000x faster)
- LIMIT 1000: 550ms -> 21ms (26x faster)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* perf: lazy-load markdown in Tooltip to reduce stores2 chunk by 335KB
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: migrate TooltipInner to Svelte 5 runes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* perf: remove markdown rendering from Tooltip components
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: use HTML tables for date format tooltips to preserve formatting
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* chore: update vite to 8 beta, vite-plugin-svelte to 7, vitest to 4.1 beta
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: add .npmrc with legacy-peer-deps for vite 8 beta
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix: copy deps and remove user auto-add on workspace fork
Clone workspace_dependencies to forked workspaces and remove
automatic workspace_invite creation for parent workspace users.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: update sqlx offline cache
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Support arg type decl in postgres
* Python datatable client no longer requires explicit arg typing
* compilation fix
* Set correct type in statement exec
* reset to main
* Explicit pg arg types
* remove code duplication
* update parser js
* FLOAT8 doesn't have space
---------
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
Add docsUrl to the Google service config in WorkspaceIntegrations so a
"Docs" button appears next to the Google integration, linking to
https://www.windmill.dev/docs/core_concepts/native_triggers#google-triggers.
This follows the same pattern already used for Nextcloud.
Closes#8090
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: Henri Courdent <122811744+hcourdent@users.noreply.github.com>
When connecting Nextcloud via workspace integration OAuth, the resource
now includes baseUrl (from OAuth config) and userId (fetched from
Nextcloud OCS API) alongside the token, making it immediately usable
by scripts. Falls back to token + baseUrl if user info fetch fails.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: slim down claude instructions for lean context and fast iteration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add private and license feature flags to enterprise validation docs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add /refine skill for end-of-session doc evolution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: remove architecture.md overview doc per research findings
General codebase overviews distract agents and trigger unnecessary
exploration. Keep only operational docs (validation, enterprise).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add autonomous mode doc for bypass permission workflows
Covers: plan-first requirement, tmux pane usage for checking
backend/frontend logs, manual testing via Playwright MCP,
Playwright gotchas, and end-of-task summary expectations.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add mermaid, playwright, and asciinema tools to autonomous mode doc
Claude should use mmdc for diagrams during planning, playwright CLI for
screenshots of frontend changes, and asciinema for terminal recordings
of CLI changes. All attached to the PR.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: use pastebin for screenshot/recording uploads
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address PR review findings
- Remove stale docs/architecture.md reference from /refine skill
- Fix script name: ./update-sqlx -> ./update_sqlx.sh
- Remove .claude/settings.local.json mention from enterprise doc
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: rewrite flake.nix from scratch for clarity and modularity
Rewrite the Nix flake with clean separation of concerns, organized
let-bindings, and 4 purpose-specific devShells instead of a monolithic
default shell with broken package outputs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add CLI tools to default devShell (gh, aws, playwright, mermaid, asciinema)
Add tools needed for AI agent workflows and dev tooling:
- gh (GitHub CLI)
- awscli2
- asciinema (terminal recording)
- playwright-driver with Nix-managed browsers
- mermaid-cli (diagram generation)
Playwright browsers are provided via nixpkgs' playwright-driver.browsers.
Mermaid/Puppeteer reuses the headless_shell from the same browser set.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: move wm-minio scripts to default devShell
MinIO (local S3) is needed for regular development, not just the full
profile.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: use playwright wrapper + chromium for browser tools
Replace playwright-driver (library, no CLI) with:
- A `playwright` wrapper script that calls the Nix playwright-core CLI
(version-matched to its own Nix-provided browsers)
- pkgs.chromium for Mermaid/Puppeteer (which respects PUPPETEER_EXECUTABLE_PATH)
This fixes playwright screenshot and mermaid diagram generation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: auto-load .env.local from main worktree in all devShells
Gitignored files like .env.local don't exist in git worktrees.
Add a shared shellHook that resolves back to the main tree via
git-common-dir and sources .env.local if present. This ensures
AWS credentials and other secrets are available in worktrees.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: replace deprecated pkgs.hostPlatform with stdenv.hostPlatform
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: remove AWS CLI from flake and sandbox images
Pastebin is sufficient for screenshot sharing; AWS credentials
add unnecessary complexity.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address PR review — ruby mismatch, quoting, shell dedup
- Fix pkgs.ruby → pkgs.ruby_3_4 in extraRuntimeVars to match extraRuntimes
- Replace $* with "$@" in all helper scripts (wm, wm-build, wm-caddy,
wm-bench, wm-cli) to correctly preserve argument boundaries
- Extract coreBuildInputs, browserVars, and playwrightWrapper as shared
let-bindings to eliminate duplication between default and full shells
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: remove .env.local auto-loading from devShells
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>