Superset Updates & Release Notes

Follow

35 updates curated from 37 sources by the Releasebot Team. Last updated: May 19, 2026

Get this feed:
  • May 17, 2026
    • Date parsed from source:
      May 17, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    Automations, CLI, and Slack bot

    Superset adds automations, a richer CLI and TypeScript SDK, and a more capable Slack agent that can spin up workspaces and coding runs. It also brings mobile app internal review, team-aware workflows, terminal resilience, and assorted workspace, terminal, and UI improvements.

    Superset is now usable from a lot more places than the desktop app: a fleshed-out CLI and TypeScript SDK, a Slack agent that spins up workspaces on its own, and a mobile app heading into internal review.

    Automations

    Automations are cron jobs for agent sessions. Pick a project, write a prompt, set a schedule — and Superset dispatches an agent run against a fresh workspace every time it fires. The output is a live workspace you can open, review, and continue interactively.

    Typical uses:

    • Nightly standups — summarize PRs, issues, and activity from the last 24 hours
    • Release notes — draft from merged commits each week
    • Security & dependency sweeps — scan for vulnerable packages or deprecated APIs every morning
    • Long-running refactors — "bump TypeScript to 5.7 in the next un-migrated package" on a daily cadence

    This batch brings automations into their own as a first-class workflow:

    • Prompt version history — every edit to an automation's prompt is snapshotted. Browse previous versions and restore any of them, so an accidental change is no longer a one-way door.
    • Redesigned automations tab — new layout that makes a queue of runs easier to scan at a glance.
    • Mine vs. Team filter — automations now belong to a team. Filter the runs view between Mine and Team to see only what you ran vs. everything your team kicked off.

    Drive them from the CLI

    Everything you can do in the UI is now scriptable. New in this batch: prompt get / prompt set and the --name filter on list.

    # create a recurring run from a prompt file
    superset automations create \
    --name "Nightly audit" \
    --rrule "FREQ=DAILY;BYHOUR=3;BYMINUTE=0" \
    --project <projectId> \
    --agent claude \
    --prompt-file prompt.md
    
    # manage the queue
    superset automations list --name "Nightly"
    superset automations pause <id>
    superset automations resume <id>
    
    # iterate on the prompt (backed by the new version history)
    superset automations prompt get <id> > prompt.md
    $EDITOR prompt.md
    superset automations prompt set <id> --file prompt.md
    
    # fire one off-schedule (also works from the SDK / Slack bot / MCP)
    superset automations run <id>
    

    superset automations run is also exposed via the TypeScript SDK and MCP, so you can dispatch runs from a CI job, an internal admin panel, or a Slack slash command. See the Automations docs for the full surface.

    Superset CLI

    The superset CLI grew real project and workspace commands and a cross-device login flow.

    New commands:

    • superset projects create — scaffold a new Superset project from your shell.
    • superset projects setup — link an existing local repo to a Superset project.
    • superset workspaces open — open a workspace directly from the terminal.
    • superset auth login — now uses OAuth device code + PKCE, so it works on headless servers and across devices.

    Setting it up:

    # install
    curl -fsSL https://superset.sh/cli/install.sh | sh
    # or: brew install superset-sh/tap/superset
    # or: it's already bundled with the desktop app at ~/.superset/bin/superset
    
    # sign in (opens a browser, or prints a code for a second device)
    superset auth login
    
    # scaffold a project and open a workspace
    superset projects create
    superset workspaces open
    

    The accompanying TypeScript SDK (@superset_sh/sdk) mirrors the CLI 1:1 — same procedures, same shapes — so anything you can do from your shell, you can do from a script, a CI job, or an internal tool.

    Linux superset start and superset update are now fixed.

    Slack bot

    @superset in Slack is now an actual agent, not a task-filer. Mention it in a channel or DM it from anywhere, and it can:

    • Create, update, search, and triage tasks from the conversation it's standing in — pulling assignees, statuses, and priorities from your team's Linear/Superset setup.
    • Spin up a cloud workspace and launch a coding agent to actually do the work. For code-change requests (e.g. "@superset bump our Sentry SDK to v9 across all apps"), it now defaults to spawning a workspace and agent rather than just filing a ticket.
    • Read the thread or channel history on its own to gather context — no need to copy-paste the prior messages.
    • Search the web with citations when a request needs up-to-date info.
    • Unfurl Superset task and workspace links with rich previews when they're shared in a channel.

    Setting it up:

    In the dashboard, go to Integrations → Slack.
    Click Connect to install the Superset Slack app into your workspace (OAuth).
    Mention @superset in any channel, or open a DM with the bot, and describe what you want done.

    If Slack was already connected before this release, no action needed — proactive workspace creation is on by default.

    Mobile: internal review

    The mobile app is in internal review. Core flows — workspaces list, task triage, agent chat, and the live terminal viewer — are wired up against the same APIs as web and desktop. We're dogfooding on-device now ahead of a wider beta.

    Also in this batch

    • Teams as a first-class primitive — assign members, workspaces, and automations to a team. Powers the Mine/Team automations split above.
    • Terminal sessions survive app updates — the PTY daemon hands off file descriptors on upgrade, so running shells stay alive when Superset auto-updates.
    • Web terminal presets — run your common commands with a single click in the web terminal, same as desktop.

    Minor updates

    V2 changes tab gained inline stage/unstage/discard controls and diff comments gained a copy action. Workspaces can be started with a preset for repeatable agent runs. The relay server now drains tunnel connections cleanly on shutdown ahead of the multi-region rollout. Theme search in the command palette. macOS notifications now include workspace and project context. MCP OAuth access token TTL bumped to 7 days.

    Original source
  • May 12, 2026
    • Date parsed from source:
      May 12, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    feat(cli): add projects setup command #4356

    Superset adds `projects setup` to adopt an existing v2 cloud project on a new host without creating a duplicate. It supports clone or import modes, allows relocation when re-importing, and behaves idempotently. The CLI also bumps to 0.2.14.

    Adopt an existing v2 project on a host without creating a duplicate — the dedup counterpart to projects create. Without this, anyone setting up Superset on a new machine and reaching for the CLI would always create a fresh cloud project, even if their org already has one for the same repo.

    superset projects setup <id> (--host <id> | --local) (--parent-dir <path> | --import <path> [--allow-relocate])
    
    • Positional <id> is the cloud project UUID (find it via superset projects list).
    • --parent-dir <path> triggers clone mode — URL comes from the cloud project, so no --clone <url> needed.
    • --import <path> registers an existing folder.
    • --allow-relocate permits re-importing at a different path when the project is already set up here.

    Wraps host-service project.setup, which already handles the no-op-when-already-set-up case and the linkRepoCloneUrl write-back when an imported folder has a remote the cloud project doesn't yet know about.

    Pairs with projects create to mirror the desktop's two-button UX (Create vs Import).

    Bumps cli 0.2.13 → 0.2.14.

    Test plan

    • Completed --help and validation cases (mutex, --allow-relocate requires --import)
    • Completed live: superset projects setup <id> --local --import <path> against a project already set up returned the existing mainWorkspaceId (idempotent)
    • Incomplete: superset projects setup <id> --local --parent-dir <path> clones a fresh checkout for a project with repoCloneUrl
    • Incomplete: superset projects setup <id> --local --import <path> for a project with no repoCloneUrl writes back via linkRepoCloneUrl if the folder has a remote
    • Incomplete: superset projects setup <id> --host <remote> --parent-dir <path> works against a remote host through the relay

    Summary by cubic

    Add superset projects setup to attach an existing cloud project to a target host without creating a duplicate. Supports clone or import modes and is idempotent.

    New Features

    • New command: superset projects setup <id> targeting --host <id> or --local.
    • Modes: clone with --parent-dir <path>, or import with --import <path>; --allow-relocate permits re-import at a new path.
    • Validation: require exactly one of --parent-dir / --import; --allow-relocate only with --import.
    • Uses host-service project.setup; no-op if already set up and writes back missing repo URL when importing.

    Dependencies

    • Bump @superset/cli from 0.2.13 to 0.2.14.

    Summary by CodeRabbit

    • New Features: Introduced project adoption command with support for clone and import modes, configurable host targets, and relocation options.
    • Chores: CLI version updated to 0.2.14.

    Additional notes

    • The mutex error message fires for "neither provided" case too, which may confuse users who omit both mode flags. This is worth a second look before shipping user-facing docs.
    Original source
  • All of your release notes in one feed

    Join Releasebot and get updates from Apache and hundreds of other software products.

    Create account
  • May 5, 2026
    • Date parsed from source:
      May 5, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    feat(cli): add workspaces open command #4258

    Superset adds a workspace open command for the desktop app, resolving a workspace ID in the active org and launching superset://v2-workspace/<id>. It also supports --print and --json for scriptable use, with clearer errors for missing or duplicate matches.

    New

    superset workspaces open resolves a workspace in the active org and opens superset://v2-workspace/, picked up by the desktop app's existing deep-link handler (apps/desktop/src/main/index.ts).

    Accepts a UUID (looked up via v2Workspace.getFromHost) or exact name (looked up via v2Workspace.list, errors on multiple matches).

    --print (and non-TTY by default) emits the URL instead of launching the GUI, so it stays scriptable for CI / agent contexts. --json / --quiet work via the framework.

    Test plan

    • superset workspaces open --help shows the new subcommand
    • superset workspaces open launches the desktop app at /v2-workspace/
    • superset workspaces open resolves a unique workspace by name
    • Two workspaces with the same name → clear error listing IDs
    • Unknown UUID / name → clear "not found" error
    • superset workspaces open --print prints the URL without opening
    • Piping to a file (non-TTY) prints the URL without opening
    • --json returns { id, name, url }

    Summary by cubic

    Add superset workspaces open to open a workspace in the desktop app via superset://v2-workspace/.
    --print outputs the deep link; launch is cross‑platform and errors are reported.

    New Features

    • Requires a UUID; resolves via v2Workspace.getFromHost. Clear errors for invalid or unknown IDs; requires an active org.
    • Cross‑platform launch (open / start / xdg-open); --json returns { id, name, url }. No name matching—use superset workspaces list to find IDs.

    Bug Fixes

    • Always launches the desktop app unless --print is set; non‑TTY no longer defaults to printing.
    • Use spawn with arg arrays, detach/unref so the CLI exits, and surface launch errors (e.g., missing xdg-open).
    • Sorted apps/desktop dependencies alphabetically (no functional change).

    Summary by CodeRabbit

    New Features

    • CLI command to open a workspace by a single required workspace ID; returns id, name, and deep-link URL.
    • Honors a --print option to only output the URL; otherwise attempts to launch the Superset desktop app and returns a message.

    Bug Fixes

    • Now requires an active organization and reports if no matching workspace is found.

    Chores

    • Minor package.json dependency reordering.

    Security Review

    Shell injection (command.ts openUrl): The URL is interpolated directly into shell strings passed to exec (open "${url}", start "" "${url}", xdg-open "${url}"). The id in the name-lookup path comes from an API response with no client-side format check, so a server-returned ID containing " or shell metacharacters would escape the string context and execute arbitrary commands. Replace exec with execFile and pass the URL as a discrete argument.

    Important Files Changed

    packages/cli/src/commands/workspaces/open/command.ts — the openUrl helper and the UUID lookup endpoint both need attention before merging.

    Flowchart

    [Mermaid diagram not included]

    Additional Notes:

    • The command no longer supports opening by exact workspace name; it now only works with IDs, which is a functional behavior loss for users/scripts that pass names.
    • Non-TTY environments will attempt (and likely fail) to open the desktop app.
    • The PR description states "non-TTY by default" — in CI/agent contexts where process.stdout.isTTY is falsy, the command should print the URL instead of invoking openUrl. The current code ignores TTY state entirely and always calls openUrl unless --print is explicitly passed. This will trigger spawn errors (or silent launcher failures) in every headless environment.
    • exec calls omit the callback, so any failure (desktop app not installed, xdg-open not found, OS permission error) is silently discarded while the command still reports success.
    • The UUID lookup path calls v2Workspace.getFromHost, which may scope results to the current host/machine, potentially excluding valid org-level workspaces.
    • Suggested fixes include switching from exec to execFile with argument arrays, surfacing errors, and clarifying error messages for host-scoped lookups.
    Original source
  • Apr 28, 2026
    • Date parsed from source:
      Apr 28, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    feat(cli): cross-device login via OAuth code + PKCE

    Superset adds cross-device CLI login with OAuth 2.0 PKCE, a copy-paste fallback for SSH and CI, and Bearer JWT auth for tRPC. It replaces the old loopback-only flow, improves login reliability, and updates the CLI and API auth path.

    Summary

    • Replaces the loopback-only /cli/authorize + /api/cli/exchange flow with Better Auth's first-class oauth-provider plugin (PKCE S256 + state + resource indicator)
    • CLI tries a loopback listener first (one-click happy path on local machines); falls back to a copy-paste page at /cli/auth/code (showing #) when loopback isn't reachable (SSH, CI, sandboxed envs) — same pattern as Claude Code's CLI
    • superset-cli OAuth client is seeded idempotently at API boot with both loopback ports (127.0.0.1:51789-93/callback) and the paste redirect URI
    • tRPC context now accepts the OAuth-issued JWT as a Bearer token via JWKS verification, mirroring the existing MCP route's auth path

    Why now

    superset auth login previously bound a local HTTP server and required the browser to redirect to it. That breaks for any CLI not running on the same machine as the browser — SSH hosts, dev containers, CI runners, cloud sandboxes — which is most of the realistic deploy surface for a developer CLI.

    The OAuth code + PKCE + paste flow (rather than the OAuth device-grant alternative) was chosen for parity with Claude Code's UX: short user codes are phishable and the paste flow feels more polished to technical users.

    Test plan

    • bun run lint passes
    • bun run typecheck passes (all 27 packages)
    • Loopback path: superset auth login on a local Mac binds 127.0.0.1:51789, browser auto-redirects, no paste needed
    • Paste path: SSH_CONNECTION=1 superset auth login (or run from an SSH'd host) prints the URL → browser → consent → copy code from /cli/auth/code → paste back into CLI
    • Multi-org consent picker appears for users with 2+ orgs (covered by existing consent page)
    • Token works: superset auth whoami and any tRPC-backed command succeed with the returned bearer
    • Cross-origin dev: 127.0.0.1:5760 no longer blocks HMR (added allowedDevOrigins)

    Summary by cubic

    Adds cross-device CLI login using OAuth 2.0 Authorization Code + PKCE via better-auth/oauth2, replacing the loopback-only flow. The API now accepts Bearer JWTs, and a copy-paste page enables SSH/CI login.

    New Features

    • CLI login uses loopback (127.0.0.1 ports 51789–93) or copy-paste at /cli/auth/code (#), with an in-terminal paste prompt; uses SUPERSET_WEB_URL for the paste redirect and drops the offline_access scope.
    • OAuth uses PKCE S256, state, and resource, exchanging via /api/auth/oauth2/token; browser opens only when possible.
    • tRPC context verifies OAuth-issued JWTs via JWKS and accepts Bearer tokens; removed /cli/authorize and /api/cli/{create-code,exchange}; added public /cli/auth/code.

    Migration

    • Deploy API/Web first, then update the superset CLI (old endpoints are removed).
    • Ensure a superset-cli OAuth client exists with PKCE, the paste redirect, and loopback ports; runtime seeding was removed.

    Summary by CodeRabbit

    New Features

    • CLI authentication now uses standard OAuth2 with PKCE support for improved security.
    • Added authorization code paste flow as a fallback when browser-based login is unavailable.

    Chores

    • Removed legacy CLI authorization endpoints and updated authentication workflow.
    • Improved CLI login prompts with better error handling and user guidance.
    • Added support for SUPERSET_WEB_URL environment configuration.

    Greptile Summary

    Replaces the bespoke loopback-only /cli/authorize + Redis exchange flow with a standards-based OAuth 2.0 Authorization Code + PKCE flow backed by Better Auth's oauth-provider plugin, adding a copy-paste fallback page (/cli/auth/code) for SSH/CI environments. The tRPC context is extended to accept the resulting JWT as a Bearer token via JWKS verification.

    Two functional gaps need attention before this lands:

    • JWT lacks org context: sessionFromOAuthBearer reads payload.organizationId to populate activeOrganizationId, but Better Auth's oauth-provider does not emit a custom organizationId claim by default. Every CLI-issued JWT will have activeOrganizationId: null, silently breaking any tRPC procedure that scopes data to the active organization.
    • Refresh token discarded: offline_access is requested and the exchange returns a refresh_token, but command.ts never writes it to config.auth, meaning users must re-authenticate once the access token expires.

    Confidence Score: 3/5

    Not ready to merge — two P1 issues cause silently broken org-scoped tRPC calls and wasted refresh tokens for all CLI sessions.

    Two independent P1 findings on the core auth path: missing org claim in JWT sessions and discarded refresh token. Either alone would cap the score at 4, but both together on the primary feature path warrants 3.

    apps/api/src/trpc/context.ts (organizationId claim), packages/cli/src/commands/auth/login/command.ts (refresh token storage)

    Additional notes:

    • The execCommand("copy") API is deprecated but still used as a fallback for clipboard copy.
    • The refreshToken field needs to be added to the config write and a silent-refresh path implemented.
    • The getWebUrl() function uses a heuristic that may produce mismatched redirect URIs; consider a SUPERSET_WEB_URL default or deriving from OAuth metadata.
    • Deployment notes include some preview deployment errors and cleanup.
    Original source
  • Apr 28, 2026
    • Date parsed from source:
      Apr 28, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    feat(sdk): add @superset_sh/sdk — TypeScript SDK mirroring the CLI 1:1 #3937

    Superset releases an external TypeScript SDK for Tasks, Automations, Projects, Hosts, and Workspaces, with CRUD, relay-backed host operations, typed errors, retries, timeouts, streaming, and new setup docs. The package ships as an early alpha for external use.

    New packages/sdk — external-client-facing TypeScript SDK that wraps the same tRPC procedures the CLI uses. Published as @superset_sh/[email protected].

    Verification

    End-to-end against prod (api.superset.sh):

    • ✅ Read sweep: tasks.list, tasks.retrieve, workspaces.list (62), projects.list (5), hosts.list (4), automations.list (4) + automations.logs for an owned automation
    • ✅ Automation control plane: retrieve, getPrompt, pause, resume
    • ✅ Relay round-trip: workspaces.createworkspaces.delete on a tunneled host (satya-sprite)
    • ✅ Dispatch: automations.run reaches the host service through the relay (saw the in-host stack frame; SDK end fully verified)
    • ✅ Consumed as an external dependency: fresh bun add @superset_sh/[email protected] in /tmp, runtime + tsc --noEmit both pass

    Test plan

    • CI typecheck passes (lint:fix excludes the SDK)
    • Reviewer can bun add @superset_sh/[email protected] and import Superset from '@superset_sh/sdk' outside the monorepo and read tasks
    • Smoke locally: cd packages/sdk && SUPERSET_API_KEY=… SUPERSET_ORGANIZATION_ID=… bun run examples/smoke.ts

    Summary by CodeRabbit

    • New Features
      • Released Superset TypeScript SDK v0.0.1-alpha.4 — public client for Tasks, Automations, Projects, Hosts, and Workspaces with CRUD, list/query, run/control, host-routed workspace ops, typed errors, retries/backoff, timeouts, streaming, multipart uploads, and robust query utilities.
    • Documentation
      • New README, API reference, and getting-started docs with installation, configuration, examples, and error-handling guidance.
    • Chores
      • Added package manifest, license, build tooling, versioning, and initial SDK packaging files.

    Security Review

    Two P1 findings:

    • API key exposure in debug logs: formatRequestDetails redacts api_key but not x-api-key (the actual header name), exposing raw sk_live_… keys at debug log level.
    • JWT relay auth silently overwritten by caller options: In hostMutation/hostQuery, ...options is spread after the JWT Authorization header object, so any caller-supplied options.headers silently replaces the relay auth, causing 401s on relay calls.

    Both issues are in critical paths (logging and relay) and need to be resolved before this ships externally.

    Important Files Changed

    Includes fixes for redacting x-api-key in debug logs and correcting header spread order to preserve relay JWT auth.

    Sequence Diagram and detailed code review comments are included in the full pull request.

    Note: The release is an early alpha version and includes explicit warnings about not being for production use yet.

    Original source
  • May 16, 2026
    • Date parsed from source:
      May 16, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    fix(cli): unbreak superset start and superset update on Linux #4635

    Superset fixes Linux CLI crashes in superset start and superset update by bundling the missing @mastra/core peer for @mastra/duckdb and staging updates on the install filesystem to avoid EXDEV rename errors. It also hardens Linux smoke tests to catch these issues earlier.

    Summary

    • superset start — ship @mastra/core (peer dependency of the unbundled @mastra/duckdb) into the CLI bundle; fresh installs were crashing at host-service boot with ERR_MODULE_NOT_FOUND.
    • superset update — stage the download on the install filesystem so the final rename doesn't fail with EXDEV when /tmp is a separate mount (the common Linux case).
    • Harden the Linux build smoke tests to actually exercise @mastra/duckdb, so this class of bug can't ship undetected again.

    Why / Context

    Two regressions made the standalone CLI unusable on Linux after the recent CLI port.

    superset start crash.

    @mastra/duckdb ships unbundled (its native bindings can't be inlined into host-service.js) and declares @mastra/core as a peerDependency. build-dist.ts's copyPackageWithDeps only walked dependencies, so @mastra/core and its transitive closure never landed in lib/node_modules. Every fresh install crashed on the first superset start:

    Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@mastra/core' imported from .../lib/node_modules/@mastra/duckdb/dist/index.js
    

    superset update crash.

    The updater staged the new release via mkdtempSync(tmpdir()) then renameSync()'d it onto the install root. On Linux /tmp is typically a separate mount (tmpfs), so the cross-filesystem rename failed:

    Error: EXDEV: cross-device link not permitted, rename '/tmp/superset-update-XXX' -> '/home/user/superset'
    

    How It Works

    • build-dist.ts — copyPackageWithDeps now also walks non-optional peerDependencies, recursively. A package shipped unbundled must have its peers resolvable from disk at runtime (a bundled consumer's inlined copy is invisible to it). Peers the installer didn't materialize are skipped best-effort; dependencies stay fatal-if-missing.
    • update/command.ts — the staging temp dir is created as a sibling of the install root (mkdtempSync(${installRoot}.update-`)) instead of in tmpdir(), so the final renameSync is always an intra-filesystem move.
    • Smoke tests (build-dist-linux-docker.sh + build-cli.yml) — after building, they now import("@mastra/duckdb") as ESM from a script placed inside lib/, mirroring how host-service.js resolves it. The previous smoke test only require()'d four native packages and never touched the host-service runtime imports — which is exactly why bug 1 shipped.

    Manual QA Checklist

    ☑ Docker linux-x64 build passes the hardened smoke test (@mastra/duckdb OK)
    ☑ Docker linux-arm64 build passes the hardened smoke test
    ☑ superset update EXDEV — reproduced the old failure with the published 0.2.17 binary under a separate-device /tmp, confirmed the patched binary succeeds
    ☑ Fixed build's host service boots end-to-end on a real Linux host (Fly machine) — listening + health.check OK
    ☑ A real mastra chat conversation works against the fixed build's host service

    Testing

    • bun run typecheck
    • bun run lint
    • Docker builds for both Linux targets via packages/cli/scripts/build-dist-linux-docker.sh (mirrors CI)

    Known Limitations

    • Separate, pre-existing issue (not addressed here): the host service holds a static auth token, so the relay tunnel can't re-authenticate once it expires. A ticket is being drafted for that.
    • The @mastra/core fix overlaps with commit 056771967 on feat-relay-graceful-drain (a simpler NATIVE_PACKAGES one-liner); whichever lands second should drop the duplicate. The peer-dependency walk here is the more general fix.

    Risks / Rollout

    • Risk: low — build-script + CLI-command changes only; no schema or API surface. The peer-dep walk only adds packages to the bundle (the tarball grows because @mastra/core's tree now ships, as required).
    • Rollback: revert the two commits; the next CLI release returns to the prior build-dist.ts / update behavior.

    Summary by cubic

    Fixes Linux failures in superset start and superset update. Bundles the missing @mastra/core peer for @mastra/duckdb and stages updates on the install filesystem to avoid EXDEV errors.

    Bug Fixes

    • Bundle non-optional peerDependencies for unbundled packages; ensures @mastra/core is present for @mastra/duckdb (prevents ERR_MODULE_NOT_FOUND on fresh installs).
    • Stage downloads as a sibling of the install root and rename in-place; avoids cross-device rename (EXDEV) when /tmp is a separate mount.

    Tests

    • Hardened Linux smoke test to import @mastra/duckdb as ESM from inside lib/, mirroring host-service resolution.

    Release Notes

    Bug Fixes

    • Improved update process stability by optimizing temporary directory placement to prevent cross-filesystem operation failures.

    Chores

    • Upgraded build system to gracefully handle optional peer dependencies.
    • Enhanced smoke tests to verify DuckDB compatibility across different module resolution scenarios in CI and Docker builds.
    Original source
  • May 18, 2026
    • Date parsed from source:
      May 18, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    feat(slack): make Slack agent proactive about spawning workspaces

    Superset updates its Slack agent prompt to better handle code-change requests by favoring workspace spawning and coding agents over passive task filing. The assistant now leans more toward action while keeping task tracking, context gathering, and Superset tool usage in view.

    Summary

    • Reframe the Slack agent's SYSTEM_PROMPT opener — it described the bot as a task-management assistant, but it can also spawn workspaces and run coding agents.
    • Add that capability to the "You can" list and add one guideline so the bot defaults to action: for code-change requests, prefer spawning a workspace + agent over just filing a task.

    Why / Context

    For "can someone fix X" style messages the bot tended to file a task or ask questions rather than kick off the work, partly because the prompt only framed it around task tracking. This nudges it toward action while keeping it a general Slack assistant.

    Testing

    • bunx biome check on the changed file — clean
    • No automated tests added (prompt-text-only change)

    Notes

    • Only the static SYSTEM_PROMPT string changed; the dynamic context interpolation (org, channel, members, statuses, hosts) is untouched.
    • The prompt is shared across the v1 and v2 MCP feature-flag paths (FEATURE_FLAGS.SLACK_MCP_V2). Workspace/agent spawning is a v2 capability; on v1 the bot adapts to the tools it's given.

    Summary by CodeRabbit

    Improvements

    • Slack assistant prompt updated to focus on Superset-related tasks and tool usage.
    • Guidance restructured to emphasize using Superset tools, workspace spawning, and launching coding agents.
    • Assistant more proactive: when intent is clear (especially for code changes), it favors spawning a workspace/agent to take action.
    • Retains task creation, formatting, error handling, sourcing, and context-gathering behaviors.

    Greptile Summary

    This PR rewrites the static SYSTEM_PROMPT in the Slack agent to make the bot proactively spawn workspaces and launch coding agents for code-change requests, rather than filing a task or asking clarifying questions.

    • Bias toward action section added: the model is instructed to spawn a workspace + agent whenever intent is reasonably clear, reserving tasks for explicit "track for later" requests.
    • Spawning workspaces and agents section added: step-by-step guidance to call superset_projects_list, check superset_workspaces_list for duplicates, derive a kebab-case branch slug, match the user's online host, and spawn via superset_workspaces_create/superset_agents_run.

    Confidence Score: 3/5

    The change is prompt-only, but the new spawning guidance names v2-specific tools that don't exist on the v1 code path, and the bias-toward-action instruction amplifies the impact of that mismatch on every code-change request routed through v1.

    The new sections hard-reference four tool names absent on the v1 MCP path; with the bias-toward-action instruction now in place, the model will actively try to spawn for any code-change request and on v1 will either error out or appear to comply without actually doing anything.

    apps/api/src/app/api/integrations/slack/events/utils/run-agent/run-agent.ts — the v1/v2 tool-name mismatch in the new prompt sections warrants a second look before merging.

    Spawning workspaces and agents

    • Before spawning, call superset_projects_list and pick the project that best matches the request. Match on repository name, project slug, and topic keywords drawn from the user's message and the thread/channel context.
    • If the request concerns the Slack app, Superset features, the tasks or automations UI, or anything about Superset itself, use the Superset project (slug: superset).
    • If several projects could plausibly match, pick the strongest candidate, state in one short sentence which you picked and why, and proceed — don't stall on the choice.
    • Also call superset_workspaces_list and check for an existing active workspace on a relevant branch. superset_workspaces_create always creates a new workspace, so when a relevant one already exists, mention it to the user instead of silently duplicating it.
    • Derive the branch name from the request as a short kebab-case slug (e.g. fix-slack-retry, add-csv-export).
    • For the host, use the requesting user's own machine when it appears online in the Hosts list in your context (match the host name against the current user); otherwise fall back to the sandbox host.
    • Spawn the agent as part of workspace creation when possible — superset_workspaces_create accepts an agents array — or call superset_agents_run against the workspace afterward. Use the claude agent preset unless the user asks for another. Give the agent a clear, self-contained prompt describing the change to make.

    Hardcoded superset slug is a silent failure risk

    The prompt hard-wires the string superset as the project slug for all Superset-related requests. If that project is ever renamed or its slug changes in the database, the bot will silently pass the wrong slug to superset_workspaces_create and the spawn will fail (or land in the wrong repo). A softer phrasing — e.g. "use the project whose slug or name best matches 'superset'" — would let the model recover by calling superset_projects_list and selecting the closest match at runtime.

    Additional notes:

    • Host-to-user name matching may always fall through to sandbox because the instruction assumes a host's name field correlates with the current user's display name or email, which may not hold true.
    • Consider surfacing ownership metadata to make the heuristic more reliable.

    Overall, this update makes the Slack agent more proactive in spawning workspaces and launching coding agents for code-change requests, improving efficiency and responsiveness.

    Original source
  • May 12, 2026
    • Date parsed from source:
      May 12, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    feat(teams): add teams as first-class org primitive

    Superset adds first-class teams to better-auth organizations with a Settings → Teams UI for creating, renaming, editing slugs, and managing members. It also enforces Linear-style team invariants, adds new tables and live data plumbing, and improves settings navigation and toasts.

    Adds teams as a first-class primitive under better-auth's organization plugin, with a Settings → Teams UI for CRUD and member management. Linear-style invariants — every org has ≥1 team, every member belongs to ≥1 team, and the system self-heals around the orphan edges.

    • New auth.teams and auth.team_members tables; reads via Electric collections + useLiveQuery, writes via tRPC wrappers around ctx.auth.api.* so org hooks fire server-side.
    • Settings → Teams list (with create) + per-team detail page (rename, edit slug, member list with add/remove, leave team, delete team).
    • Settings layout grows a real top chrome (NavigationControls) so users can back out of settings with the same affordance as elsewhere.

    Invariants (Linear-style)

    • ≥1 team per org. Default team seeded on org create; existing orgs backfilled with one team named after the org. allowRemovingAllTeams: false blocks deleting the last team.
    • ≥1 team per member. New org members auto-land in the oldest team (afterAddMember); existing members are backfilled into the default team so pre-teams users aren't dropped into an empty state.
    • No accidental orphans on leave/remove. beforeRemoveTeamMember rejects removal if it would leave the user with zero teams ("You should be a member of at least one team").
    • Self-healing team delete. beforeDeleteTeam re-homes would-be orphans into the next-oldest team before the FK cascade fires.
    • Org-leave cleanup. beforeRemoveMember clears all team_members rows for that user.

    Implementation notes

    • team_members.organization_id is denormalized via a BEFORE INSERT trigger so Electric can shape-filter with plain equality (no join through teams in the proxy).
    • Unique (team_id, user_id) prevents duplicate memberships; unique (organization_id, slug) enforces per-org slug uniqueness.
    • tRPC team.addMember / team.removeMember exist purely to enforce the active-org admin gate and route through ctx.auth.api.* so all org hooks fire. The beforeRemoveTeamMember invariant guards every caller (tRPC, direct authClient, future API surfaces).

    Test plan

    • Create new org → has a default team named after the org
    • Add a user to the org → they land in the oldest team
    • Create a second team, add a user to it → user shows up in both teams' member lists
    • Leave a team while you're in two → succeeds
    • Try to leave your only team → blocked with "at least one team" toast
    • Try to delete the org's only team → blocked
    • Delete a non-last team that has a member only in that team → member auto-moves to next-oldest team
    • Remove a member from the org → all their team_members rows disappear
    • Team slug uniqueness: try to create two teams with the same slug → rejected
    • Backfill: existing org members appear in the default team after migration

    Summary by cubic

    Adds teams as a first-class org primitive with a Settings → Teams UI for create, rename, slug edit, member management, leave, and delete. Enforces Linear-style invariants (≥1 team per org/member, self-healing deletes) and updates schema, hooks, clients, collections, proxy, settings search, plus better CRUD error handling with toasts.

    New Features

    • Backend: enable teams in better-auth (max 25, allowRemovingAllTeams: false, per‑org unique slug); hooks seed a default team on org create, auto‑add new members to the oldest team (idempotent insert), block removing a user’s last team, re‑home would-be orphans on team delete, and clear memberships on org leave; settings top chrome adds NavigationControls with safer Esc back‑nav; settings search includes Teams.
    • Data/Live: add auth.teams and auth.team_members with indexes and a trigger that always overwrites team_members.organization_id from its team; Electric collections for both; proxy adds where‑clause support for auth.teams and auth.team_members.
    • API/Clients/UI: tRPC team.addMember / team.removeMember with admin gate (self‑leave allowed); enable teams and required slug in desktop, mobile, and shared authClient; Settings → Teams list and per‑team detail (rename, edit slug, add/remove members, leave, delete); team create/update/delete now catch thrown rejections and show toasts.

    Migration

    • 0049 creates tables, indexes, and the trigger.
    • Backfill: create one default team per org (named after the org) and add all existing org members to that team.
    • Deleting the last team is blocked by plugin config.

    Additional notes

    • Two present defects on the core member-management paths need to be fixed before merging: afterAddMember hook inserts into team_members without a conflict guard, causing duplicate key errors; tRPC addMember and removeMember procedures never inspect the response from ctx.auth.api.*, so hook-level rejections are silently swallowed.
    • Lifecycle hooks include afterCreateOrganization (insert first team named after the org), afterAddMember (insert team_members row into the org's first team), beforeRemoveMember (delete all team_members rows for that user), with no default-team protection hooks beyond allowRemovingAllTeams: false.
    • Permission model inherits better-auth's org-level RBAC; team management permissions tied to org role (owner + admin can create, update, delete teams; members cannot create teams).
    • Membership semantics: team_members is opt-in; org members auto-added to first team for convenience but can leave any team freely; removing an org member removes all their team_members rows.
    • Visibility is org-scoped; task lists show all tasks in the user's org regardless of team membership; team_members does not gate read access.
    • UI improvements include updated settings header/draggable area and refined Escape key behavior in Settings.
    Original source
  • May 5, 2026
    • Date parsed from source:
      May 5, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    feat: pty-daemon fd-handoff — sessions survive daemon binary upgrades #3971

    Superset adds live PTY daemon handoff so terminal sessions survive daemon binary upgrades, with automatic background updates, safer failure handling, and improved version tracking. It also tightens desktop build validation and expands tests for snapshot transfer and session preservation.

    Phase 2 of the pty-daemon migration

    PTY sessions now survive daemon-binary upgrades. Pre-Phase-2, "Restart and update" SIGTERMs the daemon and all shells die in the gap. After this PR, the user clicks Update (or the upgrade happens automatically) and the new daemon binary takes over via fd inheritance — original shell PIDs survive untouched.

    Phase 1 (PR #3896) made daemon survive host-service restarts. Phase 2 makes it survive its own binary swap.

    Manually verified in dev today: opened 3 terminal panes, clicked Update three times in succession (chain 62492 → 51479 → 9048 → 62648), all 3 sessions preserved at every step with the same shell PIDs.

    How it works

    ┌─ supervisor (host-service) ───────────────────────────────────────┐
    │  update(orgId)                                                     │
    │   │ ① wire-message "prepare-upgrade" to running daemon            │
    │   ▼                                                                │
    │   ┌─ daemon A (running) ──────────────────────────────────────┐   │
    │   │ ② write snapshot.json (sessions, fdIndex, ring buffers)   │   │
    │   │ ③ spawn daemon B with stdio:                              │   │
    │   │    fd 3: 'ipc'  (Node IPC for upgrade-ack)                │   │
    │   │    fd 4..N: PTY master fds, one per live session          │   │
    │   │   argv: --handoff --snapshot=... --socket=...             │   │
    │   └────────────────────────┬──────────────────────────────────┘   │
    │   ┌─ daemon B (successor) ▼──────────────────────────────────┐    │
    │   │ ④ read snapshot, adoptFromFd for each PTY                │    │
    │   │ ⑤ process.send({ type: "upgrade-ack", successorPid })    │    │
    │   │ ⑥ wait for IPC `disconnect` (= predecessor exited)       │    │
    │   │ ⑦ listen() on the now-free socket path                   │    │
    │   └────────────────────────┬─────────────────────────────────┘    │
    │   ┌─ daemon A ◀────────────▼─────────────────────────────────┐    │
    │   │ ⑧ ack received → reply to supervisor → close + exit(0)   │    │
    │   └────────────────────────┬─────────────────────────────────┘    │
    │  ⑨ supervisor's adopted-liveness sees A dead → adopts B           │
    └────────────────────────────────────────────────────────────────────┘
    

    The kernel's fd refcount holds the master fds alive across the predecessor's exit (stdio inheritance is a dup, not a transfer). Shells never see SIGHUP.

    Auto-update on host-service upgrade

    When host-service boots and adopts a daemon whose runningVersion < EXPECTED_DAEMON_VERSION (i.e. host-service was just upgraded but the detached daemon is still on the old binary), the supervisor automatically calls update() in the background. Sessions survive on success. On failure, the old daemon stays running and the user retries via the Update button — we never silently force-destroy sessions.

    Concurrency-coalesced via per-org updateInFlight map: a manual Update click and the auto-update can race; the second caller observes the same outcome via the cached promise.

    Decisions (full /decide walkthrough in apps/desktop/plans/20260501-pty-daemon-phase2-implementation.md)

    1. What new daemon inherits: PTY master fds only (listener inheritance dropped after spike)
    2. Old daemon exit timing: Ack-then-exit (await upgrade-ack over IPC, then exit)
    3. Session metadata transport: Snapshot file + manifest pointer
    4. Restart UX: "Update" is default; "Force restart" stays as opt-in
    5. Handoff failure mode: Surface to user with dialog (Force update or Cancel)
    6. Handoff protocol: Separate IPC; client wire stays at v1

    Notable bugs caught + fixed during dev verification

    • Bundler DCE eliminated runHandoffReceiver (commit 0ecb2b550). Both Bun's bundler AND electron-vite's esbuild statically inline process.env.X references at build time, constant-fold the unset-at-build-time comparison, and dead-code-eliminate the entire receiver branch. The test suite ran source-direct or against the Bun-built package bundle; neither covered the desktop shim's electron-vite output where the failure mode lived. Fix: handoff signal moves from env to --handoff argv flag (fully dynamic, can't be statically analyzed). The desktop shim was a separate copy of pre-Phase-2 main() that needed to mirror the package's main; it's now in sync.
    • Regression-armored (commit a2d43c236): apps/desktop/scripts/check-pty-daemon-bundle.ts runs after compile:app and greps the desktop bundle for runHandoffReceiver, --handoff (≥2), upgrade-ack, adoptSnapshot, adoptFromFd. Build fails fast if any marker is missing.

    Test plan

    • bun test passes in packages/pty-daemon (34 tests, 6 files) and packages/host-service (450+ tests, 50 files)
    • node --experimental-strip-types --test test/handoff.test.ts in packages/pty-daemon (real cross-process daemon spawn, asserts shell PID survives)
    • node --experimental-strip-types --test src/daemon/DaemonSupervisor.node-test.ts in packages/host-service (9 real-spawn tests including auto-update)
    • bun run check:pty-daemon-bundle in apps/desktop after compile:app (5/5 markers present)
    • Manual QA: bun dev, open several v2 terminal panes, Settings → Manage daemon → Update daemon. Sessions stay alive; toast confirms.
    • Manual QA: Force restart still works (closes sessions, spawns fresh — the destructive escape hatch).

    Out of scope

    • Cross-platform. macOS arm64 validated. macOS x86_64 + Linux not yet exercised in this repo (Phase 0 harness apps/desktop/plans/pty-handoff-experiment/ exists for future stress runs).
    • EXPECTED_DAEMON_VERSION bump. This PR adds handoff plumbing but doesn't change daemon wire behavior, so no version bump. Bump when the next change actually changes the daemon's protocol surface.
    • Phase 0 Linux + high-N + SIGKILL stress. Test harness already in apps/desktop/plans/pty-handoff-experiment/; ship validation lives there.

    Documentation trail

    • apps/desktop/plans/20260501-pty-daemon-phase2-audit.md — current-state audit before design (on the design-doc branch)
    • apps/desktop/plans/20260501-pty-daemon-phase2-implementation.md — decision log + step sequencing (on the design-doc branch)
    • apps/desktop/plans/pty-handoff-experiment/listener-handoff/ — Phase 2 spike that forced D1 revision (on the design-doc branch)
    • packages/host-service/DAEMON_SUPERVISION.md — Phase 1 reference, unchanged here (will need a follow-up edit to mention Phase 2)

    Summary by cubic

    Preserve PTY sessions across daemon binary upgrades using fd-handoff. Also fixes the post-upgrade version-reporting bug that kept “Update available” after successful updates.

    Refactors

    • Versioning: single source of truth — EXPECTED_DAEMON_VERSION and DAEMON_PACKAGE_VERSION now derive from @superset/pty-daemon/package.json; package exports add ./package.json; bumped @superset/pty-daemon to 0.2.0.
    • Snapshots: switch to wire framing (encodeFrame / FrameDecoder), .snap files; snapshot helpers (clearSnapshot, readSnapshot, writeSnapshot) exported for the desktop shim.
    • Test coverage: adds byte-fidelity, cross-process handoff, replay-on-reconnect, and guards that auto-update failures do not disrupt sessions or overwrite the predecessor instance.
    • Desktop build: post-build smoke check verifies fd-handoff markers and uses fileURLToPath for Windows path compatibility.

    Bug Fixes

    • Fix “Update daemon” stuck as UPDATE AVAILABLE: successor ignores inherited SUPERSET_PTY_DAEMON_VERSION in handoff mode and reads its own bundle version; supervisor retries version probe after predecessor exit to cover the bind gap.
    • Robust handoff: wrap readSnapshot() in successor try/catch and reply upgrade-nak on failure; unlink snapshot on failed handoff; add an error listener to AdoptedPty writer; clearer spawn error by moving the cwd-not-directory check outside the catch.
    • Supervisor + env: host-service strips SUPERSET_PTY_DAEMON_VERSION from the successor’s env during handoff, waits for the predecessor PID to fully exit before probing the new socket version, and now bails with ok:false on timeout instead of probing anyway.
    • Renderer + host-service: prevent duplicate terminal output on daemon swap by skipping ring-buffer replay on WS reconnect, keyed off the first received byte (not just socket open) and plumbed as replayOnAdoption.

    Summary by CodeRabbit

    New Features

    • Live daemon update (handoff) to swap daemon binary without closing active terminal sessions
    • UI: "Update daemon" button with failure dialog and "Force update" fallback
    • Option to avoid replaying terminal scrollback on reconnect; transport honors reconnect flag
    • Supervisor can auto-apply bundled daemon updates opportunistically
    • End-to-end snapshot/handoff to transfer live session state and adopt PTY fds

    Chores

    • Build scripts split to add an explicit post-build bundle validation step
    • Daemon package version bumped

    Tests

    • Expanded integration and unit tests for handoff, snapshots, FD adoption, replay behavior, and concurrency guards
    Original source
  • May 17, 2026
    • Date parsed from source:
      May 17, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    [codex] add web terminal presets

    Superset adds a web terminal presets bar with shared SVG icons, letting users launch preconfigured terminal agents in one click. It also writes NEXT_PUBLIC_RELAY_URL during workspace setup so browser host-service calls use the allocated relay port.

    Add a web terminal preset bar backed by host agent configs, including the shared preset SVG icons used by desktop.

    Let web terminal creation pass an initial command so preset clicks launch the selected terminal agent.

    Write NEXT_PUBLIC_RELAY_URL from the workspace setup script alongside RELAY_URL so browser host-service calls use the allocated relay port.

    Summary by cubic:

    Adds a web terminal presets bar powered by host agent configs, letting users launch a preconfigured terminal in one click. Also enables browser host-service calls via NEXT_PUBLIC_RELAY_URL so the relay port is used correctly.

    New Features:

    • Presets bar with shared SVG icons, loading state, and disabled/running states.
    • Terminal creation accepts an initial command; clicking a preset builds the agent launch command and opens a terminal.
    • Host client: settings.agentConfigs.list to fetch presets and a helper to build the launch command; supports GET requests without input.
    • Adds svg.d.ts to allow importing preset SVGs.

    Migration:

    • Re-run the workspace setup to write NEXT_PUBLIC_RELAY_URL to the environment and restart the web app.

    Summary by CodeRabbit:

    New Features:

    • Added a terminal presets bar above the terminal area, allowing users to quickly launch predefined terminal configurations.
    • Terminal presets can now be executed with a single click, automatically creating new terminal sessions.
    • Improved terminal selection logic to better manage active terminal sessions.

    Bug Fixes:

    • Enhanced error handling and messaging during terminal operations.

    Greptile Summary:

    This PR adds a web terminal presets bar that fetches host agent configs and lets users launch a preconfigured terminal session in one click. It also fixes the relay URL for browser-side host calls by writing NEXT_PUBLIC_RELAY_URL during workspace setup, and replaces the useEffect-driven terminal selection with a cleaner derived activeTerminalId.

    Presets bar: WebTerminalPresetsBar renders preset buttons with SVG icons, per-button loading spinners, and a loading skeleton while configs are fetched; presets and terminals are loaded concurrently via Promise.allSettled.

    Shell command builder: buildHostAgentLaunchCommand single-quotes argv and overlays env vars, but does not incorporate promptArgs/promptTransport from the config — clarify whether those fields are intentionally out of scope for the initial launch.

    Settings button: The "Manage presets" gear icon button in the bar renders as interactive but has no onClick handler attached.

    Confidence Score: 4/5

    Safe to merge; the shell-quoting helpers and state management changes are correct, with two areas that need clarification or a quick follow-up.

    The core plumbing — relay URL, parallel preset/terminal loading, derived active terminal, and per-preset launch — is sound. Two items warrant attention: the Settings gear button is visually interactive but wired to nothing, and buildHostAgentLaunchCommand silently ignores promptArgs/promptTransport, which may be intentional but could also mean presets launch the agent binary without the expected initial prompt.

    Additional notes:

    • The Settings button is a no-op and should either be wired up or disabled/removed to avoid confusing UX.
    • Env variable keys are not shell-safe in envOverlayPrefix function; validation is recommended to prevent silent breakage or injection.
    • promptArgs and promptTransport are never used in the launch command; if the host agent needs an initial prompt injected, this needs to be wired into buildHostAgentLaunchCommand.

    Overall, this update introduces a new web terminal presets feature with improved usability and environment configuration, while highlighting some areas for follow-up improvements.

    Original source
  • May 5, 2026
    • Date parsed from source:
      May 5, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    feat(desktop): add discard + stage/unstage controls to v2 changes tab

    Superset adds v1-style discard and staging controls to the v2 workspace, including per-file discard actions, collapsible Staged and Unstaged sections, and Stage all or Unstage all toggles. It also adds host-service git mutations and safer confirm dialogs for destructive actions.

    Brings v1's discard / staging affordances to the v2 workspace.

    • Per-file discard on the diff viewer header (hover-revealed) and on sidebar file rows (hover overlay + right-click menu). All discards confirm via a shared DiscardConfirmDialog to prevent accidental loss.
    • Collapsible Staged / Unstaged section headers above the file list, each with always-visible Discard all (with confirm) and a Stage all / Unstage all toggle. Against-base / committed groups render as section headers without staging actions.
    • New host-service git mutations — discardChanges, discardAllUnstaged, discardAllStaged, stageAll, unstageAll. These belong on host-service (not the local Electron changes router) because v2 worktrees aren't registered in the local Electron DB that assertRegisteredWorktree checks. Each takes workspaceId and resolves through the host-service workspaces table; discardChanges validates filePath against absolute paths and .. traversal.

    Test plan

    • Modify a tracked file in a v2 workspace, hover the diff viewer file header, click the undo icon, confirm — change reverts and diff updates
    • Same flow from the sidebar file row hover overlay
    • Right-click a sidebar file row → "Discard changes" → confirm dialog reverts the file
    • For an untracked file, the dialog says "Delete" and the file is removed
    • On the Unstaged section header: click the plus icon → all files move to Staged; click the undo icon → confirm → working tree clean
    • On the Staged section header: click the minus icon → all files move back to Unstaged; click the undo icon → confirm → staged changes wiped (staged-as-added files deleted)
    • Sections only render when their group has files; collapsing the section hides its rows
    • Errors surface as toasts (e.g., simulate by modifying a file outside the worktree)

    Summary by cubic

    Adds discard and stage/unstage controls to the v2 Changes tab to match v1. Improves “Discard all staged” to safely revert staged changes (including renames/copies) without touching unstaged edits.

    New Features

    • Per-file discard in the diff header and sidebar rows, gated by a shared DiscardConfirmDialog. Untracked or staged-as-added files are deleted.
    • Collapsible “Unstaged” and “Staged” sections with Discard all (with confirm) and Stage all/Unstage all. “Against base” and “Committed” show without staging actions.
    • Host-service git mutations: discardChanges, discardAllUnstaged, discardAllStaged, stageAll, unstageAll. Each takes workspaceId, validates paths, refreshes status/diff, and surfaces errors via toasts.

    Bug Fixes

    • discardAllStaged now reverts tracked files, deletes staged-as-added files, and correctly handles staged renames (R) and copies (C) by restoring sources and removing new paths. Checkout is scoped to staged paths to avoid losing unstaged-only changes.

    Greptile Summary

    This PR ports v1's discard/staging affordances to the v2 workspace: per-file discard from the diff viewer header and sidebar file rows (both via a shared DiscardConfirmDialog), collapsible staged/unstaged section headers with "Discard all" and stage/unstage-all actions, and five new host-service tRPC git mutations that resolve through the workspaces table rather than the local Electron DB.

    discardAllStaged only deletes status.created paths after git reset HEAD -- ., missing the destination (.to) files of staged renames — those files remain in the working tree as untracked after the operation.

    discardChanges for an unstaged rename calls rm(newPath) correctly but never restores oldPath from HEAD, leaving it deleted in the working tree. The frontend call site also omits file.oldPath from the mutation payload, so the backend has no way to recover it even if the schema were extended.

    Confidence Score: 3/5

    Not safe to merge as-is; two P1 bugs cause incorrect working-tree state when discarding staged or unstaged renamed files.

    Two distinct P1 logic bugs in the backend git mutations affect renamed files, which are a supported workflow (the codebase has dedicated unstaged-rename detection logic). All other changes are clean.

    packages/host-service/src/trpc/router/git/git.ts (discardAllStaged and discardChanges mutations) and FileRow.tsx (confirmDiscard call site missing oldPath).

    Original source
  • May 12, 2026
    • Date parsed from source:
      May 12, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    feat(desktop): add copy actions and tighten layout for diff comment threads fix linking on comments

    Superset adds copy actions for diff comment threads and tightens thread width for better readability in wide diff columns. Reviewers can now copy individual comment bodies or thread links from the header, with quick visual confirmation on success.

    Summary

    • Cap the diff comment thread card at max-width: min(100%, 720px) with mx-3 margin so long review comments stay readable in wide diff columns
    • Add a copy button to each individual comment that copies the comment body to the clipboard
    • Add a copy-link button next to the existing "Open on GitHub" button in the thread header that copies the thread URL

    Test plan

    • Open a PR with review comments in the v2 workspace diff pane
    • Verify thread cards no longer stretch the full content column width and are inset from both edges
    • Click the copy icon on a comment row → body is in clipboard; icon flips to green check for ~2s
    • Click the copy-link icon on the thread header → thread URL is in clipboard; icon flips to green check for ~2s
    • External-link icon still opens GitHub in a new tab

    Summary by cubic

    Adds copy actions for diff comments and markdown details. Tightens thread width for better readability.

    New Features

    ◦ Cap thread cards at max-width: min(100%, 720px) with mx-3.
    ◦ Header copy button copies the comment body (or all with author prefixes) with a short success check; "Open on GitHub" still shows when available.
    ◦ Markdown details blocks now have a small copy button that copies their inner content (excluding the summary).

    Refactors

    ◦ Remove the per-comment copy button; the header action covers this.

    Summary by CodeRabbit

    New Features

    ◦ Added a "copy comment(s)" control to comment threads with a short visual confirmation when copying succeeds.
    ◦ Added copy-to-clipboard for expandable Markdown "details" blocks, with a brief checkmark confirmation on success.

    Style

    ◦ Capped comment display width (max 720px) to improve layout and readability across viewports.

    Greptile Summary

    This PR adds clipboard copy actions to diff comment threads — a per-comment copy button and a copy-link button in the thread header — and caps the thread card width at 720 px with horizontal margins to improve readability in wide diff columns.

    Copy buttons: both CommentThread (copy-link) and CommentRow (copy-body) use a useState + useEffect timer pattern that flips to a green check for 2 s; errors surface as toasts. The pattern has a stale-timer edge case on rapid double-clicks.

    Layout tweak: comment-thread.css replaces width: 100% / max-width: 100% with max-width: min(100%, 720px), and mx-3 is added to the card's className to inset it from both edges.

    Confidence Score: 4/5
    Safe to merge; both copy flows handle errors gracefully and the layout change is a straightforward CSS constraint.

    The clipboard copy pattern in both components doesn't refresh the 2-second feedback timer when the user clicks rapidly, so the 'Copied' icon can disappear early. This is a minor UX edge case, not a data or functional regression. The items-baseline row containing the new button is the only visual concern. No logic paths are broken.

    CommentThread.tsx — both the CommentThread and CommentRow components share the stale-timer pattern worth revisiting.

    Original source
  • May 16, 2026
    • Date parsed from source:
      May 16, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    feat(relay): graceful tunnel drain on SIGTERM

    Superset adds a graceful tunnel-drain flow for relay shutdowns so hosts reconnect faster during rolling deploys. It closes active WebSockets cleanly, resets host reconnect backoff on drain signals, and aims to cut multi-region deploy outages from about 60 seconds to a few seconds.

    Discovered during a multi-region rolling-deploy game-day on superset-relay-staging: every relay-machine restart left host tunnels disconnected for ~60s before they reconnected. That outage compounds across regions during multi-region deploys, so it's a blocker for rolling multi-region to prod cleanly.

    Root cause

    1. Fly sends SIGTERM to the relay process during a rolling deploy.
    2. Relay had no SIGTERM handler — the process just exits, leaving every open WS as a TCP-RST'd socket from the host's perspective.
    3. Host-service's exponential reconnect backoff (RECONNECT_BASE_MS=1s, RECONNECT_MAX_MS=30s) climbs into the 30s/attempt tail after 6 failed attempts while the relay is down (30-40s).
    4. By the time the relay comes back, the host is mid-30s-wait. Worst case is ~60s before the next attempt fires and the WS re-establishes.

    Game-day timings

    • 04:02:41Z — SJC machine restart (sandbox WS killed)
    • 04:02:42Z — SJC listening again
    • 04:03:45Z — sandbox re-registered (63s gap from restart)

    Fix (two-sided)

    Relay (apps/relay/src/tunnel.ts + apps/relay/src/index.ts)

    • New tunnelManager.drain() that walks every open WS and closes it with code 1001 ("Going Away"), waits 250ms for close frames to flush, then exits.
    • Wired to SIGTERM in index.ts so Fly's pre-stop signal triggers the clean drain.

    Host (packages/host-service/src/tunnel/tunnel-client.ts)

    • socket.onclose now recognizes code 1001 specifically and resets reconnectAttempts = 0 before scheduling the next attempt. The next reconnect fires at the 0.5-1s base delay instead of the saturated 30s tail.

    Together: deploy outages should drop from ~60s to ~2-5s per affected host.

    Test plan

    • Deploy this branch to superset-relay-staging via ./apps/relay/scripts/deploy-staging.sh.
    • Re-run the rolling-deploy game-day: trigger a redeploy, watch sandbox + satyas-mbp tunnels in staging logs, confirm re-registration happens within ~5s of each machine coming back (instead of ~60s).
    • Confirm no zombie directory entries — disposeTunnel cleans pingTimer/pendingRequests on close, and the existing unregister path on the next onclose of the host-side socket fires correctly.

    Out of scope (separate concerns to track)

    • The shorter-term mitigation "lower RECONNECT_MAX_MS" was considered but rejected — under genuine sustained outages we still want backoff to prevent storms. The 1001-reset path is the right shape: fast retry only when the relay clearly told us "I'm going away".
    • Cloud-DB lag (is_online staying stale after re-register) — tracked separately; this PR doesn't touch the scheduleOnlineWrite path.
    • Synthetic check on staging — nice-to-have but not blocking.

    Summary by cubic

    Gracefully drains relay tunnels on SIGINT/SIGTERM: stop new connections, send an in-band “drain” message, close with WS code 4001 so hosts reconnect immediately, and await directory cleanup before exit. Cuts deploy-time outages to ~1–5s, clears stale directory entries, and adds Fly lifecycle settings plus region-aware smoke tests for safer multi‑region deploys.

    New Features

    • Relay (apps/relay): on SIGINT/SIGTERM call server.close(), broadcast {type:"drain"}, close with code 4001, reject new registers while draining, await batched directory cleanup, then exit. Set kill_signal = "SIGINT" and kill_timeout = "10s" in fly.toml and fly.staging.toml.
    • Host (packages/host-service): on {type:"drain"} or close code 4001, reset reconnectAttempts and reconnect immediately; cap RECONNECT_MAX_MS at 5s. Protocol adds drain message (packages/shared).
    • Deploy/ops: add apps/relay/scripts/deploy-staging.sh; add region-aware smoke-test.sh and run it from both deploy scripts to verify /health per region.

    Bug Fixes

    • Relay directory: batch-clear self-owned entries via a single Redis EVAL on startup and during drain; await cleanup before exit to prevent stale routing and incorrect is_online.

    Summary by CodeRabbit

    New Features

    • Relay now gracefully drains active connections on shutdown to reduce abrupt disconnects.
    • Relay startup clears stale directory entries from prior processes to avoid stale state.
    • Tunnel clients detect relay-initiated shutdowns and reconnect immediately with faster retry behavior.

    Chores

    • Added deployment script and runtime lifecycle settings to enable rolling deploys with graceful shutdown.

    Additional notes from greptile-apps Bot

    This PR adds a graceful tunnel-drain path to the relay so that rolling deploys no longer leave host-services in exponential-backoff limbo (~60 s) after a SIGTERM. The relay closes every open WebSocket with code 1001 before exiting, and the host-service now recognises code 1001 as a clean drain signal and resets its reconnect counter so it retries within ~1 s.

    Confidence Score: 3/5

    Known issue: The close-code collision with the existing ping-timeout path means the host-service cannot distinguish the two scenarios and may trigger reconnect storms under load. The relay's existing ping-timeout handler already closes host sockets with code 1001. The new client-side logic resets backoff for any code-1001 close, so a wave of ping timeouts during relay overload would produce the same thundering-herd that the exponential backoff was designed to suppress. apps/relay/src/tunnel.ts and packages/host-service/src/tunnel/tunnel-client.ts need a consistent, distinct close code for the deploy-drain signal vs. the ping-timeout path.

    Code changes include wiring SIGTERM to tunnelManager.drain(), which closes all tunnels with WS code 1001 and waits 250 ms for frames to flush, then exits. The host-service resets reconnectAttempts=0 when event.code === 1001, bypassing saturated backoff for what the client treats as a clean relay restart.

    The deploy-drain path reduces deploy outages from ~60s to ~2-5s per host, improving multi-region rolling deploy stability.

    Original source
  • May 14, 2026
    • Date parsed from source:
      May 14, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    fix(desktop): filter themes by query in command palette theme submenu #4573

    Superset fixes command palette theme search so the Theme submenu now filters by theme name, ID, and heading, including System. Typing in the palette works again, and the empty state appears when no themes match.

    Summary

    • Typing in the command palette did nothing once inside the Theme submenu — the input was visible but never narrowed the list.

    • CommandPalette disables cmdk's built-in filter for any frame using renderFrame (frames are expected to filter themselves, like LinkTaskFrame does via useHybridSearch). ThemeFrame never read the query, so search silently broke.

    • ThemeFrame now reads useCommandPaletteQuery() and substring-matches against heading + theme name + theme id, so "dark", "solar", or an id all work. still fires when nothing matches.

    Test plan

    • Open command palette, navigate into Theme submenu, type "dark" — only dark themes show
    • Type "solar" (or any theme name) — only matching themes show
    • Type "system" — System row shows; type gibberish — "No themes found." renders
    • Clear the input — full list comes back

    Summary by cubic

    Fixes broken search in the command palette Theme submenu. Typing now filters themes by name, id, and group heading, including the System option.

    Bug Fixes

    ◦ ThemeFrame reads useCommandPaletteQuery() and filters with a case-insensitive substring match.

    ◦ Matches heading + theme name + theme id; includes "System".

    ◦ Hides non-matching items; shows the empty state; separator only when "System" and a group are visible.

    ◦ Stabilized auto-updater.test.ts with a self-contained electron-log/main mock to avoid CI order flakiness.

    Summary by CodeRabbit

    New Features

    ◦ Command palette theme selection now supports search-aware filtering: Light, Dark, Custom, and System entries are shown or hidden based on your query (case-insensitive substring matching). The System option appears only when relevant, and separators adjust for a cleaner list while searching.

    Tests

    ◦ Improved auto-updater tests with a defensive logger mock to prevent CI flakiness.

    Greptile Summary

    This PR fixes silent search in the Theme submenu of the command palette. Previously, ThemeFrame never consumed the query state, so typing in the input had no effect once inside the submenu; this change wires up useCommandPaletteQuery() and applies a simple case-insensitive substring filter across heading, theme name, and theme ID for each group.

    • Manual filtering is added to ThemeGroup and the System row via a new matchesQuery helper; fires correctly when all groups filter to zero items.
    • A minor visual edge case exists: the CommandSeparator between the System row and the theme groups can be left dangling when a query matches "system" but matches no themes in the Light/Dark/Custom groups.

    Confidence Score: 4/5

    Safe to merge; the change is isolated to ThemeFrame's rendering logic with no data mutations or side effects.
    The fix is straightforward and correct for the main case. The only issue is a cosmetic one — when a query matches "system" but no theme names or IDs match, the separator between the System row and the theme groups renders with nothing after it.
    apps/desktop/src/renderer/commandPalette/ui/ThemeFrame/ThemeFrame.tsx — the separator guard logic around line 84.

    Original source
  • May 16, 2026
    • Date parsed from source:
      May 16, 2026
    • First seen by Releasebot:
      May 19, 2026
    Apache logo

    Superset by Apache

    [codex] add context to v2 macOS notifications #4614

    Superset adds richer native macOS notifications for v2 workspace agent events, replacing generic completion copy with clearer agent-first alerts that include workspace, pane, and tab context when available. It also adds new formatting logic and test coverage.

    Adds richer native macOS notification content for v2 workspace agent lifecycle events. Instead of generic Agent Complete / Your agent has finished copy, notifications now include the agent label, workspace name, pane label, and tab label when available.

    Why

    The v2 notification pipeline already receives agent identity and can resolve workspace/pane layout context, but the native notification copy only used generic text. That made it hard to tell which agent, pane, or workspace finished when multiple agents were running.

    Changes

    • Threads workspace display names into the v2 host notification subscriber.
    • Adds a focused notification content formatter for agent, workspace, pane, tab, terminal title, and fallback labels.
    • Uses the formatter when showing native notifications from v2 lifecycle events.
    • Adds unit coverage for completion, permission request, and fallback notification content.

    Validation

    • bun test apps/desktop/src/renderer/routes/_authenticated/components/V2NotificationController/lib/notificationContent.test.ts apps/desktop/src/renderer/routes/_authenticated/components/V2NotificationController/lib/resolveV2NotificationTarget.test.ts apps/desktop/src/renderer/routes/_authenticated/components/V2NotificationController/lib/statusTransitions.test.ts
    • bun run lint
    • bun run --cwd apps/desktop typecheck

    Summary by cubic

    Switches v2 macOS notifications to agent‑first titles and a simpler body. Titles are “{Agent} - Complete/Needs Attention”; the body shows only the workspace name.

    • New Features
      • Title format: “{Agent} - Complete” or “Needs Attention” for permission requests.
      • Body: “{WorkspaceName}” (trimmed; falls back to namebranch → “Workspace”).
      • Agent labels resolve via @superset/shared/agent-catalog or humanized ids; threaded workspaceName through and added unit tests.

    Summary by CodeRabbit

    • New Features
      • Notifications now display a cleaned workspace name (trimmed, falling back to branch or generic "Workspace") and use concise native notification titles combining agent label + action.
    • Bug Fixes
      • Removed noisy/ambiguous label content and simplified title selection for clearer notifications.
    • Tests
      • Added tests for notification title/body generation, permission-request wording, and fallback labeling.

    This PR enriches native macOS notifications for v2 agent lifecycle events by adding contextual labels (agent, workspace, pane, tab) instead of the previous generic "Agent Complete / Your agent has finished" copy. The notification pipeline already carried agent identity; this change threads workspace display names and pane layout data through to a new getV2NativeNotificationContent formatter and wires it into the notification render path.

    Important files changed include:

    • notificationContent.ts — new formatter that resolves agent label (with BUILTIN_AGENT_LABELS lookup and humanizeIdentifier fallback), workspace name (name → branch → id), pane label (title override → runtime terminal title → kind label → short terminal ID), and tab label (title override → "Tab N" index), then composes them into title/body.
    • lifecycleEvents.tsshowNativeNotification now calls terminalRuntimeRegistry.getTitle with the pane ID as the instance discriminator (matching how TerminalPane registers entries) before falling back to the primary entry, and passes both workspaceName and paneLayout to the formatter.
    • V2NotificationController.tsx — the workspace live-query now selects name and branch (both notNull columns) and computes workspaceName before grouping by host URL.

    Confidence Score: 4/5

    Safe to merge; changes are isolated to the notification formatting path and do not touch agent execution, data persistence, or auth flows. The notification formatter is well-structured with graceful fallbacks at every label level and the unit tests cover the main scenarios. Two minor points worth a quick look: the PANE_KIND_LABELS index type hides an implicit runtime undefined from TypeScript, and shortId can produce 'Terminal terminal' for the rare case where the terminal ID is exactly the stripped prefix. Neither affects correctness for real workspaces.

    Original source
Releasebot

Curated by the Releasebot team

Releasebot is an aggregator of official product update announcements from hundreds of software vendors and thousands of sources.

Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.

Similar to Superset with recent updates: