From ed4311b2cbca6ad5f9a8a3132724a9aab4f6aa96 Mon Sep 17 00:00:00 2001
From: Mathias Fredriksson
Date: Tue, 2 Jun 2026 04:51:16 +0300
Subject: [PATCH 001/112] ci: add Git usr/bin to PATH on Windows (#25939)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Summary
Fixes all 9 Windows CI test failures caused by the mise CI refactor
(`fe257666d7`, PR #25727).
### Root cause
`jdx/mise-action` exports `Path` (Windows convention) via `GITHUB_ENV`.
Bash on Windows maintains its own `PATH`. When Go's `os.Environ()`
returns both, `cmd.exe` subprocesses non-deterministically pick the
MSYS-translated `PATH` (forward slashes), causing Windows executables
(`printf`, `powershell.exe`, `cmd.exe`) to be unresolvable.
These failures only appeared on `main` (where `-count=1` forces real
test execution) and were masked on PRs by Go test cache.
### Fixes applied
**CI (`setup-mise` action)**:
- Write both `Path` and `PATH` to `GITHUB_ENV` with Git usr/bin
prepended
**Code (`cli/root.go`)**:
- Add `appendAndDedupEnv` helper that deduplicates case-insensitive env
vars on Windows, preferring native Windows paths (backslashes) over MSYS
paths
**Code (`cli/configssh_windows.go`)**:
- Use absolute paths for `powershell.exe` and `cmd.exe` in the SSH
config `Match exec` escape function, avoiding PATH resolution entirely
**Tests**:
- Switch `--header-command` tests from `printf` to `echo` (cmd.exe
builtin) for reliable cross-platform execution
- Add env dedup in `Test_sshConfigMatchExecEscape` for subprocess PATH
consistency
Fixes coder/internal#1556, coder/internal#1558, coder/internal#1559
> 🤖 Generated by Coder agent, will be reviewed by @mafredri. 🏂🏻
---
.github/actions/setup-mise/action.yml | 20 +++++++++++++
cli/agent_test.go | 4 ++-
cli/configssh_internal_test.go | 11 +++++--
cli/configssh_windows.go | 10 ++++++-
cli/root.go | 41 +++++++++++++++++++++++++--
cli/root_test.go | 6 ++--
enterprise/cli/proxyserver_test.go | 2 +-
7 files changed, 85 insertions(+), 9 deletions(-)
diff --git a/.github/actions/setup-mise/action.yml b/.github/actions/setup-mise/action.yml
index 847eb6ef514de..39aa9ab27da1e 100644
--- a/.github/actions/setup-mise/action.yml
+++ b/.github/actions/setup-mise/action.yml
@@ -166,3 +166,23 @@ runs:
mise_dir: ${{ steps.mise-data-dir.outputs.path }}
install_args: ${{ steps.cache-key.outputs.install-args }}
cache: "false"
+
+ - name: Ensure Git usr/bin is in PATH (Windows)
+ if: runner.os == 'Windows'
+ shell: pwsh
+ # jdx/mise-action exports "Path" via GITHUB_ENV which may
+ # collide with bash's "PATH". Ensure Git usr/bin is present
+ # and remove any duplicate Path/PATH entries from GITHUB_ENV
+ # by writing both forms.
+ run: | # zizmor: ignore[github-env]
+ $gitdir = "C:\Program Files\Git\usr\bin"
+ $current = $env:Path
+ if ($current -notlike "*$gitdir*") {
+ $current = "$gitdir;$current"
+ }
+ # Write both Path and PATH to GITHUB_ENV so that both
+ # cmd.exe (uses Path) and bash/Go (uses PATH) see the
+ # same value including Git usr/bin.
+ "Path=$current" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
+ "PATH=$current" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
+
diff --git a/cli/agent_test.go b/cli/agent_test.go
index 60e8f6864271a..9ea7afdcb168f 100644
--- a/cli/agent_test.go
+++ b/cli/agent_test.go
@@ -146,8 +146,10 @@ func TestWorkspaceAgent(t *testing.T) {
}).WithAgent().Do()
coderURLEnv := "$CODER_URL"
+ headerCmd := "printf X-Process-Testing=very-wow-" + coderURLEnv + "'\\r\\n'X-Process-Testing2=more-wow"
if runtime.GOOS == "windows" {
coderURLEnv = "%CODER_URL%"
+ headerCmd = "echo X-Process-Testing=very-wow-" + coderURLEnv + "& echo X-Process-Testing2=more-wow"
}
logDir := t.TempDir()
@@ -159,7 +161,7 @@ func TestWorkspaceAgent(t *testing.T) {
"--log-dir", logDir,
"--agent-header", "X-Testing=agent",
"--agent-header", "Cool-Header=Ethan was Here!",
- "--agent-header-command", "printf X-Process-Testing=very-wow-"+coderURLEnv+"'\\r\\n'X-Process-Testing2=more-wow",
+ "--agent-header-command", headerCmd,
"--socket-path", testutil.AgentSocketPath(t),
)
clitest.Start(t, agentInv)
diff --git a/cli/configssh_internal_test.go b/cli/configssh_internal_test.go
index 0ea2ae6ea5f22..59b57439af12a 100644
--- a/cli/configssh_internal_test.go
+++ b/cli/configssh_internal_test.go
@@ -229,8 +229,15 @@ func Test_sshConfigMatchExecEscape(t *testing.T) {
// OpenSSH processes %% escape sequences into %
escaped = strings.ReplaceAll(escaped, "%%", "%")
- b, err := exec.Command(cmd, arg, escaped).CombinedOutput() //nolint:gosec
- require.NoError(t, err)
+ c := exec.Command(cmd, arg, escaped) //nolint:gosec
+ if runtime.GOOS == "windows" {
+ // Deduplicate Path/PATH env vars so cmd.exe
+ // subprocesses (like powershell.exe used for
+ // paths with spaces) resolve correctly.
+ c.Env = appendAndDedupEnv(os.Environ())
+ }
+ b, err := c.CombinedOutput()
+ require.NoError(t, err, "command output: %s", string(b))
got := strings.TrimSpace(string(b))
require.Equal(t, "yay", got)
})
diff --git a/cli/configssh_windows.go b/cli/configssh_windows.go
index db81bce1ffd6e..53473c7aa4cba 100644
--- a/cli/configssh_windows.go
+++ b/cli/configssh_windows.go
@@ -4,6 +4,8 @@ package cli
import (
"fmt"
+ "os"
+ "path/filepath"
"strings"
"golang.org/x/xerrors"
@@ -50,7 +52,13 @@ func sshConfigMatchExecEscape(path string) (string, error) {
if strings.ContainsAny(path, " ") {
// c.f. function comment for how this works.
- path = fmt.Sprintf("for /f %%%%a in ('powershell.exe -Command [char]34') do @cmd.exe /c %%%%a%s%%%%a", path) //nolint:gocritic // We don't want %q here.
+ // Use absolute paths for powershell.exe and cmd.exe
+ // to avoid PATH resolution issues when both Path and
+ // PATH (MSYS-translated) exist in the environment.
+ sysRoot := os.Getenv("SYSTEMROOT")
+ pwsh := filepath.Join(sysRoot, "System32", "WindowsPowerShell", "v1.0", "powershell.exe")
+ cmd := filepath.Join(sysRoot, "System32", "cmd.exe")
+ path = fmt.Sprintf("for /f %%%%a in ('%s -Command [char]34') do @%s /c %%%%a%s%%%%a", pwsh, cmd, path) //nolint:gocritic // We don't want %q here.
}
return path, nil
}
diff --git a/cli/root.go b/cli/root.go
index a40ac7c3c23a4..2e4aa7dd17f06 100644
--- a/cli/root.go
+++ b/cli/root.go
@@ -1701,7 +1701,44 @@ func (r roundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
return r(req)
}
-// HeaderTransport creates a new transport that executes `--header-command`
+// appendAndDedupEnv appends extra environment variables and
+// deduplicates entries with the same key (case-insensitive on
+// Windows). For the PATH variable specifically, it prefers the
+// value that contains native Windows paths (with backslashes)
+// over MSYS-translated paths (with forward slashes). For all
+// other variables, the last value wins.
+func appendAndDedupEnv(env []string, extra ...string) []string {
+ env = append(env, extra...)
+ if runtime.GOOS != "windows" {
+ return env
+ }
+ seen := make(map[string]int, len(env))
+ result := make([]string, 0, len(env))
+ for _, e := range env {
+ key, val, ok := strings.Cut(e, "=")
+ if !ok {
+ result = append(result, e)
+ continue
+ }
+ upper := strings.ToUpper(key)
+ if idx, exists := seen[upper]; exists {
+ if upper == "PATH" {
+ // Prefer the value with native Windows paths.
+ existingVal := result[idx][len(key)+1:]
+ if strings.Contains(existingVal, "\\") && !strings.Contains(val, "\\") {
+ continue
+ }
+ }
+ result[idx] = e
+ continue
+ }
+ seen[upper] = len(result)
+ result = append(result, e)
+ }
+ return result
+}
+
+// headerTransport creates a new transport that executes `--header-command`
// if it is set to add headers for all outbound requests.
func headerTransport(ctx context.Context, serverURL *url.URL, header []string, headerCommand string) (*codersdk.HeaderTransport, error) {
transport := &codersdk.HeaderTransport{
@@ -1719,7 +1756,7 @@ func headerTransport(ctx context.Context, serverURL *url.URL, header []string, h
var outBuf bytes.Buffer
// #nosec
cmd := exec.CommandContext(ctx, shell, caller, headerCommand)
- cmd.Env = append(os.Environ(), "CODER_URL="+serverURL.String())
+ cmd.Env = appendAndDedupEnv(os.Environ(), "CODER_URL="+serverURL.String())
cmd.Stdout = &outBuf
cmd.Stderr = io.Discard
err := cmd.Run()
diff --git a/cli/root_test.go b/cli/root_test.go
index fefb87382c685..aaf81f574e57f 100644
--- a/cli/root_test.go
+++ b/cli/root_test.go
@@ -177,15 +177,17 @@ func TestRoot(t *testing.T) {
url = srv.URL
buf := new(bytes.Buffer)
coderURLEnv := "$CODER_URL"
+ headerCmd := "printf X-Process-Testing=very-wow-" + coderURLEnv + "'\\r\\n'X-Process-Testing2=more-wow"
if runtime.GOOS == "windows" {
coderURLEnv = "%CODER_URL%"
+ headerCmd = "echo X-Process-Testing=very-wow-" + coderURLEnv + "& echo X-Process-Testing2=more-wow"
}
inv, _ := clitest.New(t,
"--no-feature-warning",
"--no-version-warning",
"--header", "X-Testing=wow",
"--header", "Cool-Header=Dean was Here!",
- "--header-command", "printf X-Process-Testing=very-wow-"+coderURLEnv+"'\\r\\n'X-Process-Testing2=more-wow",
+ "--header-command", headerCmd,
"login", srv.URL,
)
inv.Stdout = buf
@@ -266,7 +268,7 @@ func TestDERPHeaders(t *testing.T) {
"--no-version-warning",
"ping", workspace.Name,
"-n", "1",
- "--header-command", "printf X-Process-Testing=very-wow",
+ "--header-command", "echo X-Process-Testing=very-wow",
}
for k, v := range expectedHeaders {
if k != "X-Process-Testing" {
diff --git a/enterprise/cli/proxyserver_test.go b/enterprise/cli/proxyserver_test.go
index 556597ab765d7..15f0003099b23 100644
--- a/enterprise/cli/proxyserver_test.go
+++ b/enterprise/cli/proxyserver_test.go
@@ -48,7 +48,7 @@ func Test_ProxyServer_Headers(t *testing.T) {
"--access-url", "http://localhost:8080",
"--http-address", ":0",
"--header", fmt.Sprintf("%s=%s", headerName1, headerVal1),
- "--header-command", fmt.Sprintf("printf %s=%s", headerName2, headerVal2),
+ "--header-command", fmt.Sprintf("echo %s=%s", headerName2, headerVal2),
)
pty := ptytest.New(t)
inv.Stdout = pty.Output()
From 550aa6d6a22b5f9522595fc315d2f02b6c318cc1 Mon Sep 17 00:00:00 2001
From: Thomas Kosiewski
Date: Tue, 2 Jun 2026 04:11:00 +0200
Subject: [PATCH 002/112] ci: install gotestsum in flake check workflow
(#25934)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The Flake Check workflow runs `make test` through the `test-go-pg`
action, which invokes `gotestsum`, but the workflow never installs it.
The mise refactor (#25727) deleted the `setup-go` action that previously
installed `gotestsum` implicitly, and added explicit `mise install ...
go:gotest.tools/gotestsum` steps to every other Go test job. The flake
check's `Install Go mise tools` step only listed `whichtests`, so the
check fails with `gotestsum: command not found` whenever it selects
changed tests to run.
Add `go:gotest.tools/gotestsum` to the flake check's install step,
matching the other `test-go-pg` jobs in `ci.yaml` and
`nightly-gauntlet.yaml`.
Refs #25727
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.8 (1M context)
---
.github/workflows/flake-go.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/flake-go.yaml b/.github/workflows/flake-go.yaml
index e416519216f23..b3226462d2398 100644
--- a/.github/workflows/flake-go.yaml
+++ b/.github/workflows/flake-go.yaml
@@ -48,7 +48,7 @@ jobs:
uses: ./.github/actions/go-cache
- name: Install Go mise tools
- run: ./.github/scripts/retry.sh -- mise install --locked go:github.com/coder/whichtests
+ run: ./.github/scripts/retry.sh -- mise install --locked go:github.com/coder/whichtests go:gotest.tools/gotestsum
- name: Select changed tests
id: selector
From 97dde1f8246348c4b32172801f623268885dff33 Mon Sep 17 00:00:00 2001
From: Ethan <39577870+ethanndickson@users.noreply.github.com>
Date: Tue, 2 Jun 2026 14:37:12 +1000
Subject: [PATCH 003/112] fix: refresh attach workspace picker dynamically
(#25834)
After the chat agent creates a workspace via the `create_workspace`
tool, opening the composer `+` menu and clicking "Attach workspace"
could show "No workspaces found" until a full page refresh, even though
the workspace pill already rendered the linked workspace correctly.
The picker was sourced only from the `owner:me` workspace list query,
whose cache could be stale right after `create_workspace` completed. The
fix derives the picker options at render time from both the owner
workspace list and the linked workspace already fetched by ID for the
pill, prepending or replacing the linked workspace only when the current
user owns it. This keeps the picker consistent with the pill without
broadening visibility beyond `owner:me` or invalidating workspace lists
on chat link updates.
Relates to CODAGT-510
---
.../pages/AgentsPage/AgentChatPage.test.ts | 38 +++++++++++++++++++
site/src/pages/AgentsPage/AgentChatPage.tsx | 34 ++++++++++++++++-
2 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/site/src/pages/AgentsPage/AgentChatPage.test.ts b/site/src/pages/AgentsPage/AgentChatPage.test.ts
index 21b7853879593..9a20437dfe8bb 100644
--- a/site/src/pages/AgentsPage/AgentChatPage.test.ts
+++ b/site/src/pages/AgentsPage/AgentChatPage.test.ts
@@ -2,9 +2,11 @@ import { act, renderHook } from "@testing-library/react";
import { createRef } from "react";
import { beforeEach, describe, expect, it, vi } from "vitest";
import type { ChatQueuedMessage } from "#/api/typesGenerated";
+import { MockUserOwner, MockWorkspace } from "#/testHelpers/entities";
import {
draftInputStorageKeyPrefix,
getPersistedDraftInputValue,
+ getWorkspaceOptionsWithLinkedWorkspace,
restoreOptimisticRequestSnapshot,
runPromoteQueuedMessage,
submitEditAndScroll,
@@ -93,6 +95,42 @@ const createDeferred = (): Deferred => {
return { promise, resolve, reject };
};
+describe("getWorkspaceOptionsWithLinkedWorkspace", () => {
+ it("includes a missing linked workspace only when the current user owns it", () => {
+ const existingWorkspace = {
+ ...MockWorkspace,
+ id: "existing-workspace",
+ };
+ const ownerWorkspaceOptions = [existingWorkspace];
+ const linkedWorkspace = {
+ ...MockWorkspace,
+ id: "linked-workspace",
+ owner_id: MockUserOwner.id,
+ };
+
+ expect(
+ getWorkspaceOptionsWithLinkedWorkspace(
+ ownerWorkspaceOptions,
+ linkedWorkspace,
+ MockUserOwner.id,
+ ),
+ ).toEqual([linkedWorkspace, existingWorkspace]);
+
+ const sharedWorkspace = {
+ ...linkedWorkspace,
+ owner_id: "another-user",
+ };
+
+ expect(
+ getWorkspaceOptionsWithLinkedWorkspace(
+ ownerWorkspaceOptions,
+ sharedWorkspace,
+ MockUserOwner.id,
+ ),
+ ).toBe(ownerWorkspaceOptions);
+ });
+});
+
describe("waitForPendingChatSettingsSyncs", () => {
it("waits for plan-mode and workspace updates before resolving", async () => {
const planModeUpdate = createDeferred();
diff --git a/site/src/pages/AgentsPage/AgentChatPage.tsx b/site/src/pages/AgentsPage/AgentChatPage.tsx
index a6d968d8af149..b4196b72809c2 100644
--- a/site/src/pages/AgentsPage/AgentChatPage.tsx
+++ b/site/src/pages/AgentsPage/AgentChatPage.tsx
@@ -275,6 +275,32 @@ export const filterWorkspaceOptionsByOrganization = (
);
};
+/** @internal Exported for testing. */
+export const getWorkspaceOptionsWithLinkedWorkspace = (
+ workspaceOptions: readonly TypesGen.Workspace[],
+ workspace: TypesGen.Workspace | undefined,
+ ownerID: string,
+): readonly TypesGen.Workspace[] => {
+ if (!workspace || workspace.owner_id !== ownerID) {
+ return workspaceOptions;
+ }
+
+ const existingIndex = workspaceOptions.findIndex(
+ (candidate) => candidate.id === workspace.id,
+ );
+ if (existingIndex === -1) {
+ return [workspace, ...workspaceOptions];
+ }
+
+ if (workspaceOptions[existingIndex] === workspace) {
+ return workspaceOptions;
+ }
+
+ const nextWorkspaceOptions = [...workspaceOptions];
+ nextWorkspaceOptions[existingIndex] = workspace;
+ return nextWorkspaceOptions;
+};
+
const buildAttachmentMediaTypes = (
attachments?: readonly PendingAttachment[],
): ReadonlyMap | undefined => {
@@ -723,6 +749,7 @@ const AgentChatPage: FC = () => {
...workspaceById(workspaceId ?? ""),
enabled: Boolean(workspaceId),
});
+ const workspace = workspaceQuery.data;
const chatModelsQuery = useQuery(chatModels());
const chatModelConfigsQuery = useQuery(chatModelConfigs());
@@ -736,7 +763,11 @@ const AgentChatPage: FC = () => {
const userDebugLoggingQuery = useQuery(userChatDebugLogging());
const mcpServersQuery = useQuery(mcpServerConfigs());
const workspacesQuery = useQuery(workspaces({ q: "owner:me", limit: 0 }));
- const workspaceOptions = workspacesQuery.data?.workspaces ?? [];
+ const workspaceOptions = getWorkspaceOptionsWithLinkedWorkspace(
+ workspacesQuery.data?.workspaces ?? [],
+ workspace,
+ currentUser.id,
+ );
const desktopEnabled = desktopEnabledQuery.data?.enable_desktop ?? false;
const debugLoggingEnabled =
userDebugLoggingQuery.data?.debug_logging_enabled ?? false;
@@ -835,7 +866,6 @@ const AgentChatPage: FC = () => {
});
}, [workspaceId, queryClient]);
const sshConfigQuery = useQuery(deploymentSSHConfig());
- const workspace = workspaceQuery.data;
const workspaceAgent = getWorkspaceAgent(workspace, undefined);
const { proxy } = useProxy();
From 49c2142d2dc7f2a6194f2bed52101fb514f9ac12 Mon Sep 17 00:00:00 2001
From: Ethan <39577870+ethanndickson@users.noreply.github.com>
Date: Tue, 2 Jun 2026 14:40:07 +1000
Subject: [PATCH 004/112] fix: allow unlinking chat workspaces (#25833)
This allows a Coder Agents chat to detach from its linked workspace
without deleting or changing the workspace, so a different workspace can
be linked later. It adds detach controls wherever the linked workspace
appears, including the workspace pill menu, fallback workspace badges,
and the workspace picker. The workspace selection state now updates
consistently across desktop and mobile.
Running workspace:
Stopped workspace:
Closes CODAGT-510
---
site/src/modules/apps/apps.test.ts | 6 +-
site/src/pages/AgentsPage/AgentChatPage.tsx | 5 +-
.../AgentsPage/AgentChatPageView.stories.tsx | 17 ++-
.../pages/AgentsPage/AgentChatPageView.tsx | 2 +-
.../components/AgentChatInput.stories.tsx | 113 +++++++++++++++++-
.../AgentsPage/components/AgentChatInput.tsx | 73 +++++++----
.../AgentsPage/components/ChatPageContent.tsx | 2 +-
.../components/WorkspacePill.stories.tsx | 63 ++++++++--
.../AgentsPage/components/WorkspacePill.tsx | 82 ++++++++-----
.../WorkspaceScheduleControls.test.tsx | 8 +-
.../WorkspaceSchedulePage.test.tsx | 6 +-
site/src/testHelpers/entities.ts | 2 +-
12 files changed, 291 insertions(+), 88 deletions(-)
diff --git a/site/src/modules/apps/apps.test.ts b/site/src/modules/apps/apps.test.ts
index 146964af78b9f..6f8bc73f67b4a 100644
--- a/site/src/modules/apps/apps.test.ts
+++ b/site/src/modules/apps/apps.test.ts
@@ -129,7 +129,7 @@ describe("getAppHref", () => {
path: "/path-base",
});
expect(href).toBe(
- `/path-base/@${MockWorkspace.owner_name}/Test-Workspace.a-workspace-agent/apps/${app.slug}/`,
+ `/path-base/@${MockWorkspace.owner_name}/test-workspace.a-workspace-agent/apps/${app.slug}/`,
);
});
@@ -145,7 +145,7 @@ describe("getAppHref", () => {
path: "",
});
expect(href).toBe(
- `/@${MockWorkspace.owner_name}/Test-Workspace.a-workspace-agent/terminal?app=${app.slug}`,
+ `/@${MockWorkspace.owner_name}/test-workspace.a-workspace-agent/terminal?app=${app.slug}`,
);
});
@@ -177,7 +177,7 @@ describe("getAppHref", () => {
path: "/path-base",
});
expect(href).toBe(
- `/path-base/@${MockWorkspace.owner_name}/Test-Workspace.a-workspace-agent/apps/${app.slug}/`,
+ `/path-base/@${MockWorkspace.owner_name}/test-workspace.a-workspace-agent/apps/${app.slug}/`,
);
});
});
diff --git a/site/src/pages/AgentsPage/AgentChatPage.tsx b/site/src/pages/AgentsPage/AgentChatPage.tsx
index b4196b72809c2..358355adbef66 100644
--- a/site/src/pages/AgentsPage/AgentChatPage.tsx
+++ b/site/src/pages/AgentsPage/AgentChatPage.tsx
@@ -1160,6 +1160,7 @@ const AgentChatPage: FC = () => {
isUpdateChatPlanModePending || isUpdateChatWorkspacePending;
const isInputDisabled =
!hasModelOptions || isArchived || isChatSettingsPending || isViewerNotOwner;
+ const canUpdateChatWorkspace = !isArchived && !isViewerNotOwner;
const selectedWorkspaceId = chatQuery.data?.workspace_id ?? null;
const isWorkspaceLoading =
@@ -1633,7 +1634,9 @@ const AgentChatPage: FC = () => {
isInterruptPending={isInterruptPending}
workspaceOptions={workspaceOptions}
selectedWorkspaceId={selectedWorkspaceId}
- onWorkspaceChange={handleWorkspaceChange}
+ onWorkspaceChange={
+ canUpdateChatWorkspace ? handleWorkspaceChange : undefined
+ }
isWorkspaceLoading={isWorkspaceLoading}
isSidebarCollapsed={isSidebarCollapsed}
onToggleSidebarCollapsed={onToggleSidebarCollapsed}
diff --git a/site/src/pages/AgentsPage/AgentChatPageView.stories.tsx b/site/src/pages/AgentsPage/AgentChatPageView.stories.tsx
index baed2e4d8ec63..1d4a94ed9d8e8 100644
--- a/site/src/pages/AgentsPage/AgentChatPageView.stories.tsx
+++ b/site/src/pages/AgentsPage/AgentChatPageView.stories.tsx
@@ -673,7 +673,22 @@ export const WorkspaceAgentStartTimeout: Story = {
};
export const WorkspaceNoAgent: Story = {
- render: () => ,
+ render: () => (
+
+ ),
+ play: async ({ canvasElement }) => {
+ const canvas = within(canvasElement);
+ expect(
+ canvas.getByRole("button", {
+ name: `Remove workspace ${MockWorkspace.name}`,
+ }),
+ ).toBeVisible();
+ },
};
// ---------------------------------------------------------------------------
diff --git a/site/src/pages/AgentsPage/AgentChatPageView.tsx b/site/src/pages/AgentsPage/AgentChatPageView.tsx
index 596c499162ecf..8d448acc3de47 100644
--- a/site/src/pages/AgentsPage/AgentChatPageView.tsx
+++ b/site/src/pages/AgentsPage/AgentChatPageView.tsx
@@ -226,7 +226,7 @@ export const AgentChatPageView: FC = ({
isInterruptPending,
workspaceOptions = [],
selectedWorkspaceId = null,
- onWorkspaceChange = () => {},
+ onWorkspaceChange,
isWorkspaceLoading = false,
isSidebarCollapsed,
onToggleSidebarCollapsed,
diff --git a/site/src/pages/AgentsPage/components/AgentChatInput.stories.tsx b/site/src/pages/AgentsPage/components/AgentChatInput.stories.tsx
index 02d52ee3f3e13..375cf884308a7 100644
--- a/site/src/pages/AgentsPage/components/AgentChatInput.stories.tsx
+++ b/site/src/pages/AgentsPage/components/AgentChatInput.stories.tsx
@@ -910,15 +910,16 @@ export const DetailPageWorkspacePicker: Story = {
statusLabel: "Workspace running",
},
},
- play: async ({ canvasElement }) => {
+ play: async ({ args, canvasElement }) => {
const canvas = within(canvasElement);
expect(canvas.getAllByText("agents-workspace")).toHaveLength(1);
- expect(
- canvas.queryByRole("button", {
- name: "Remove workspace agents-workspace",
- }),
- ).not.toBeInTheDocument();
+ const removeWorkspaceButton = canvas.getByRole("button", {
+ name: "Remove workspace agents-workspace",
+ });
+ expect(removeWorkspaceButton).toBeVisible();
+ await userEvent.click(removeWorkspaceButton);
+ expect(args.onWorkspaceChange).toHaveBeenCalledWith(null);
const moreOptionsButton = canvas.getByRole("button", {
name: "More options",
@@ -940,6 +941,106 @@ export const DetailPageWorkspacePicker: Story = {
},
};
+export const LinkedWorkspaceRemoveWhenInputDisabled: Story = {
+ args: {
+ isDisabled: true,
+ workspace: MockWorkspace,
+ workspaceAgent: MockWorkspaceAgent,
+ chatId: "chat-detail",
+ selectedWorkspaceId: MockWorkspace.id,
+ onWorkspaceChange: fn(),
+ },
+ play: async ({ args, canvasElement }) => {
+ const canvas = within(canvasElement);
+ const workspaceMenuButton = canvas.getByRole("button", {
+ name: `${MockWorkspace.name} workspace menu`,
+ });
+
+ expect(
+ canvas.queryByRole("button", {
+ name: `Remove workspace ${MockWorkspace.name}`,
+ }),
+ ).not.toBeInTheDocument();
+ expect(workspaceMenuButton).toBeVisible();
+ expect(workspaceMenuButton).toBeEnabled();
+ await userEvent.click(workspaceMenuButton);
+ let detachWorkspaceItem: HTMLElement | null = null;
+ await waitFor(() => {
+ const menuId = workspaceMenuButton.getAttribute("aria-controls");
+ if (!menuId) {
+ throw new Error("Expected workspace pill to control a menu.");
+ }
+
+ const menu = canvasElement.ownerDocument.getElementById(menuId);
+ if (!(menu instanceof HTMLElement)) {
+ throw new Error("Expected workspace menu to render.");
+ }
+
+ detachWorkspaceItem = within(menu).getByRole("menuitem", {
+ name: "Detach workspace",
+ });
+ expect(detachWorkspaceItem).toBeVisible();
+ });
+ if (!detachWorkspaceItem) {
+ throw new Error("Expected detach workspace menu item to render.");
+ }
+
+ await userEvent.click(detachWorkspaceItem);
+ expect(args.onWorkspaceChange).toHaveBeenCalledWith(null);
+ },
+};
+
+export const UncheckSelectedWorkspaceFromPicker: Story = {
+ args: {
+ isDisabled: true,
+ workspace: MockWorkspace,
+ workspaceAgent: MockWorkspaceAgent,
+ chatId: "chat-detail",
+ workspaceOptions: [
+ {
+ id: MockWorkspace.id,
+ name: MockWorkspace.name,
+ owner_name: MockWorkspace.owner_name,
+ organization_id: MockWorkspace.organization_id,
+ },
+ ],
+ selectedWorkspaceId: MockWorkspace.id,
+ onWorkspaceChange: fn(),
+ },
+ parameters: {
+ viewport: { defaultViewport: "mobile1" },
+ chromatic: { viewports: [375] },
+ },
+ play: async ({ args, canvasElement }) => {
+ const canvas = within(canvasElement);
+ const body = within(canvasElement.ownerDocument.body);
+
+ const moreOptionsButton = canvas.getByRole("button", {
+ name: "More options",
+ });
+ expect(moreOptionsButton).toBeEnabled();
+ await userEvent.click(moreOptionsButton);
+
+ const attachWorkspaceButton = (
+ await body.findByText("Attach workspace")
+ ).closest("button");
+ if (!(attachWorkspaceButton instanceof HTMLButtonElement)) {
+ throw new Error("Expected Attach workspace to be a button.");
+ }
+ expect(attachWorkspaceButton).toBeEnabled();
+ await userEvent.click(attachWorkspaceButton);
+
+ const workspaceMatches = await body.findAllByText(MockWorkspace.name);
+ const selectedWorkspaceOption = workspaceMatches.at(-1);
+ if (!(selectedWorkspaceOption instanceof HTMLElement)) {
+ throw new Error("Expected workspace option to render.");
+ }
+ await userEvent.click(selectedWorkspaceOption);
+
+ expect(args.onWorkspaceChange).toHaveBeenCalledWith(null);
+ },
+};
+
const confluenceMCP = makeMCPServer({
id: "mcp-confluence",
display_name: "Confluence Cloud",
diff --git a/site/src/pages/AgentsPage/components/AgentChatInput.tsx b/site/src/pages/AgentsPage/components/AgentChatInput.tsx
index ce03c71dd1767..6ddafd1fa861b 100644
--- a/site/src/pages/AgentsPage/components/AgentChatInput.tsx
+++ b/site/src/pages/AgentsPage/components/AgentChatInput.tsx
@@ -211,10 +211,12 @@ const BadgeDismissButton: FC<{
type="button"
onClick={onClick}
disabled={isDisabled}
- className="ml-0.5 inline-flex cursor-pointer items-center justify-center rounded-full border-0 bg-transparent p-0.5 text-content-secondary transition-colors hover:bg-surface-tertiary hover:text-content-primary disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent disabled:hover:text-content-secondary"
+ className="group -mx-1 -my-1 inline-flex size-5 cursor-pointer items-center justify-center rounded-full border-0 bg-transparent p-0 text-content-secondary disabled:cursor-not-allowed disabled:opacity-50"
aria-label={ariaLabel}
>
-
+
+
+
);
@@ -233,18 +235,28 @@ const ToolBadge: FC<{
return (
-
- {badge.statusIcon}
- {badge.name}
-
+
+ {badge.statusIcon}
+ {badge.name}
+
+ {onRemoveWorkspace && (
+
+ )}
+
{badge.statusLabel}
@@ -491,10 +503,12 @@ export const AgentChatInput: FC = ({
const selectedWorkspace = workspaceOptions?.find(
(ws) => ws.id === selectedWorkspaceId,
);
+ const canUseWorkspacePicker =
+ Boolean(onWorkspaceChange) && !isWorkspaceLoading;
+ const linkedWorkspaceId = workspace?.id ?? attachedWorkspace?.id;
const shouldShowSelectedWorkspaceBadge = selectedWorkspace
- ? Boolean(onWorkspaceChange) &&
- selectedWorkspace.id !== attachedWorkspace?.id
+ ? selectedWorkspace.id !== linkedWorkspaceId
: false;
const enabledMcpServers = mcpServers?.filter((s) => s.enabled) ?? [];
@@ -529,6 +543,9 @@ export const AgentChatInput: FC = ({
const overflowBadges = allBadges.slice(visibleCount);
const handleRemoveWorkspace = () => onWorkspaceChange?.(null);
+ const removeWorkspaceHandler = onWorkspaceChange
+ ? handleRemoveWorkspace
+ : undefined;
const handleRemoveMcp = (serverId: string) =>
handleMcpToggle(serverId, false);
@@ -1128,7 +1145,9 @@ export const AgentChatInput: FC = ({
variant="subtle"
size="icon"
className="size-7 shrink-0 rounded-full [&>svg]:!size-icon-sm [&>svg]:p-0"
- disabled={isDisabled && !agentSetupNotice}
+ disabled={
+ isDisabled && !agentSetupNotice && !canUseWorkspacePicker
+ }
aria-label="More options"
>
@@ -1197,7 +1216,7 @@ export const AgentChatInput: FC = ({
(isBelowMdViewport() ? (
setPlusMenuView("workspace")}
className="group flex h-8 w-full cursor-pointer items-center gap-1.5 border-none bg-transparent px-1 text-xs text-content-secondary shadow-none transition-colors hover:text-content-primary disabled:cursor-not-allowed disabled:opacity-50"
>
@@ -1213,7 +1232,7 @@ export const AgentChatInput: FC = ({
@@ -1352,6 +1371,7 @@ export const AgentChatInput: FC = ({
chatId={chatId}
sshCommand={sshCommand}
folder={folder}
+ onRemoveWorkspace={removeWorkspaceHandler}
/>
)}
@@ -1365,7 +1385,7 @@ export const AgentChatInput: FC = ({
@@ -1405,7 +1425,7 @@ export const AgentChatInput: FC = ({
: `${badge.kind}-overflow`
}
badge={badge}
- onRemoveWorkspace={handleRemoveWorkspace}
+ onRemoveWorkspace={removeWorkspaceHandler}
onRemoveMcp={handleRemoveMcp}
/>
))}
@@ -1528,7 +1548,8 @@ export const AgentChatInput: FC = ({
/**
* Shared workspace picker used by both the mobile and desktop
* "Attach workspace" menus. Workspaces from a different organization
- * than the chat are rendered as disabled items with a tooltip.
+ * than the chat are disabled unless already selected, so stale bindings
+ * can still be cleared.
*/
interface WorkspacePickerListProps {
workspaceOptions:
@@ -1540,7 +1561,7 @@ interface WorkspacePickerListProps {
| undefined;
selectedWorkspaceId?: string | null;
chatOrganizationId?: string;
- onSelect: (id: string) => void;
+ onSelect: (id: string | null) => void;
}
const WorkspacePickerList: FC = ({
@@ -1559,31 +1580,33 @@ const WorkspacePickerList: FC = ({
const isCrossOrg =
!!chatOrganizationId &&
workspace.organization_id !== chatOrganizationId;
+ const isSelected = selectedWorkspaceId === workspace.id;
+ const isUnavailable = isCrossOrg && !isSelected;
const item = (
{
- if (!isCrossOrg) {
- onSelect(workspace.id);
+ if (!isUnavailable) {
+ onSelect(isSelected ? null : workspace.id);
}
}}
>
{workspace.name}
- {selectedWorkspaceId === workspace.id && (
+ {isSelected && (
)}
);
- if (isCrossOrg) {
+ if (isUnavailable) {
return (
diff --git a/site/src/pages/AgentsPage/components/ChatPageContent.tsx b/site/src/pages/AgentsPage/components/ChatPageContent.tsx
index 88e958b725f31..9599b273d16f9 100644
--- a/site/src/pages/AgentsPage/components/ChatPageContent.tsx
+++ b/site/src/pages/AgentsPage/components/ChatPageContent.tsx
@@ -206,7 +206,7 @@ interface ChatPageInputProps {
workspaceOptions: readonly TypesGen.Workspace[];
chatOrganizationId?: string;
selectedWorkspaceId: string | null;
- onWorkspaceChange: (workspaceId: string | null) => void;
+ onWorkspaceChange?: (workspaceId: string | null) => void;
isWorkspaceLoading: boolean;
workspace?: TypesGen.Workspace;
workspaceAgent?: TypesGen.WorkspaceAgent;
diff --git a/site/src/pages/AgentsPage/components/WorkspacePill.stories.tsx b/site/src/pages/AgentsPage/components/WorkspacePill.stories.tsx
index ec8cb4f831ce9..062623f2acd00 100644
--- a/site/src/pages/AgentsPage/components/WorkspacePill.stories.tsx
+++ b/site/src/pages/AgentsPage/components/WorkspacePill.stories.tsx
@@ -1,5 +1,5 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
-import { expect, userEvent, waitFor, within } from "storybook/test";
+import { expect, fn, userEvent, waitFor, within } from "storybook/test";
import type { WorkspaceApp } from "#/api/typesGenerated";
import {
MockListeningPortsResponse,
@@ -139,7 +139,7 @@ export const WithAllApps: Story = {
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- const pill = canvas.getByText("Test-Workspace");
+ const pill = canvas.getByText("test-workspace");
await userEvent.click(pill);
await waitFor(() => {
@@ -168,6 +168,51 @@ export const WithAllApps: Story = {
},
};
+export const WithRemoveAction: Story = {
+ args: {
+ ...defaultProps,
+ workspace: MockWorkspace,
+ agent: agentWithApps,
+ onRemoveWorkspace: fn(),
+ },
+ play: async ({ args, canvasElement }) => {
+ const canvas = within(canvasElement);
+ const workspaceMenuButton = canvas.getByRole("button", {
+ name: `${MockWorkspace.name} workspace menu`,
+ });
+ expect(
+ canvas.queryByRole("button", {
+ name: `Remove workspace ${MockWorkspace.name}`,
+ }),
+ ).not.toBeInTheDocument();
+
+ await userEvent.click(workspaceMenuButton);
+ let detachWorkspaceItem: HTMLElement | null = null;
+ await waitFor(() => {
+ const menuId = workspaceMenuButton.getAttribute("aria-controls");
+ if (!menuId) {
+ throw new Error("Expected workspace pill to control a menu.");
+ }
+
+ const menu = canvasElement.ownerDocument.getElementById(menuId);
+ if (!(menu instanceof HTMLElement)) {
+ throw new Error("Expected workspace menu to render.");
+ }
+
+ detachWorkspaceItem = within(menu).getByRole("menuitem", {
+ name: "Detach workspace",
+ });
+ expect(detachWorkspaceItem).toBeVisible();
+ });
+ if (!detachWorkspaceItem) {
+ throw new Error("Expected detach workspace menu item to render.");
+ }
+
+ await userEvent.click(detachWorkspaceItem);
+ expect(args.onRemoveWorkspace).toHaveBeenCalledTimes(1);
+ },
+};
+
export const WithBuiltinAppsOnly: Story = {
args: {
...defaultProps,
@@ -176,7 +221,7 @@ export const WithBuiltinAppsOnly: Story = {
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- const pill = canvas.getByText("Test-Workspace");
+ const pill = canvas.getByText("test-workspace");
await userEvent.click(pill);
await waitFor(() => {
@@ -198,7 +243,7 @@ export const WithExternalAppsOnly: Story = {
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- const pill = canvas.getByText("Test-Workspace");
+ const pill = canvas.getByText("test-workspace");
await userEvent.click(pill);
await waitFor(() => {
@@ -221,7 +266,7 @@ export const NoApps: Story = {
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- const pill = canvas.getByText("Test-Workspace");
+ const pill = canvas.getByText("test-workspace");
await userEvent.click(pill);
await waitFor(() => {
@@ -239,7 +284,7 @@ export const WithHiddenApp: Story = {
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- const pill = canvas.getByText("Test-Workspace");
+ const pill = canvas.getByText("test-workspace");
await userEvent.click(pill);
await waitFor(() => {
@@ -324,7 +369,7 @@ export const WithListeningPorts: Story = {
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- const pill = canvas.getByText("Test-Workspace");
+ const pill = canvas.getByText("test-workspace");
await userEvent.click(pill);
const body = within(document.body);
@@ -374,7 +419,7 @@ export const WithSharedPorts: Story = {
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- const pill = canvas.getByText("Test-Workspace");
+ const pill = canvas.getByText("test-workspace");
await userEvent.click(pill);
const body = within(document.body);
@@ -418,7 +463,7 @@ export const EmptyPorts: Story = {
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- const pill = canvas.getByText("Test-Workspace");
+ const pill = canvas.getByText("test-workspace");
await userEvent.click(pill);
const body = within(document.body);
diff --git a/site/src/pages/AgentsPage/components/WorkspacePill.tsx b/site/src/pages/AgentsPage/components/WorkspacePill.tsx
index c25d62f584cf7..e5032c390078a 100644
--- a/site/src/pages/AgentsPage/components/WorkspacePill.tsx
+++ b/site/src/pages/AgentsPage/components/WorkspacePill.tsx
@@ -10,6 +10,7 @@ import {
NetworkIcon,
RadioIcon,
SquareTerminalIcon,
+ UnlinkIcon,
} from "lucide-react";
import type { FC } from "react";
import { useState } from "react";
@@ -67,6 +68,7 @@ interface WorkspacePillProps {
chatId: string;
sshCommand?: string;
folder?: string;
+ onRemoveWorkspace?: () => void;
}
export const WorkspacePill: FC = ({
@@ -75,6 +77,7 @@ export const WorkspacePill: FC = ({
chatId,
sshCommand,
folder,
+ onRemoveWorkspace,
}) => {
const [open, setOpen] = useState(false);
const [tooltipOpen, setTooltipOpen] = useState(false);
@@ -107,41 +110,42 @@ export const WorkspacePill: FC = ({
return (
- setTooltipOpen(v && !open)}
- >
-
-
-
-
-
- {workspace.name}
-
-
+ setTooltipOpen(v && !open)}
+ >
+
+
+
-
-
-
-
- {statusLabel}
-
-
+ >
+
+
+ {workspace.name}
+
+
+
+
+
+
+ {statusLabel}
+
+
+
= ({
View Workspace
+ {onRemoveWorkspace && (
+ <>
+
+
+
+ Detach workspace
+
+ >
+ )}
);
diff --git a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.test.tsx b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.test.tsx
index 4793ee017229c..3a7a35b3528b6 100644
--- a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.test.tsx
+++ b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.test.tsx
@@ -63,7 +63,7 @@ test("add 3 hours to deadline", async () => {
await user.click(addButton);
await user.click(addButton);
await screen.findByText(
- `Shutdown time for "Test-Workspace" updated successfully.`,
+ `Shutdown time for "test-workspace" updated successfully.`,
);
expect(await screen.findByText("Stop in 6 hours")).toBeInTheDocument();
@@ -91,7 +91,7 @@ test("remove 2 hours to deadline", async () => {
await user.click(subButton);
await user.click(subButton);
await screen.findByText(
- `Shutdown time for "Test-Workspace" updated successfully.`,
+ `Shutdown time for "test-workspace" updated successfully.`,
);
expect(await screen.findByText("Stop in an hour")).toBeInTheDocument();
@@ -119,7 +119,7 @@ test("rollback to previous deadline on error", async () => {
await user.click(addButton);
await user.click(addButton);
await screen.findByText(
- `Failed to update shutdown time for "Test-Workspace". Please try again.`,
+ `Failed to update shutdown time for "test-workspace". Please try again.`,
);
// In case of an error, the schedule message should remain unchanged
expect(screen.getByText(initialScheduleMessage)).toBeInTheDocument();
@@ -140,7 +140,7 @@ test("request is only sent once when clicking multiple times", async () => {
await user.click(addButton);
await user.click(addButton);
await screen.findByText(
- `Shutdown time for "Test-Workspace" updated successfully.`,
+ `Shutdown time for "test-workspace" updated successfully.`,
);
expect(updateDeadlineSpy).toHaveBeenCalledTimes(1);
});
diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx
index 0abfbcc09251b..9b20d3e0edf2d 100644
--- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx
+++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx
@@ -287,7 +287,7 @@ describe("WorkspaceSchedulePage", () => {
await user.click(submitButton);
const notification = await screen.findByText(
- `Schedule for workspace "Test-Workspace" updated successfully.`,
+ `Schedule for workspace "test-workspace" updated successfully.`,
);
expect(notification).toBeInTheDocument();
@@ -320,7 +320,7 @@ describe("WorkspaceSchedulePage", () => {
await user.click(submitButton);
const notification = await screen.findByText(
- `Schedule for workspace "Test-Workspace" updated successfully.`,
+ `Schedule for workspace "test-workspace" updated successfully.`,
);
expect(notification).toBeInTheDocument();
@@ -345,7 +345,7 @@ describe("WorkspaceSchedulePage", () => {
await user.click(submitButton);
const notification = await screen.findByText(
- `Schedule for workspace "Test-Workspace" updated successfully.`,
+ `Schedule for workspace "test-workspace" updated successfully.`,
);
expect(notification).toBeInTheDocument();
diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts
index 8682a63ed8355..f85f3d4753899 100644
--- a/site/src/testHelpers/entities.ts
+++ b/site/src/testHelpers/entities.ts
@@ -1558,7 +1558,7 @@ export const MockBuilds = [
export const MockWorkspace: TypesGen.Workspace = {
id: "test-workspace",
- name: "Test-Workspace",
+ name: "test-workspace",
created_at: "",
updated_at: "",
template_id: MockTemplate.id,
From f22d4e2cbb064dfe3dae11b9097dca3f6065bda1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pawe=C5=82=20Banaszewski?=
Date: Tue, 2 Jun 2026 09:28:43 +0200
Subject: [PATCH 005/112] feat: add ai_gateway_keys table and related RBAC
(#25563)
Adds table to store keys that AI Gateway standalone replicas will use
to authenticate into Coderd.
Also adds RBAC and audit boilerplate.
---
coderd/apidoc/docs.go | 12 ++++++
coderd/apidoc/swagger.json | 12 ++++++
coderd/audit/diff.go | 1 +
coderd/audit/request.go | 9 +++++
coderd/database/check_constraint.go | 3 ++
coderd/database/dump.sql | 34 +++++++++++++++-
.../000514_ai_gateway_keys.down.sql | 6 +++
.../migrations/000514_ai_gateway_keys.up.sql | 25 ++++++++++++
.../fixtures/000514_ai_gateway_keys.up.sql | 15 +++++++
coderd/database/models.go | 30 +++++++++++++-
coderd/database/sqlc.yaml | 2 +
coderd/database/unique_constraint.go | 4 ++
coderd/rbac/object_gen.go | 10 +++++
coderd/rbac/policy/policy.go | 8 ++++
coderd/rbac/roles_test.go | 18 +++++++++
coderd/rbac/scopes_constants_gen.go | 9 +++++
codersdk/apikey_scopes_gen.go | 4 ++
codersdk/audit.go | 3 ++
codersdk/rbacresources_gen.go | 2 +
docs/admin/security/audit-logs.md | 1 +
docs/reference/api/members.md | 40 +++++++++----------
docs/reference/api/schemas.md | 18 ++++-----
docs/reference/api/users.md | 10 ++---
enterprise/audit/table.go | 9 +++++
site/src/api/rbacresourcesGenerated.ts | 5 +++
site/src/api/typesGenerated.ts | 12 ++++++
26 files changed, 264 insertions(+), 38 deletions(-)
create mode 100644 coderd/database/migrations/000514_ai_gateway_keys.down.sql
create mode 100644 coderd/database/migrations/000514_ai_gateway_keys.up.sql
create mode 100644 coderd/database/migrations/testdata/fixtures/000514_ai_gateway_keys.up.sql
diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go
index 1bbb216b1a34a..7aca308f9d2f9 100644
--- a/coderd/apidoc/docs.go
+++ b/coderd/apidoc/docs.go
@@ -15269,6 +15269,10 @@ const docTemplate = `{
"enum": [
"all",
"application_connect",
+ "ai_gateway_key:*",
+ "ai_gateway_key:create",
+ "ai_gateway_key:delete",
+ "ai_gateway_key:read",
"ai_model_price:*",
"ai_model_price:read",
"ai_model_price:update",
@@ -15499,6 +15503,10 @@ const docTemplate = `{
"x-enum-varnames": [
"APIKeyScopeAll",
"APIKeyScopeApplicationConnect",
+ "APIKeyScopeAiGatewayKeyAll",
+ "APIKeyScopeAiGatewayKeyCreate",
+ "APIKeyScopeAiGatewayKeyDelete",
+ "APIKeyScopeAiGatewayKeyRead",
"APIKeyScopeAiModelPriceAll",
"APIKeyScopeAiModelPriceRead",
"APIKeyScopeAiModelPriceUpdate",
@@ -22329,6 +22337,7 @@ const docTemplate = `{
"type": "string",
"enum": [
"*",
+ "ai_gateway_key",
"ai_model_price",
"ai_provider",
"ai_seat",
@@ -22380,6 +22389,7 @@ const docTemplate = `{
],
"x-enum-varnames": [
"ResourceWildcard",
+ "ResourceAIGatewayKey",
"ResourceAiModelPrice",
"ResourceAIProvider",
"ResourceAiSeat",
@@ -22641,6 +22651,7 @@ const docTemplate = `{
"ai_seat",
"ai_provider",
"ai_provider_key",
+ "ai_gateway_key",
"group_ai_budget",
"chat",
"user_secret",
@@ -22676,6 +22687,7 @@ const docTemplate = `{
"ResourceTypeAISeat",
"ResourceTypeAIProvider",
"ResourceTypeAIProviderKey",
+ "ResourceTypeAIGatewayKey",
"ResourceTypeGroupAIBudget",
"ResourceTypeChat",
"ResourceTypeUserSecret",
diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json
index 6f7224e972316..842eac0c08564 100644
--- a/coderd/apidoc/swagger.json
+++ b/coderd/apidoc/swagger.json
@@ -13653,6 +13653,10 @@
"enum": [
"all",
"application_connect",
+ "ai_gateway_key:*",
+ "ai_gateway_key:create",
+ "ai_gateway_key:delete",
+ "ai_gateway_key:read",
"ai_model_price:*",
"ai_model_price:read",
"ai_model_price:update",
@@ -13883,6 +13887,10 @@
"x-enum-varnames": [
"APIKeyScopeAll",
"APIKeyScopeApplicationConnect",
+ "APIKeyScopeAiGatewayKeyAll",
+ "APIKeyScopeAiGatewayKeyCreate",
+ "APIKeyScopeAiGatewayKeyDelete",
+ "APIKeyScopeAiGatewayKeyRead",
"APIKeyScopeAiModelPriceAll",
"APIKeyScopeAiModelPriceRead",
"APIKeyScopeAiModelPriceUpdate",
@@ -20460,6 +20468,7 @@
"type": "string",
"enum": [
"*",
+ "ai_gateway_key",
"ai_model_price",
"ai_provider",
"ai_seat",
@@ -20511,6 +20520,7 @@
],
"x-enum-varnames": [
"ResourceWildcard",
+ "ResourceAIGatewayKey",
"ResourceAiModelPrice",
"ResourceAIProvider",
"ResourceAiSeat",
@@ -20762,6 +20772,7 @@
"ai_seat",
"ai_provider",
"ai_provider_key",
+ "ai_gateway_key",
"group_ai_budget",
"chat",
"user_secret",
@@ -20797,6 +20808,7 @@
"ResourceTypeAISeat",
"ResourceTypeAIProvider",
"ResourceTypeAIProviderKey",
+ "ResourceTypeAIGatewayKey",
"ResourceTypeGroupAIBudget",
"ResourceTypeChat",
"ResourceTypeUserSecret",
diff --git a/coderd/audit/diff.go b/coderd/audit/diff.go
index a26924552be71..0beec46153974 100644
--- a/coderd/audit/diff.go
+++ b/coderd/audit/diff.go
@@ -36,6 +36,7 @@ type Auditable interface {
database.AiSeatState |
database.AIProvider |
database.AIProviderKey |
+ database.AIGatewayKey |
database.Chat |
database.AuditableGroupAiBudget |
database.UserSecret |
diff --git a/coderd/audit/request.go b/coderd/audit/request.go
index c690bd56f18d9..2304d37e82fb4 100644
--- a/coderd/audit/request.go
+++ b/coderd/audit/request.go
@@ -138,6 +138,8 @@ func ResourceTarget[T Auditable](tgt T) string {
return typed.Name
case database.AIProviderKey:
return typed.ID.String()
+ case database.AIGatewayKey:
+ return typed.Name
case database.AuditableGroupAiBudget:
return typed.GroupName
case database.Chat:
@@ -222,6 +224,8 @@ func ResourceID[T Auditable](tgt T) uuid.UUID {
return typed.ID
case database.AIProviderKey:
return typed.ID
+ case database.AIGatewayKey:
+ return typed.ID
case database.AuditableGroupAiBudget:
return typed.GroupID
case database.Chat:
@@ -291,6 +295,8 @@ func ResourceType[T Auditable](tgt T) database.ResourceType {
return database.ResourceTypeAIProvider
case database.AIProviderKey:
return database.ResourceTypeAIProviderKey
+ case database.AIGatewayKey:
+ return database.ResourceTypeAIGatewayKey
case database.AuditableGroupAiBudget:
return database.ResourceTypeGroupAiBudget
case database.Chat:
@@ -366,6 +372,9 @@ func ResourceRequiresOrgID[T Auditable]() bool {
// AI provider keys inherit the deployment scope of their parent
// provider.
return false
+ case database.AIGatewayKey:
+ // AI Gateway keys are deployment-scoped, not org-scoped.
+ return false
case database.AuditableGroupAiBudget:
// Group AI budgets are org-scoped through their parent group.
return true
diff --git a/coderd/database/check_constraint.go b/coderd/database/check_constraint.go
index 1c20622e58356..c1fa991032758 100644
--- a/coderd/database/check_constraint.go
+++ b/coderd/database/check_constraint.go
@@ -6,6 +6,9 @@ type CheckConstraint string
// CheckConstraint enums.
const (
+ CheckAiGatewayKeysHashedSecretCheck CheckConstraint = "ai_gateway_keys_hashed_secret_check" // ai_gateway_keys
+ CheckAiGatewayKeysNameCheck CheckConstraint = "ai_gateway_keys_name_check" // ai_gateway_keys
+ CheckAiGatewayKeysSecretPrefixCheck CheckConstraint = "ai_gateway_keys_secret_prefix_check" // ai_gateway_keys
CheckAiModelPricesCacheReadPriceCheck CheckConstraint = "ai_model_prices_cache_read_price_check" // ai_model_prices
CheckAiModelPricesCacheWritePriceCheck CheckConstraint = "ai_model_prices_cache_write_price_check" // ai_model_prices
CheckAiModelPricesInputPriceCheck CheckConstraint = "ai_model_prices_input_price_check" // ai_model_prices
diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql
index 82aa376d3488b..0bc0874e51154 100644
--- a/coderd/database/dump.sql
+++ b/coderd/database/dump.sql
@@ -253,7 +253,11 @@ CREATE TYPE api_key_scope AS ENUM (
'boundary_log:*',
'boundary_log:create',
'boundary_log:delete',
- 'boundary_log:read'
+ 'boundary_log:read',
+ 'ai_gateway_key:*',
+ 'ai_gateway_key:create',
+ 'ai_gateway_key:delete',
+ 'ai_gateway_key:read'
);
CREATE TYPE app_sharing_level AS ENUM (
@@ -564,7 +568,8 @@ CREATE TYPE resource_type AS ENUM (
'ai_provider',
'ai_provider_key',
'group_ai_budget',
- 'user_skill'
+ 'user_skill',
+ 'ai_gateway_key'
);
CREATE TYPE shareable_workspace_owners AS ENUM (
@@ -1287,6 +1292,22 @@ BEGIN
END;
$$;
+CREATE TABLE ai_gateway_keys (
+ id uuid NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ name text NOT NULL,
+ secret_prefix character varying(11) NOT NULL,
+ hashed_secret bytea NOT NULL,
+ last_used_at timestamp with time zone,
+ CONSTRAINT ai_gateway_keys_hashed_secret_check CHECK ((length(hashed_secret) > 0)),
+ CONSTRAINT ai_gateway_keys_name_check CHECK (((length(name) <= 64) AND (name ~ '^[a-z0-9]+(-[a-z0-9]+)*$'::text))),
+ CONSTRAINT ai_gateway_keys_secret_prefix_check CHECK ((length((secret_prefix)::text) = 11))
+);
+
+COMMENT ON TABLE ai_gateway_keys IS 'Hashed bearer secrets used by AI Gateway standalone replicas to authenticate into coderd.';
+
+COMMENT ON COLUMN ai_gateway_keys.secret_prefix IS 'Public token prefix for display and audit correlation. Auth uses hashed_secret.';
+
CREATE TABLE ai_model_prices (
provider text NOT NULL,
model text NOT NULL,
@@ -3763,6 +3784,9 @@ ALTER TABLE ONLY workspace_resource_metadata ALTER COLUMN id SET DEFAULT nextval
ALTER TABLE ONLY workspace_agent_stats
ADD CONSTRAINT agent_stats_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ai_gateway_keys
+ ADD CONSTRAINT ai_gateway_keys_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY ai_model_prices
ADD CONSTRAINT ai_model_prices_pkey PRIMARY KEY (provider, model);
@@ -4147,6 +4171,12 @@ ALTER TABLE ONLY workspace_resources
ALTER TABLE ONLY workspaces
ADD CONSTRAINT workspaces_pkey PRIMARY KEY (id);
+CREATE UNIQUE INDEX ai_gateway_keys_hashed_secret_idx ON ai_gateway_keys USING btree (hashed_secret);
+
+CREATE UNIQUE INDEX ai_gateway_keys_name_idx ON ai_gateway_keys USING btree (lower(name));
+
+CREATE UNIQUE INDEX ai_gateway_keys_secret_prefix_idx ON ai_gateway_keys USING btree (secret_prefix);
+
CREATE UNIQUE INDEX ai_providers_name_unique ON ai_providers USING btree (name) WHERE (deleted = false);
CREATE INDEX api_keys_last_used_idx ON api_keys USING btree (last_used DESC);
diff --git a/coderd/database/migrations/000514_ai_gateway_keys.down.sql b/coderd/database/migrations/000514_ai_gateway_keys.down.sql
new file mode 100644
index 0000000000000..698983673f153
--- /dev/null
+++ b/coderd/database/migrations/000514_ai_gateway_keys.down.sql
@@ -0,0 +1,6 @@
+-- Enum additions to resource_type and api_key_scope are intentionally not
+-- reverted because Postgres cannot drop enum values safely.
+DROP INDEX IF EXISTS ai_gateway_keys_hashed_secret_idx;
+DROP INDEX IF EXISTS ai_gateway_keys_secret_prefix_idx;
+DROP INDEX IF EXISTS ai_gateway_keys_name_idx;
+DROP TABLE IF EXISTS ai_gateway_keys;
diff --git a/coderd/database/migrations/000514_ai_gateway_keys.up.sql b/coderd/database/migrations/000514_ai_gateway_keys.up.sql
new file mode 100644
index 0000000000000..537f437ce500a
--- /dev/null
+++ b/coderd/database/migrations/000514_ai_gateway_keys.up.sql
@@ -0,0 +1,25 @@
+CREATE TABLE ai_gateway_keys (
+ id uuid PRIMARY KEY,
+ created_at timestamptz NOT NULL,
+ name text NOT NULL,
+ secret_prefix varchar(11) NOT NULL,
+ hashed_secret bytea NOT NULL,
+ last_used_at timestamptz NULL,
+ CONSTRAINT ai_gateway_keys_name_check CHECK (length(name) <= 64 AND name ~ '^[a-z0-9]+(-[a-z0-9]+)*$'),
+ CONSTRAINT ai_gateway_keys_secret_prefix_check CHECK (length(secret_prefix) = 11),
+ CONSTRAINT ai_gateway_keys_hashed_secret_check CHECK (length(hashed_secret) > 0)
+);
+
+COMMENT ON TABLE ai_gateway_keys IS 'Hashed bearer secrets used by AI Gateway standalone replicas to authenticate into coderd.';
+COMMENT ON COLUMN ai_gateway_keys.secret_prefix IS 'Public token prefix for display and audit correlation. Auth uses hashed_secret.';
+
+CREATE UNIQUE INDEX ai_gateway_keys_name_idx ON ai_gateway_keys USING btree (lower(name));
+CREATE UNIQUE INDEX ai_gateway_keys_secret_prefix_idx ON ai_gateway_keys USING btree (secret_prefix);
+CREATE UNIQUE INDEX ai_gateway_keys_hashed_secret_idx ON ai_gateway_keys USING btree (hashed_secret);
+
+ALTER TYPE resource_type ADD VALUE IF NOT EXISTS 'ai_gateway_key';
+
+ALTER TYPE api_key_scope ADD VALUE IF NOT EXISTS 'ai_gateway_key:*';
+ALTER TYPE api_key_scope ADD VALUE IF NOT EXISTS 'ai_gateway_key:create';
+ALTER TYPE api_key_scope ADD VALUE IF NOT EXISTS 'ai_gateway_key:delete';
+ALTER TYPE api_key_scope ADD VALUE IF NOT EXISTS 'ai_gateway_key:read';
diff --git a/coderd/database/migrations/testdata/fixtures/000514_ai_gateway_keys.up.sql b/coderd/database/migrations/testdata/fixtures/000514_ai_gateway_keys.up.sql
new file mode 100644
index 0000000000000..531946e06ff01
--- /dev/null
+++ b/coderd/database/migrations/testdata/fixtures/000514_ai_gateway_keys.up.sql
@@ -0,0 +1,15 @@
+INSERT INTO ai_gateway_keys (
+ id,
+ created_at,
+ name,
+ secret_prefix,
+ hashed_secret,
+ last_used_at
+) VALUES (
+ '8b6f0a82-9a3a-4d2e-8c0c-2c9c9b9b1a01',
+ '2026-05-21 00:00:00+00',
+ 'example-key',
+ 'cdr_1234567',
+ '\x00'::bytea,
+ NULL
+);
diff --git a/coderd/database/models.go b/coderd/database/models.go
index ebfaa7a051a9b..b2d7fda98fdc9 100644
--- a/coderd/database/models.go
+++ b/coderd/database/models.go
@@ -324,6 +324,10 @@ const (
ApiKeyScopeBoundaryLogCreate APIKeyScope = "boundary_log:create"
ApiKeyScopeBoundaryLogDelete APIKeyScope = "boundary_log:delete"
ApiKeyScopeBoundaryLogRead APIKeyScope = "boundary_log:read"
+ ApiKeyScopeAiGatewayKey APIKeyScope = "ai_gateway_key:*"
+ ApiKeyScopeAiGatewayKeyCreate APIKeyScope = "ai_gateway_key:create"
+ ApiKeyScopeAiGatewayKeyDelete APIKeyScope = "ai_gateway_key:delete"
+ ApiKeyScopeAiGatewayKeyRead APIKeyScope = "ai_gateway_key:read"
)
func (e *APIKeyScope) Scan(src interface{}) error {
@@ -588,7 +592,11 @@ func (e APIKeyScope) Valid() bool {
ApiKeyScopeBoundaryLog,
ApiKeyScopeBoundaryLogCreate,
ApiKeyScopeBoundaryLogDelete,
- ApiKeyScopeBoundaryLogRead:
+ ApiKeyScopeBoundaryLogRead,
+ ApiKeyScopeAiGatewayKey,
+ ApiKeyScopeAiGatewayKeyCreate,
+ ApiKeyScopeAiGatewayKeyDelete,
+ ApiKeyScopeAiGatewayKeyRead:
return true
}
return false
@@ -822,6 +830,10 @@ func AllAPIKeyScopeValues() []APIKeyScope {
ApiKeyScopeBoundaryLogCreate,
ApiKeyScopeBoundaryLogDelete,
ApiKeyScopeBoundaryLogRead,
+ ApiKeyScopeAiGatewayKey,
+ ApiKeyScopeAiGatewayKeyCreate,
+ ApiKeyScopeAiGatewayKeyDelete,
+ ApiKeyScopeAiGatewayKeyRead,
}
}
@@ -3353,6 +3365,7 @@ const (
ResourceTypeAIProviderKey ResourceType = "ai_provider_key"
ResourceTypeGroupAiBudget ResourceType = "group_ai_budget"
ResourceTypeUserSkill ResourceType = "user_skill"
+ ResourceTypeAIGatewayKey ResourceType = "ai_gateway_key"
)
func (e *ResourceType) Scan(src interface{}) error {
@@ -3424,7 +3437,8 @@ func (e ResourceType) Valid() bool {
ResourceTypeAIProvider,
ResourceTypeAIProviderKey,
ResourceTypeGroupAiBudget,
- ResourceTypeUserSkill:
+ ResourceTypeUserSkill,
+ ResourceTypeAIGatewayKey:
return true
}
return false
@@ -3465,6 +3479,7 @@ func AllResourceTypeValues() []ResourceType {
ResourceTypeAIProviderKey,
ResourceTypeGroupAiBudget,
ResourceTypeUserSkill,
+ ResourceTypeAIGatewayKey,
}
}
@@ -4435,6 +4450,17 @@ type AIBridgeUserPrompt struct {
CreatedAt time.Time `db:"created_at" json:"created_at"`
}
+// Hashed bearer secrets used by AI Gateway standalone replicas to authenticate into coderd.
+type AIGatewayKey struct {
+ ID uuid.UUID `db:"id" json:"id"`
+ CreatedAt time.Time `db:"created_at" json:"created_at"`
+ Name string `db:"name" json:"name"`
+ // Public token prefix for display and audit correlation. Auth uses hashed_secret.
+ SecretPrefix string `db:"secret_prefix" json:"secret_prefix"`
+ HashedSecret []byte `db:"hashed_secret" json:"hashed_secret"`
+ LastUsedAt sql.NullTime `db:"last_used_at" json:"last_used_at"`
+}
+
// Runtime configuration for AI providers. Authoritative source for the provider set served by aibridged. Replaces deployment-time CODER_AIBRIDGE_* environment variables.
type AIProvider struct {
ID uuid.UUID `db:"id" json:"id"`
diff --git a/coderd/database/sqlc.yaml b/coderd/database/sqlc.yaml
index 18c738c992106..78448df9dee31 100644
--- a/coderd/database/sqlc.yaml
+++ b/coderd/database/sqlc.yaml
@@ -261,8 +261,10 @@ sql:
ai_provider: AIProvider
ai_provider_key: AIProviderKey
ai_provider_type: AIProviderType
+ ai_gateway_key: AIGatewayKey
resource_type_ai_provider: ResourceTypeAIProvider
resource_type_ai_provider_key: ResourceTypeAIProviderKey
+ resource_type_ai_gateway_key: ResourceTypeAIGatewayKey
mcp_server_config: MCPServerConfig
mcp_server_configs: MCPServerConfigs
mcp_server_user_token: MCPServerUserToken
diff --git a/coderd/database/unique_constraint.go b/coderd/database/unique_constraint.go
index 3d5e5dabcf224..fd11ab2e06c6b 100644
--- a/coderd/database/unique_constraint.go
+++ b/coderd/database/unique_constraint.go
@@ -7,6 +7,7 @@ type UniqueConstraint string
// UniqueConstraint enums.
const (
UniqueAgentStatsPkey UniqueConstraint = "agent_stats_pkey" // ALTER TABLE ONLY workspace_agent_stats ADD CONSTRAINT agent_stats_pkey PRIMARY KEY (id);
+ UniqueAiGatewayKeysPkey UniqueConstraint = "ai_gateway_keys_pkey" // ALTER TABLE ONLY ai_gateway_keys ADD CONSTRAINT ai_gateway_keys_pkey PRIMARY KEY (id);
UniqueAiModelPricesPkey UniqueConstraint = "ai_model_prices_pkey" // ALTER TABLE ONLY ai_model_prices ADD CONSTRAINT ai_model_prices_pkey PRIMARY KEY (provider, model);
UniqueAiProviderKeysPkey UniqueConstraint = "ai_provider_keys_pkey" // ALTER TABLE ONLY ai_provider_keys ADD CONSTRAINT ai_provider_keys_pkey PRIMARY KEY (id);
UniqueAiProvidersPkey UniqueConstraint = "ai_providers_pkey" // ALTER TABLE ONLY ai_providers ADD CONSTRAINT ai_providers_pkey PRIMARY KEY (id);
@@ -135,6 +136,9 @@ const (
UniqueWorkspaceResourceMetadataPkey UniqueConstraint = "workspace_resource_metadata_pkey" // ALTER TABLE ONLY workspace_resource_metadata ADD CONSTRAINT workspace_resource_metadata_pkey PRIMARY KEY (id);
UniqueWorkspaceResourcesPkey UniqueConstraint = "workspace_resources_pkey" // ALTER TABLE ONLY workspace_resources ADD CONSTRAINT workspace_resources_pkey PRIMARY KEY (id);
UniqueWorkspacesPkey UniqueConstraint = "workspaces_pkey" // ALTER TABLE ONLY workspaces ADD CONSTRAINT workspaces_pkey PRIMARY KEY (id);
+ UniqueAiGatewayKeysHashedSecretIndex UniqueConstraint = "ai_gateway_keys_hashed_secret_idx" // CREATE UNIQUE INDEX ai_gateway_keys_hashed_secret_idx ON ai_gateway_keys USING btree (hashed_secret);
+ UniqueAiGatewayKeysNameIndex UniqueConstraint = "ai_gateway_keys_name_idx" // CREATE UNIQUE INDEX ai_gateway_keys_name_idx ON ai_gateway_keys USING btree (lower(name));
+ UniqueAiGatewayKeysSecretPrefixIndex UniqueConstraint = "ai_gateway_keys_secret_prefix_idx" // CREATE UNIQUE INDEX ai_gateway_keys_secret_prefix_idx ON ai_gateway_keys USING btree (secret_prefix);
UniqueAiProvidersNameUnique UniqueConstraint = "ai_providers_name_unique" // CREATE UNIQUE INDEX ai_providers_name_unique ON ai_providers USING btree (name) WHERE (deleted = false);
UniqueIndexAPIKeyName UniqueConstraint = "idx_api_key_name" // CREATE UNIQUE INDEX idx_api_key_name ON api_keys USING btree (user_id, token_name) WHERE (login_type = 'token'::login_type);
UniqueIndexChatDebugRunsIDChat UniqueConstraint = "idx_chat_debug_runs_id_chat" // CREATE UNIQUE INDEX idx_chat_debug_runs_id_chat ON chat_debug_runs USING btree (id, chat_id);
diff --git a/coderd/rbac/object_gen.go b/coderd/rbac/object_gen.go
index 824cf92fdd429..5ff60562b147b 100644
--- a/coderd/rbac/object_gen.go
+++ b/coderd/rbac/object_gen.go
@@ -15,6 +15,15 @@ var (
Type: "*",
}
+ // ResourceAIGatewayKey
+ // Valid Actions
+ // - "ActionCreate" :: create an AI Gateway key
+ // - "ActionDelete" :: delete an AI Gateway key
+ // - "ActionRead" :: read AI Gateway keys
+ ResourceAIGatewayKey = Object{
+ Type: "ai_gateway_key",
+ }
+
// ResourceAiModelPrice
// Valid Actions
// - "ActionRead" :: read AI model prices
@@ -479,6 +488,7 @@ var (
func AllResources() []Objecter {
return []Objecter{
ResourceWildcard,
+ ResourceAIGatewayKey,
ResourceAiModelPrice,
ResourceAIProvider,
ResourceAiSeat,
diff --git a/coderd/rbac/policy/policy.go b/coderd/rbac/policy/policy.go
index f2b17927bd1ed..f97b2a78bc2e1 100644
--- a/coderd/rbac/policy/policy.go
+++ b/coderd/rbac/policy/policy.go
@@ -429,6 +429,14 @@ var RBACPermissions = map[string]PermissionDefinition{
ActionDelete: "delete boundary logs",
},
},
+ "ai_gateway_key": {
+ Name: "AIGatewayKey",
+ Actions: map[Action]ActionDefinition{
+ ActionCreate: "create an AI Gateway key",
+ ActionRead: "read AI Gateway keys",
+ ActionDelete: "delete an AI Gateway key",
+ },
+ },
"boundary_usage": {
Actions: map[Action]ActionDefinition{
ActionRead: "read boundary usage statistics",
diff --git a/coderd/rbac/roles_test.go b/coderd/rbac/roles_test.go
index 0ac992fc86dc8..7fee71935c9f3 100644
--- a/coderd/rbac/roles_test.go
+++ b/coderd/rbac/roles_test.go
@@ -1204,6 +1204,24 @@ func TestRolePermissions(t *testing.T) {
},
},
},
+ {
+ // Only owners can manage AI Gateway keys. They hold
+ // a hashed bearer secret used to authenticate Gateway
+ // replicas to coderd. Keys are deployment-wide.
+ Name: "AIGatewayKey",
+ Actions: []policy.Action{policy.ActionCreate, policy.ActionRead, policy.ActionDelete},
+ Resource: rbac.ResourceAIGatewayKey,
+ AuthorizeMap: map[bool][]hasAuthSubjects{
+ true: {owner},
+ false: {
+ memberMe, agentsAccessUser,
+ orgAdmin, otherOrgAdmin,
+ orgAuditor, otherOrgAuditor,
+ templateAdmin, orgTemplateAdmin, otherOrgTemplateAdmin,
+ userAdmin, orgUserAdmin, otherOrgUserAdmin,
+ },
+ },
+ },
{
Name: "BoundaryUsage",
Actions: []policy.Action{policy.ActionRead, policy.ActionUpdate, policy.ActionDelete},
diff --git a/coderd/rbac/scopes_constants_gen.go b/coderd/rbac/scopes_constants_gen.go
index b664a4371aa35..3adad84a59050 100644
--- a/coderd/rbac/scopes_constants_gen.go
+++ b/coderd/rbac/scopes_constants_gen.go
@@ -7,6 +7,9 @@ package rbac
// declared in code, not here, to avoid duplication.
const (
+ ScopeAiGatewayKeyCreate ScopeName = "ai_gateway_key:create"
+ ScopeAiGatewayKeyDelete ScopeName = "ai_gateway_key:delete"
+ ScopeAiGatewayKeyRead ScopeName = "ai_gateway_key:read"
ScopeAiModelPriceRead ScopeName = "ai_model_price:read"
ScopeAiModelPriceUpdate ScopeName = "ai_model_price:update"
ScopeAiProviderCreate ScopeName = "ai_provider:create"
@@ -187,6 +190,9 @@ func (e ScopeName) Valid() bool {
case ScopeName("coder:all"),
ScopeName("coder:application_connect"),
ScopeName("no_user_data"),
+ ScopeAiGatewayKeyCreate,
+ ScopeAiGatewayKeyDelete,
+ ScopeAiGatewayKeyRead,
ScopeAiModelPriceRead,
ScopeAiModelPriceUpdate,
ScopeAiProviderCreate,
@@ -368,6 +374,9 @@ func AllScopeNameValues() []ScopeName {
ScopeName("coder:all"),
ScopeName("coder:application_connect"),
ScopeName("no_user_data"),
+ ScopeAiGatewayKeyCreate,
+ ScopeAiGatewayKeyDelete,
+ ScopeAiGatewayKeyRead,
ScopeAiModelPriceRead,
ScopeAiModelPriceUpdate,
ScopeAiProviderCreate,
diff --git a/codersdk/apikey_scopes_gen.go b/codersdk/apikey_scopes_gen.go
index 4e4fb8d803cd9..450a5221f0b3a 100644
--- a/codersdk/apikey_scopes_gen.go
+++ b/codersdk/apikey_scopes_gen.go
@@ -6,6 +6,10 @@ const (
APIKeyScopeAll APIKeyScope = "all"
// Deprecated: use codersdk.APIKeyScopeCoderApplicationConnect instead.
APIKeyScopeApplicationConnect APIKeyScope = "application_connect"
+ APIKeyScopeAiGatewayKeyAll APIKeyScope = "ai_gateway_key:*"
+ APIKeyScopeAiGatewayKeyCreate APIKeyScope = "ai_gateway_key:create"
+ APIKeyScopeAiGatewayKeyDelete APIKeyScope = "ai_gateway_key:delete"
+ APIKeyScopeAiGatewayKeyRead APIKeyScope = "ai_gateway_key:read"
APIKeyScopeAiModelPriceAll APIKeyScope = "ai_model_price:*"
APIKeyScopeAiModelPriceRead APIKeyScope = "ai_model_price:read"
APIKeyScopeAiModelPriceUpdate APIKeyScope = "ai_model_price:update"
diff --git a/codersdk/audit.go b/codersdk/audit.go
index eceae40649eb0..e58bbb71f7f6f 100644
--- a/codersdk/audit.go
+++ b/codersdk/audit.go
@@ -48,6 +48,7 @@ const (
ResourceTypeAISeat ResourceType = "ai_seat"
ResourceTypeAIProvider ResourceType = "ai_provider"
ResourceTypeAIProviderKey ResourceType = "ai_provider_key"
+ ResourceTypeAIGatewayKey ResourceType = "ai_gateway_key"
ResourceTypeGroupAIBudget ResourceType = "group_ai_budget"
ResourceTypeChat ResourceType = "chat"
ResourceTypeUserSecret ResourceType = "user_secret"
@@ -116,6 +117,8 @@ func (r ResourceType) FriendlyString() string {
return "ai provider"
case ResourceTypeAIProviderKey:
return "ai provider key"
+ case ResourceTypeAIGatewayKey:
+ return "ai gateway key"
case ResourceTypeGroupAIBudget:
return "group ai budget"
case ResourceTypeChat:
diff --git a/codersdk/rbacresources_gen.go b/codersdk/rbacresources_gen.go
index 75b1e8242168f..622c59c54bf40 100644
--- a/codersdk/rbacresources_gen.go
+++ b/codersdk/rbacresources_gen.go
@@ -5,6 +5,7 @@ type RBACResource string
const (
ResourceWildcard RBACResource = "*"
+ ResourceAIGatewayKey RBACResource = "ai_gateway_key"
ResourceAiModelPrice RBACResource = "ai_model_price"
ResourceAIProvider RBACResource = "ai_provider"
ResourceAiSeat RBACResource = "ai_seat"
@@ -82,6 +83,7 @@ const (
// said resource type.
var RBACResourceActions = map[RBACResource][]RBACAction{
ResourceWildcard: {},
+ ResourceAIGatewayKey: {ActionCreate, ActionDelete, ActionRead},
ResourceAiModelPrice: {ActionRead, ActionUpdate},
ResourceAIProvider: {ActionCreate, ActionDelete, ActionRead, ActionUpdate},
ResourceAiSeat: {ActionCreate, ActionRead},
diff --git a/docs/admin/security/audit-logs.md b/docs/admin/security/audit-logs.md
index 712724e064dca..6e65c5fec5581 100644
--- a/docs/admin/security/audit-logs.md
+++ b/docs/admin/security/audit-logs.md
@@ -15,6 +15,7 @@ We track the following resources:
| Resource | | |
|-----------------------------------------------------------------|----------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| AIGatewayKeycreate, delete | Field Tracked | created_at false hashed_secret true id true last_used_at false name true secret_prefix true
|
| AIProvidercreate, write, delete | Field Tracked | base_url true created_at false deleted true display_name true enabled true id true name true settings true settings_key_id false type true updated_at false
|
| AIProviderKeycreate, delete | Field Tracked | api_key true api_key_key_id false created_at false id true provider_id true updated_at false
|
| APIKeylogin, logout, register, create, write, delete | Field Tracked | allow_list false created_at true expires_at true hashed_secret false id false ip_address false last_used true lifetime_seconds false login_type false scopes false token_name false updated_at false user_id true
|
diff --git a/docs/reference/api/members.md b/docs/reference/api/members.md
index fae805d3a7018..602577852ef38 100644
--- a/docs/reference/api/members.md
+++ b/docs/reference/api/members.md
@@ -193,10 +193,10 @@ Status Code **200**
#### Enumerated Values
-| Property | Value(s) |
-|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `action` | `application_connect`, `assign`, `create`, `create_agent`, `delete`, `delete_agent`, `read`, `read_personal`, `share`, `ssh`, `start`, `stop`, `unassign`, `update`, `update_agent`, `update_personal`, `use`, `view_insights` |
-| `resource_type` | `*`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
+| Property | Value(s) |
+|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `action` | `application_connect`, `assign`, `create`, `create_agent`, `delete`, `delete_agent`, `read`, `read_personal`, `share`, `ssh`, `start`, `stop`, `unassign`, `update`, `update_agent`, `update_personal`, `use`, `view_insights` |
+| `resource_type` | `*`, `ai_gateway_key`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
@@ -326,10 +326,10 @@ Status Code **200**
#### Enumerated Values
-| Property | Value(s) |
-|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `action` | `application_connect`, `assign`, `create`, `create_agent`, `delete`, `delete_agent`, `read`, `read_personal`, `share`, `ssh`, `start`, `stop`, `unassign`, `update`, `update_agent`, `update_personal`, `use`, `view_insights` |
-| `resource_type` | `*`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
+| Property | Value(s) |
+|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `action` | `application_connect`, `assign`, `create`, `create_agent`, `delete`, `delete_agent`, `read`, `read_personal`, `share`, `ssh`, `start`, `stop`, `unassign`, `update`, `update_agent`, `update_personal`, `use`, `view_insights` |
+| `resource_type` | `*`, `ai_gateway_key`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
@@ -459,10 +459,10 @@ Status Code **200**
#### Enumerated Values
-| Property | Value(s) |
-|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `action` | `application_connect`, `assign`, `create`, `create_agent`, `delete`, `delete_agent`, `read`, `read_personal`, `share`, `ssh`, `start`, `stop`, `unassign`, `update`, `update_agent`, `update_personal`, `use`, `view_insights` |
-| `resource_type` | `*`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
+| Property | Value(s) |
+|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `action` | `application_connect`, `assign`, `create`, `create_agent`, `delete`, `delete_agent`, `read`, `read_personal`, `share`, `ssh`, `start`, `stop`, `unassign`, `update`, `update_agent`, `update_personal`, `use`, `view_insights` |
+| `resource_type` | `*`, `ai_gateway_key`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
@@ -554,10 +554,10 @@ Status Code **200**
#### Enumerated Values
-| Property | Value(s) |
-|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `action` | `application_connect`, `assign`, `create`, `create_agent`, `delete`, `delete_agent`, `read`, `read_personal`, `share`, `ssh`, `start`, `stop`, `unassign`, `update`, `update_agent`, `update_personal`, `use`, `view_insights` |
-| `resource_type` | `*`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
+| Property | Value(s) |
+|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `action` | `application_connect`, `assign`, `create`, `create_agent`, `delete`, `delete_agent`, `read`, `read_personal`, `share`, `ssh`, `start`, `stop`, `unassign`, `update`, `update_agent`, `update_personal`, `use`, `view_insights` |
+| `resource_type` | `*`, `ai_gateway_key`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
@@ -960,9 +960,9 @@ Status Code **200**
#### Enumerated Values
-| Property | Value(s) |
-|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `action` | `application_connect`, `assign`, `create`, `create_agent`, `delete`, `delete_agent`, `read`, `read_personal`, `share`, `ssh`, `start`, `stop`, `unassign`, `update`, `update_agent`, `update_personal`, `use`, `view_insights` |
-| `resource_type` | `*`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
+| Property | Value(s) |
+|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `action` | `application_connect`, `assign`, `create`, `create_agent`, `delete`, `delete_agent`, `read`, `read_personal`, `share`, `ssh`, `start`, `stop`, `unassign`, `update`, `update_agent`, `update_personal`, `use`, `view_insights` |
+| `resource_type` | `*`, `ai_gateway_key`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
diff --git a/docs/reference/api/schemas.md b/docs/reference/api/schemas.md
index ea8f19c4bf680..47268ba974767 100644
--- a/docs/reference/api/schemas.md
+++ b/docs/reference/api/schemas.md
@@ -1444,9 +1444,9 @@ None
#### Enumerated Values
-| Value(s) |
-|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `ai_model_price:*`, `ai_model_price:read`, `ai_model_price:update`, `ai_provider:*`, `ai_provider:create`, `ai_provider:delete`, `ai_provider:read`, `ai_provider:update`, `ai_seat:*`, `ai_seat:create`, `ai_seat:read`, `aibridge_interception:*`, `aibridge_interception:create`, `aibridge_interception:read`, `aibridge_interception:update`, `all`, `api_key:*`, `api_key:create`, `api_key:delete`, `api_key:read`, `api_key:update`, `application_connect`, `assign_org_role:*`, `assign_org_role:assign`, `assign_org_role:create`, `assign_org_role:delete`, `assign_org_role:read`, `assign_org_role:unassign`, `assign_org_role:update`, `assign_role:*`, `assign_role:assign`, `assign_role:read`, `assign_role:unassign`, `audit_log:*`, `audit_log:create`, `audit_log:read`, `boundary_log:*`, `boundary_log:create`, `boundary_log:delete`, `boundary_log:read`, `boundary_usage:*`, `boundary_usage:delete`, `boundary_usage:read`, `boundary_usage:update`, `chat:*`, `chat:create`, `chat:delete`, `chat:read`, `chat:share`, `chat:update`, `coder:all`, `coder:apikeys.manage_self`, `coder:application_connect`, `coder:templates.author`, `coder:templates.build`, `coder:workspaces.access`, `coder:workspaces.create`, `coder:workspaces.delete`, `coder:workspaces.operate`, `connection_log:*`, `connection_log:read`, `connection_log:update`, `crypto_key:*`, `crypto_key:create`, `crypto_key:delete`, `crypto_key:read`, `crypto_key:update`, `debug_info:*`, `debug_info:read`, `deployment_config:*`, `deployment_config:read`, `deployment_config:update`, `deployment_stats:*`, `deployment_stats:read`, `file:*`, `file:create`, `file:read`, `group:*`, `group:create`, `group:delete`, `group:read`, `group:update`, `group_member:*`, `group_member:read`, `idpsync_settings:*`, `idpsync_settings:read`, `idpsync_settings:update`, `inbox_notification:*`, `inbox_notification:create`, `inbox_notification:read`, `inbox_notification:update`, `license:*`, `license:create`, `license:delete`, `license:read`, `notification_message:*`, `notification_message:create`, `notification_message:delete`, `notification_message:read`, `notification_message:update`, `notification_preference:*`, `notification_preference:read`, `notification_preference:update`, `notification_template:*`, `notification_template:read`, `notification_template:update`, `oauth2_app:*`, `oauth2_app:create`, `oauth2_app:delete`, `oauth2_app:read`, `oauth2_app:update`, `oauth2_app_code_token:*`, `oauth2_app_code_token:create`, `oauth2_app_code_token:delete`, `oauth2_app_code_token:read`, `oauth2_app_secret:*`, `oauth2_app_secret:create`, `oauth2_app_secret:delete`, `oauth2_app_secret:read`, `oauth2_app_secret:update`, `organization:*`, `organization:create`, `organization:delete`, `organization:read`, `organization:update`, `organization_member:*`, `organization_member:create`, `organization_member:delete`, `organization_member:read`, `organization_member:update`, `prebuilt_workspace:*`, `prebuilt_workspace:delete`, `prebuilt_workspace:update`, `provisioner_daemon:*`, `provisioner_daemon:create`, `provisioner_daemon:delete`, `provisioner_daemon:read`, `provisioner_daemon:update`, `provisioner_jobs:*`, `provisioner_jobs:create`, `provisioner_jobs:read`, `provisioner_jobs:update`, `replicas:*`, `replicas:read`, `system:*`, `system:create`, `system:delete`, `system:read`, `system:update`, `tailnet_coordinator:*`, `tailnet_coordinator:create`, `tailnet_coordinator:delete`, `tailnet_coordinator:read`, `tailnet_coordinator:update`, `task:*`, `task:create`, `task:delete`, `task:read`, `task:update`, `template:*`, `template:create`, `template:delete`, `template:read`, `template:update`, `template:use`, `template:view_insights`, `usage_event:*`, `usage_event:create`, `usage_event:read`, `usage_event:update`, `user:*`, `user:create`, `user:delete`, `user:read`, `user:read_personal`, `user:update`, `user:update_personal`, `user_secret:*`, `user_secret:create`, `user_secret:delete`, `user_secret:read`, `user_secret:update`, `user_skill:*`, `user_skill:create`, `user_skill:delete`, `user_skill:read`, `user_skill:update`, `webpush_subscription:*`, `webpush_subscription:create`, `webpush_subscription:delete`, `webpush_subscription:read`, `workspace:*`, `workspace:application_connect`, `workspace:create`, `workspace:create_agent`, `workspace:delete`, `workspace:delete_agent`, `workspace:read`, `workspace:share`, `workspace:ssh`, `workspace:start`, `workspace:stop`, `workspace:update`, `workspace:update_agent`, `workspace_agent_devcontainers:*`, `workspace_agent_devcontainers:create`, `workspace_agent_resource_monitor:*`, `workspace_agent_resource_monitor:create`, `workspace_agent_resource_monitor:read`, `workspace_agent_resource_monitor:update`, `workspace_dormant:*`, `workspace_dormant:application_connect`, `workspace_dormant:create`, `workspace_dormant:create_agent`, `workspace_dormant:delete`, `workspace_dormant:delete_agent`, `workspace_dormant:read`, `workspace_dormant:share`, `workspace_dormant:ssh`, `workspace_dormant:start`, `workspace_dormant:stop`, `workspace_dormant:update`, `workspace_dormant:update_agent`, `workspace_proxy:*`, `workspace_proxy:create`, `workspace_proxy:delete`, `workspace_proxy:read`, `workspace_proxy:update` |
+| Value(s) |
+|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `ai_gateway_key:*`, `ai_gateway_key:create`, `ai_gateway_key:delete`, `ai_gateway_key:read`, `ai_model_price:*`, `ai_model_price:read`, `ai_model_price:update`, `ai_provider:*`, `ai_provider:create`, `ai_provider:delete`, `ai_provider:read`, `ai_provider:update`, `ai_seat:*`, `ai_seat:create`, `ai_seat:read`, `aibridge_interception:*`, `aibridge_interception:create`, `aibridge_interception:read`, `aibridge_interception:update`, `all`, `api_key:*`, `api_key:create`, `api_key:delete`, `api_key:read`, `api_key:update`, `application_connect`, `assign_org_role:*`, `assign_org_role:assign`, `assign_org_role:create`, `assign_org_role:delete`, `assign_org_role:read`, `assign_org_role:unassign`, `assign_org_role:update`, `assign_role:*`, `assign_role:assign`, `assign_role:read`, `assign_role:unassign`, `audit_log:*`, `audit_log:create`, `audit_log:read`, `boundary_log:*`, `boundary_log:create`, `boundary_log:delete`, `boundary_log:read`, `boundary_usage:*`, `boundary_usage:delete`, `boundary_usage:read`, `boundary_usage:update`, `chat:*`, `chat:create`, `chat:delete`, `chat:read`, `chat:share`, `chat:update`, `coder:all`, `coder:apikeys.manage_self`, `coder:application_connect`, `coder:templates.author`, `coder:templates.build`, `coder:workspaces.access`, `coder:workspaces.create`, `coder:workspaces.delete`, `coder:workspaces.operate`, `connection_log:*`, `connection_log:read`, `connection_log:update`, `crypto_key:*`, `crypto_key:create`, `crypto_key:delete`, `crypto_key:read`, `crypto_key:update`, `debug_info:*`, `debug_info:read`, `deployment_config:*`, `deployment_config:read`, `deployment_config:update`, `deployment_stats:*`, `deployment_stats:read`, `file:*`, `file:create`, `file:read`, `group:*`, `group:create`, `group:delete`, `group:read`, `group:update`, `group_member:*`, `group_member:read`, `idpsync_settings:*`, `idpsync_settings:read`, `idpsync_settings:update`, `inbox_notification:*`, `inbox_notification:create`, `inbox_notification:read`, `inbox_notification:update`, `license:*`, `license:create`, `license:delete`, `license:read`, `notification_message:*`, `notification_message:create`, `notification_message:delete`, `notification_message:read`, `notification_message:update`, `notification_preference:*`, `notification_preference:read`, `notification_preference:update`, `notification_template:*`, `notification_template:read`, `notification_template:update`, `oauth2_app:*`, `oauth2_app:create`, `oauth2_app:delete`, `oauth2_app:read`, `oauth2_app:update`, `oauth2_app_code_token:*`, `oauth2_app_code_token:create`, `oauth2_app_code_token:delete`, `oauth2_app_code_token:read`, `oauth2_app_secret:*`, `oauth2_app_secret:create`, `oauth2_app_secret:delete`, `oauth2_app_secret:read`, `oauth2_app_secret:update`, `organization:*`, `organization:create`, `organization:delete`, `organization:read`, `organization:update`, `organization_member:*`, `organization_member:create`, `organization_member:delete`, `organization_member:read`, `organization_member:update`, `prebuilt_workspace:*`, `prebuilt_workspace:delete`, `prebuilt_workspace:update`, `provisioner_daemon:*`, `provisioner_daemon:create`, `provisioner_daemon:delete`, `provisioner_daemon:read`, `provisioner_daemon:update`, `provisioner_jobs:*`, `provisioner_jobs:create`, `provisioner_jobs:read`, `provisioner_jobs:update`, `replicas:*`, `replicas:read`, `system:*`, `system:create`, `system:delete`, `system:read`, `system:update`, `tailnet_coordinator:*`, `tailnet_coordinator:create`, `tailnet_coordinator:delete`, `tailnet_coordinator:read`, `tailnet_coordinator:update`, `task:*`, `task:create`, `task:delete`, `task:read`, `task:update`, `template:*`, `template:create`, `template:delete`, `template:read`, `template:update`, `template:use`, `template:view_insights`, `usage_event:*`, `usage_event:create`, `usage_event:read`, `usage_event:update`, `user:*`, `user:create`, `user:delete`, `user:read`, `user:read_personal`, `user:update`, `user:update_personal`, `user_secret:*`, `user_secret:create`, `user_secret:delete`, `user_secret:read`, `user_secret:update`, `user_skill:*`, `user_skill:create`, `user_skill:delete`, `user_skill:read`, `user_skill:update`, `webpush_subscription:*`, `webpush_subscription:create`, `webpush_subscription:delete`, `webpush_subscription:read`, `workspace:*`, `workspace:application_connect`, `workspace:create`, `workspace:create_agent`, `workspace:delete`, `workspace:delete_agent`, `workspace:read`, `workspace:share`, `workspace:ssh`, `workspace:start`, `workspace:stop`, `workspace:update`, `workspace:update_agent`, `workspace_agent_devcontainers:*`, `workspace_agent_devcontainers:create`, `workspace_agent_resource_monitor:*`, `workspace_agent_resource_monitor:create`, `workspace_agent_resource_monitor:read`, `workspace_agent_resource_monitor:update`, `workspace_dormant:*`, `workspace_dormant:application_connect`, `workspace_dormant:create`, `workspace_dormant:create_agent`, `workspace_dormant:delete`, `workspace_dormant:delete_agent`, `workspace_dormant:read`, `workspace_dormant:share`, `workspace_dormant:ssh`, `workspace_dormant:start`, `workspace_dormant:stop`, `workspace_dormant:update`, `workspace_dormant:update_agent`, `workspace_proxy:*`, `workspace_proxy:create`, `workspace_proxy:delete`, `workspace_proxy:read`, `workspace_proxy:update` |
## codersdk.AddLicenseRequest
@@ -10818,9 +10818,9 @@ Only certain features set these fields: - FeatureManagedAgentLimit|
#### Enumerated Values
-| Value(s) |
-|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `*`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
+| Value(s) |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `*`, `ai_gateway_key`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
## codersdk.RateLimitConfig
@@ -11036,9 +11036,9 @@ Only certain features set these fields: - FeatureManagedAgentLimit|
#### Enumerated Values
-| Value(s) |
-|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `ai_provider`, `ai_provider_key`, `ai_seat`, `api_key`, `chat`, `convert_login`, `custom_role`, `git_ssh_key`, `group`, `group_ai_budget`, `health_settings`, `idp_sync_settings_group`, `idp_sync_settings_organization`, `idp_sync_settings_role`, `license`, `notification_template`, `notifications_settings`, `oauth2_provider_app`, `oauth2_provider_app_secret`, `organization`, `organization_member`, `prebuilds_settings`, `task`, `template`, `template_version`, `user`, `user_secret`, `user_skill`, `workspace`, `workspace_agent`, `workspace_app`, `workspace_build`, `workspace_proxy` |
+| Value(s) |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `ai_gateway_key`, `ai_provider`, `ai_provider_key`, `ai_seat`, `api_key`, `chat`, `convert_login`, `custom_role`, `git_ssh_key`, `group`, `group_ai_budget`, `health_settings`, `idp_sync_settings_group`, `idp_sync_settings_organization`, `idp_sync_settings_role`, `license`, `notification_template`, `notifications_settings`, `oauth2_provider_app`, `oauth2_provider_app_secret`, `organization`, `organization_member`, `prebuilds_settings`, `task`, `template`, `template_version`, `user`, `user_secret`, `user_skill`, `workspace`, `workspace_agent`, `workspace_app`, `workspace_build`, `workspace_proxy` |
## codersdk.Response
diff --git a/docs/reference/api/users.md b/docs/reference/api/users.md
index 0bedde7b0ca99..c82ca65701de7 100644
--- a/docs/reference/api/users.md
+++ b/docs/reference/api/users.md
@@ -865,11 +865,11 @@ Status Code **200**
#### Enumerated Values
-| Property | Value(s) |
-|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `type` | `*`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
-| `login_type` | `github`, `oidc`, `password`, `token` |
-| `scope` | `all`, `application_connect` |
+| Property | Value(s) |
+|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `type` | `*`, `ai_gateway_key`, `ai_model_price`, `ai_provider`, `ai_seat`, `aibridge_interception`, `api_key`, `assign_org_role`, `assign_role`, `audit_log`, `boundary_log`, `boundary_usage`, `chat`, `connection_log`, `crypto_key`, `debug_info`, `deployment_config`, `deployment_stats`, `file`, `group`, `group_member`, `idpsync_settings`, `inbox_notification`, `license`, `notification_message`, `notification_preference`, `notification_template`, `oauth2_app`, `oauth2_app_code_token`, `oauth2_app_secret`, `organization`, `organization_member`, `prebuilt_workspace`, `provisioner_daemon`, `provisioner_jobs`, `replicas`, `system`, `tailnet_coordinator`, `task`, `template`, `usage_event`, `user`, `user_secret`, `user_skill`, `webpush_subscription`, `workspace`, `workspace_agent_devcontainers`, `workspace_agent_resource_monitor`, `workspace_dormant`, `workspace_proxy` |
+| `login_type` | `github`, `oidc`, `password`, `token` |
+| `scope` | `all`, `application_connect` |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
diff --git a/enterprise/audit/table.go b/enterprise/audit/table.go
index e97a76daed947..315f6af2280fd 100644
--- a/enterprise/audit/table.go
+++ b/enterprise/audit/table.go
@@ -31,6 +31,7 @@ var AuditActionMap = map[string][]codersdk.AuditAction{
"AiSeatState": {codersdk.AuditActionCreate},
"AIProvider": {codersdk.AuditActionCreate, codersdk.AuditActionWrite, codersdk.AuditActionDelete},
"AIProviderKey": {codersdk.AuditActionCreate, codersdk.AuditActionDelete},
+ "AIGatewayKey": {codersdk.AuditActionCreate, codersdk.AuditActionDelete},
"AuditableGroupAiBudget": {codersdk.AuditActionWrite, codersdk.AuditActionDelete},
"Chat": {codersdk.AuditActionCreate, codersdk.AuditActionWrite}, // chats get 'archived' by users, not deleted.
"UserSecret": {codersdk.AuditActionCreate, codersdk.AuditActionWrite, codersdk.AuditActionDelete},
@@ -400,6 +401,14 @@ var auditableResourcesTypes = map[any]map[string]Action{
"created_at": ActionIgnore, // Implicit; not useful in a diff.
"updated_at": ActionIgnore, // Changes; not useful in a diff.
},
+ &database.AIGatewayKey{}: {
+ "id": ActionTrack,
+ "name": ActionTrack,
+ "secret_prefix": ActionTrack,
+ "hashed_secret": ActionSecret, // Bearer token hash, never expose.
+ "created_at": ActionIgnore, // Implicit; not useful in a diff.
+ "last_used_at": ActionIgnore, // Bumped on every use.
+ },
&database.TaskTable{}: {
"id": ActionTrack,
"organization_id": ActionIgnore, // Never changes.
diff --git a/site/src/api/rbacresourcesGenerated.ts b/site/src/api/rbacresourcesGenerated.ts
index 2ac260c98ae18..15fd4a0f43a17 100644
--- a/site/src/api/rbacresourcesGenerated.ts
+++ b/site/src/api/rbacresourcesGenerated.ts
@@ -8,6 +8,11 @@ import type { RBACAction, RBACResource } from "./typesGenerated";
export const RBACResourceActions: Partial<
Record>>
> = {
+ ai_gateway_key: {
+ create: "create an AI Gateway key",
+ delete: "delete an AI Gateway key",
+ read: "read AI Gateway keys",
+ },
ai_model_price: {
read: "read AI model prices",
update: "update AI model prices",
diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts
index a42e1489ffe88..a0aad00206d31 100644
--- a/site/src/api/typesGenerated.ts
+++ b/site/src/api/typesGenerated.ts
@@ -518,6 +518,10 @@ export interface APIKey {
// From codersdk/apikey.go
export type APIKeyScope =
+ | "ai_gateway_key:*"
+ | "ai_gateway_key:create"
+ | "ai_gateway_key:delete"
+ | "ai_gateway_key:read"
| "ai_model_price:*"
| "ai_model_price:read"
| "ai_model_price:update"
@@ -748,6 +752,10 @@ export type APIKeyScope =
| "workspace:update_agent";
export const APIKeyScopes: APIKeyScope[] = [
+ "ai_gateway_key:*",
+ "ai_gateway_key:create",
+ "ai_gateway_key:delete",
+ "ai_gateway_key:read",
"ai_model_price:*",
"ai_model_price:read",
"ai_model_price:update",
@@ -6873,6 +6881,7 @@ export const RBACActions: RBACAction[] = [
// From codersdk/rbacresources_gen.go
export type RBACResource =
+ | "ai_gateway_key"
| "ai_provider"
| "ai_model_price"
| "ai_seat"
@@ -6924,6 +6933,7 @@ export type RBACResource =
| "workspace_proxy";
export const RBACResources: RBACResource[] = [
+ "ai_gateway_key",
"ai_provider",
"ai_model_price",
"ai_seat",
@@ -7080,6 +7090,7 @@ export interface ResolveAutostartResponse {
// From codersdk/audit.go
export type ResourceType =
+ | "ai_gateway_key"
| "ai_provider"
| "ai_provider_key"
| "ai_seat"
@@ -7115,6 +7126,7 @@ export type ResourceType =
| "workspace_proxy";
export const ResourceTypes: ResourceType[] = [
+ "ai_gateway_key",
"ai_provider",
"ai_provider_key",
"ai_seat",
From 8d93aea1b0954a3fc2c461226d36dea80b0f3a52 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:15:48 +0000
Subject: [PATCH 006/112] chore: bump @types/node from 20.19.39 to 20.19.41 in
/offlinedocs (#25952)
Bumps
[@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)
from 20.19.39 to 20.19.41.
Commits
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
offlinedocs/package.json | 2 +-
offlinedocs/pnpm-lock.yaml | 10 +++++-----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/offlinedocs/package.json b/offlinedocs/package.json
index cdc35b1e50c34..94720c7a06b0a 100644
--- a/offlinedocs/package.json
+++ b/offlinedocs/package.json
@@ -31,7 +31,7 @@
},
"devDependencies": {
"@types/lodash": "4.17.24",
- "@types/node": "20.19.39",
+ "@types/node": "20.19.41",
"@types/react": "18.3.12",
"@types/react-dom": "18.3.1",
"@types/sanitize-html": "2.16.1",
diff --git a/offlinedocs/pnpm-lock.yaml b/offlinedocs/pnpm-lock.yaml
index 60120df521a5d..5d266d82041db 100644
--- a/offlinedocs/pnpm-lock.yaml
+++ b/offlinedocs/pnpm-lock.yaml
@@ -69,8 +69,8 @@ importers:
specifier: 4.17.24
version: 4.17.24
'@types/node':
- specifier: 20.19.39
- version: 20.19.39
+ specifier: 20.19.41
+ version: 20.19.41
'@types/react':
specifier: 18.3.12
version: 18.3.12
@@ -585,8 +585,8 @@ packages:
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
- '@types/node@20.19.39':
- resolution: {integrity: sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==}
+ '@types/node@20.19.41':
+ resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==}
'@types/parse-json@4.0.2':
resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
@@ -3093,7 +3093,7 @@ snapshots:
'@types/ms@2.1.0': {}
- '@types/node@20.19.39':
+ '@types/node@20.19.41':
dependencies:
undici-types: 6.21.0
From 0182219011161495c31707f8b60ac9bd93a333e6 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:18:02 +0000
Subject: [PATCH 007/112] chore: bump the react group across 1 directory with 3
updates (#25950)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[//]: # (dependabot-start)
⚠️ **Dependabot is rebasing this PR** ⚠️
Rebasing might not happen immediately, so don't worry if this takes some
time.
Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.
---
[//]: # (dependabot-end)
Bumps the react group with 3 updates in the /site directory:
[react](https://github.com/facebook/react/tree/HEAD/packages/react),
[@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react)
and
[react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom).
Updates `react` from 19.2.5 to 19.2.6
Release notes
Sourced from react's
releases .
19.2.6 (May 6th, 2026)
React Server Components
Commits
Updates `@types/react` from 19.2.14 to 19.2.15
Commits
Updates `react-dom` from 19.2.5 to 19.2.6
Release notes
Sourced from react-dom's
releases .
19.2.6 (May 6th, 2026)
React Server Components
Commits
Updates `@types/react` from 19.2.14 to 19.2.15
Commits
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore ` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore ` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore ` will
remove the ignore condition of the specified dependency and ignore
conditions
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 6 +-
site/pnpm-lock.yaml | 1864 +++++++++++++++++++++----------------------
2 files changed, 935 insertions(+), 935 deletions(-)
diff --git a/site/package.json b/site/package.json
index 0df67783475b8..c14a76a6ab4c1 100644
--- a/site/package.json
+++ b/site/package.json
@@ -92,11 +92,11 @@
"motion": "12.38.0",
"pretty-bytes": "6.1.1",
"radix-ui": "1.4.3",
- "react": "19.2.5",
+ "react": "19.2.6",
"react-color": "2.19.3",
"react-confetti": "6.4.0",
"react-day-picker": "9.14.0",
- "react-dom": "19.2.5",
+ "react-dom": "19.2.6",
"react-infinite-scroll-component": "7.1.0",
"react-markdown": "9.1.0",
"react-query": "npm:@tanstack/react-query@5.77.0",
@@ -148,7 +148,7 @@
"@types/lodash": "4.17.21",
"@types/node": "20.19.39",
"@types/novnc__novnc": "1.5.0",
- "@types/react": "19.2.14",
+ "@types/react": "19.2.15",
"@types/react-color": "3.0.13",
"@types/react-dom": "19.2.3",
"@types/react-syntax-highlighter": "15.5.13",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index f99dc40d62baf..fb5c914ab9b2a 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -34,19 +34,19 @@ importers:
dependencies:
'@dnd-kit/core':
specifier: 6.3.1
- version: 6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@dnd-kit/sortable':
specifier: 10.0.0
- version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)
+ version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)
'@dnd-kit/utilities':
specifier: 3.2.2
- version: 3.2.2(react@19.2.5)
+ version: 3.2.2(react@19.2.6)
'@emoji-mart/data':
specifier: 1.2.1
version: 1.2.1
'@emoji-mart/react':
specifier: 1.1.1
- version: 1.1.1(emoji-mart@5.6.0)(react@19.2.5)
+ version: 1.1.1(emoji-mart@5.6.0)(react@19.2.6)
'@emotion/cache':
specifier: 11.14.0
version: 11.14.0
@@ -55,10 +55,10 @@ importers:
version: 11.13.5
'@emotion/react':
specifier: 11.14.0
- version: 11.14.0(@types/react@19.2.14)(react@19.2.5)
+ version: 11.14.0(@types/react@19.2.15)(react@19.2.6)
'@emotion/styled':
specifier: 11.14.1
- version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
+ version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)
'@fontsource-variable/geist':
specifier: 5.2.8
version: 5.2.8
@@ -79,28 +79,28 @@ importers:
version: 5.2.7
'@lexical/react':
specifier: 0.44.0
- version: 0.44.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(yjs@13.6.29)
+ version: 0.44.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.29)
'@lexical/utils':
specifier: 0.44.0
version: 0.44.0
'@monaco-editor/react':
specifier: 4.7.0
- version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@mui/material':
specifier: 5.18.0
- version: 5.18.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 5.18.0(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@mui/system':
specifier: 5.18.0
- version: 5.18.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
+ version: 5.18.0(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)
'@novnc/novnc':
specifier: ^1.5.0
version: 1.5.0
'@pierre/diffs':
specifier: 1.1.19
- version: 1.1.19(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 1.1.19(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@tanstack/react-query-devtools':
specifier: 5.77.0
- version: 5.77.0(@tanstack/react-query@5.77.0(react@19.2.5))(react@19.2.5)
+ version: 5.77.0(@tanstack/react-query@5.77.0(react@19.2.6))(react@19.2.6)
'@xterm/addon-canvas':
specifier: 0.7.0
version: 0.7.0(@xterm/xterm@5.5.0)
@@ -136,7 +136,7 @@ importers:
version: 2.1.1
cmdk:
specifier: 1.1.1
- version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
color-convert:
specifier: 2.0.1
version: 2.0.1
@@ -160,7 +160,7 @@ importers:
version: 2.0.5
formik:
specifier: 2.4.9
- version: 2.4.9(@types/react@19.2.14)(react@19.2.5)
+ version: 2.4.9(@types/react@19.2.15)(react@19.2.6)
front-matter:
specifier: 4.0.2
version: 4.0.2
@@ -178,64 +178,64 @@ importers:
version: 4.18.1
lucide-react:
specifier: 0.555.0
- version: 0.555.0(react@19.2.5)
+ version: 0.555.0(react@19.2.6)
monaco-editor:
specifier: 0.55.1
version: 0.55.1
motion:
specifier: 12.38.0
- version: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
pretty-bytes:
specifier: 6.1.1
version: 6.1.1
radix-ui:
specifier: 1.4.3
- version: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react:
- specifier: 19.2.5
- version: 19.2.5
+ specifier: 19.2.6
+ version: 19.2.6
react-color:
specifier: 2.19.3
- version: 2.19.3(react@19.2.5)
+ version: 2.19.3(react@19.2.6)
react-confetti:
specifier: 6.4.0
- version: 6.4.0(react@19.2.5)
+ version: 6.4.0(react@19.2.6)
react-day-picker:
specifier: 9.14.0
- version: 9.14.0(react@19.2.5)
+ version: 9.14.0(react@19.2.6)
react-dom:
- specifier: 19.2.5
- version: 19.2.5(react@19.2.5)
+ specifier: 19.2.6
+ version: 19.2.6(react@19.2.6)
react-infinite-scroll-component:
specifier: 7.1.0
- version: 7.1.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 7.1.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react-markdown:
specifier: 9.1.0
- version: 9.1.0(@types/react@19.2.14)(react@19.2.5)
+ version: 9.1.0(@types/react@19.2.15)(react@19.2.6)
react-query:
specifier: npm:@tanstack/react-query@5.77.0
- version: '@tanstack/react-query@5.77.0(react@19.2.5)'
+ version: '@tanstack/react-query@5.77.0(react@19.2.6)'
react-resizable-panels:
specifier: 3.0.6
- version: 3.0.6(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 3.0.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react-router:
specifier: 7.12.0
- version: 7.12.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 7.12.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react-syntax-highlighter:
specifier: 15.6.6
- version: 15.6.6(react@19.2.5)
+ version: 15.6.6(react@19.2.6)
react-textarea-autosize:
specifier: 8.5.9
- version: 8.5.9(@types/react@19.2.14)(react@19.2.5)
+ version: 8.5.9(@types/react@19.2.15)(react@19.2.6)
react-virtualized-auto-sizer:
specifier: 1.0.26
- version: 1.0.26(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 1.0.26(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react-window:
specifier: 1.8.11
- version: 1.8.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 1.8.11(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
recharts:
specifier: 2.15.4
- version: 2.15.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 2.15.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
remark-gfm:
specifier: 4.0.1
version: 4.0.1
@@ -244,10 +244,10 @@ importers:
version: 7.7.3
sonner:
specifier: 2.0.7
- version: 2.0.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 2.0.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
streamdown:
specifier: 2.5.0
- version: 2.5.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 2.5.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
tailwind-merge:
specifier: 2.6.0
version: 2.6.0
@@ -287,7 +287,7 @@ importers:
version: 2.4.10
'@chromatic-com/storybook':
specifier: 5.0.1
- version: 5.0.1(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))
+ version: 5.0.1(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@octokit/types':
specifier: 12.6.0
version: 12.6.0
@@ -299,25 +299,25 @@ importers:
version: 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/addon-a11y':
specifier: 10.3.3
- version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))
+ version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-docs':
specifier: 10.3.3
- version: 10.3.3(@types/react@19.2.14)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 10.3.3(@types/react@19.2.15)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/addon-links':
specifier: 10.3.3
- version: 10.3.3(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))
+ version: 10.3.3(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-mcp':
specifier: ^0.6.0
- version: 0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@6.0.2)
+ version: 0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)
'@storybook/addon-themes':
specifier: 10.3.3
- version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))
+ version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-vitest':
specifier: 10.3.3
- version: 10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.5)
+ version: 10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
'@storybook/react-vite':
specifier: 10.3.3
- version: 10.3.3(esbuild@0.25.12)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@tailwindcss/typography':
specifier: 0.5.19
version: 0.5.19(tailwindcss@3.4.18(yaml@2.8.3))
@@ -326,7 +326,7 @@ importers:
version: 6.9.1
'@testing-library/react':
specifier: 14.3.1
- version: 14.3.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 14.3.1(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@testing-library/user-event':
specifier: 14.6.1
version: 14.6.1(@testing-library/dom@10.4.0)
@@ -355,20 +355,20 @@ importers:
specifier: 1.5.0
version: 1.5.0
'@types/react':
- specifier: 19.2.14
- version: 19.2.14
+ specifier: 19.2.15
+ version: 19.2.15
'@types/react-color':
specifier: 3.0.13
- version: 3.0.13(@types/react@19.2.14)
+ version: 3.0.13(@types/react@19.2.15)
'@types/react-dom':
specifier: 19.2.3
- version: 19.2.3(@types/react@19.2.14)
+ version: 19.2.3(@types/react@19.2.15)
'@types/react-syntax-highlighter':
specifier: 15.5.13
version: 15.5.13
'@types/react-virtualized-auto-sizer':
specifier: 1.0.8
- version: 1.0.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 1.0.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@types/react-window':
specifier: 1.8.8
version: 1.8.8
@@ -440,10 +440,10 @@ importers:
version: 1.17.0
storybook:
specifier: 10.3.3
- version: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ version: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
storybook-addon-remix-react-router:
specifier: 6.0.0
- version: 6.0.0(react-dom@19.2.5(react@19.2.5))(react-router@7.12.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))
+ version: 6.0.0(react-dom@19.2.6(react@19.2.6))(react-router@7.12.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
tailwindcss:
specifier: 3.4.18
version: 3.4.18(yaml@2.8.3)
@@ -2770,8 +2770,8 @@ packages:
'@types/react-window@1.8.8':
resolution: {integrity: sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==, tarball: https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz}
- '@types/react@19.2.14':
- resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==, tarball: https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz}
+ '@types/react@19.2.15':
+ resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==, tarball: https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz}
'@types/reactcss@1.2.13':
resolution: {integrity: sha512-gi3S+aUi6kpkF5vdhUsnkwbiSEIU/BEJyD7kBy2SudWBUuKmJk8AQKE0OVcQQeEy40Azh0lV6uynxlikYIJuwg==, tarball: https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.13.tgz}
@@ -5189,10 +5189,10 @@ packages:
resolution: {integrity: sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA==, tarball: https://registry.npmjs.org/react-docgen/-/react-docgen-8.0.2.tgz}
engines: {node: ^20.9.0 || >=22}
- react-dom@19.2.5:
- resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==, tarball: https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz}
+ react-dom@19.2.6:
+ resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==, tarball: https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz}
peerDependencies:
- react: ^19.2.5
+ react: ^19.2.6
react-error-boundary@6.1.1:
resolution: {integrity: sha512-BrYwPOdXi5mqkk5lw+Uvt0ThHx32rCt3BkukS4X23A2AIWDPSGX6iaWTc0y9TU/mHDA/6qOSGel+B2ERkOvD1w==, tarball: https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-6.1.1.tgz}
@@ -5314,8 +5314,8 @@ packages:
react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- react@19.2.5:
- resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==, tarball: https://registry.npmjs.org/react/-/react-19.2.5.tgz}
+ react@19.2.6:
+ resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==, tarball: https://registry.npmjs.org/react/-/react-19.2.6.tgz}
engines: {node: '>=0.10.0'}
reactcss@1.2.3:
@@ -6634,13 +6634,13 @@ snapshots:
'@chevrotain/utils@11.1.2': {}
- '@chromatic-com/storybook@5.0.1(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))':
+ '@chromatic-com/storybook@5.0.1(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))':
dependencies:
'@neoconfetti/react': 1.0.0
chromatic: 13.3.4
filesize: 10.1.6
jsonfile: 6.2.0
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
strip-ansi: 7.1.2
transitivePeerDependencies:
- '@chromatic-com/cypress'
@@ -6670,29 +6670,29 @@ snapshots:
'@date-fns/tz@1.4.1': {}
- '@dnd-kit/accessibility@3.1.1(react@19.2.5)':
+ '@dnd-kit/accessibility@3.1.1(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
tslib: 2.8.1
- '@dnd-kit/core@6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@dnd-kit/core@6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@dnd-kit/accessibility': 3.1.1(react@19.2.5)
- '@dnd-kit/utilities': 3.2.2(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@dnd-kit/accessibility': 3.1.1(react@19.2.6)
+ '@dnd-kit/utilities': 3.2.2(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
tslib: 2.8.1
- '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)':
+ '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)':
dependencies:
- '@dnd-kit/core': 6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@dnd-kit/utilities': 3.2.2(react@19.2.5)
- react: 19.2.5
+ '@dnd-kit/core': 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@dnd-kit/utilities': 3.2.2(react@19.2.6)
+ react: 19.2.6
tslib: 2.8.1
- '@dnd-kit/utilities@3.2.2(react@19.2.5)':
+ '@dnd-kit/utilities@3.2.2(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
tslib: 2.8.1
'@emnapi/core@1.10.0':
@@ -6713,10 +6713,10 @@ snapshots:
'@emoji-mart/data@1.2.1': {}
- '@emoji-mart/react@1.1.1(emoji-mart@5.6.0)(react@19.2.5)':
+ '@emoji-mart/react@1.1.1(emoji-mart@5.6.0)(react@19.2.6)':
dependencies:
emoji-mart: 5.6.0
- react: 19.2.5
+ react: 19.2.6
'@emotion/babel-plugin@11.13.5':
dependencies:
@@ -6760,19 +6760,19 @@ snapshots:
'@emotion/memoize@0.9.0': {}
- '@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5)':
+ '@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6)':
dependencies:
'@babel/runtime': 7.26.10
'@emotion/babel-plugin': 11.13.5
'@emotion/cache': 11.14.0
'@emotion/serialize': 1.3.3
- '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.5)
+ '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.6)
'@emotion/utils': 1.4.2
'@emotion/weak-memoize': 0.4.0
hoist-non-react-statics: 3.3.2
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
transitivePeerDependencies:
- supports-color
@@ -6786,26 +6786,26 @@ snapshots:
'@emotion/sheet@1.4.0': {}
- '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)':
+ '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)':
dependencies:
'@babel/runtime': 7.26.10
'@emotion/babel-plugin': 11.13.5
'@emotion/is-prop-valid': 1.4.0
- '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.5)
+ '@emotion/react': 11.14.0(@types/react@19.2.15)(react@19.2.6)
'@emotion/serialize': 1.3.3
- '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.5)
+ '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.6)
'@emotion/utils': 1.4.2
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
transitivePeerDependencies:
- supports-color
'@emotion/unitless@0.10.0': {}
- '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.5)':
+ '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
'@emotion/utils@1.4.2': {}
@@ -6898,18 +6898,18 @@ snapshots:
'@floating-ui/core': 1.7.4
'@floating-ui/utils': 0.2.10
- '@floating-ui/react-dom@2.1.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@floating-ui/react-dom@2.1.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@floating-ui/dom': 1.7.5
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
- '@floating-ui/react@0.27.18(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@floating-ui/react@0.27.18(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@floating-ui/react-dom': 2.1.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ '@floating-ui/react-dom': 2.1.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@floating-ui/utils': 0.2.10
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
tabbable: 6.4.0
'@floating-ui/utils@0.2.10': {}
@@ -6934,9 +6934,9 @@ snapshots:
'@iconify/types': 2.0.0
mlly: 1.8.2
- '@icons/material@0.2.4(react@19.2.5)':
+ '@icons/material@0.2.4(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
'@inquirer/confirm@3.2.0':
dependencies:
@@ -7025,7 +7025,7 @@ snapshots:
'@lexical/extension': 0.44.0
lexical: 0.44.0
- '@lexical/devtools-core@0.44.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@lexical/devtools-core@0.44.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@lexical/html': 0.44.0
'@lexical/link': 0.44.0
@@ -7033,8 +7033,8 @@ snapshots:
'@lexical/table': 0.44.0
'@lexical/utils': 0.44.0
lexical: 0.44.0
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
'@lexical/dragon@0.44.0':
dependencies:
@@ -7105,10 +7105,10 @@ snapshots:
'@lexical/utils': 0.44.0
lexical: 0.44.0
- '@lexical/react@0.44.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(yjs@13.6.29)':
+ '@lexical/react@0.44.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.29)':
dependencies:
- '@floating-ui/react': 0.27.18(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@lexical/devtools-core': 0.44.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ '@floating-ui/react': 0.27.18(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@lexical/devtools-core': 0.44.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@lexical/dragon': 0.44.0
'@lexical/extension': 0.44.0
'@lexical/hashtag': 0.44.0
@@ -7125,9 +7125,9 @@ snapshots:
'@lexical/utils': 0.44.0
'@lexical/yjs': 0.44.0(yjs@13.6.29)
lexical: 0.44.0
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
- react-error-boundary: 6.1.1(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
+ react-error-boundary: 6.1.1(react@19.2.6)
optionalDependencies:
yjs: 13.6.29
@@ -7165,11 +7165,11 @@ snapshots:
lexical: 0.44.0
yjs: 13.6.29
- '@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.5)':
+ '@mdx-js/react@3.1.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
'@types/mdx': 2.0.13
- '@types/react': 19.2.14
- react: 19.2.5
+ '@types/react': 19.2.15
+ react: 19.2.6
'@mermaid-js/parser@1.0.1':
dependencies:
@@ -7189,12 +7189,12 @@ snapshots:
dependencies:
state-local: 1.0.7
- '@monaco-editor/react@4.7.0(monaco-editor@0.55.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@monaco-editor/react@4.7.0(monaco-editor@0.55.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@monaco-editor/loader': 1.5.0
monaco-editor: 0.55.1
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
'@mswjs/interceptors@0.35.9':
dependencies:
@@ -7207,79 +7207,79 @@ snapshots:
'@mui/core-downloads-tracker@5.18.0': {}
- '@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/core-downloads-tracker': 5.18.0
- '@mui/system': 5.18.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
- '@mui/types': 7.2.24(@types/react@19.2.14)
- '@mui/utils': 5.17.1(@types/react@19.2.14)(react@19.2.5)
+ '@mui/system': 5.18.0(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)
+ '@mui/types': 7.2.24(@types/react@19.2.15)
+ '@mui/utils': 5.17.1(@types/react@19.2.15)(react@19.2.6)
'@popperjs/core': 2.11.8
- '@types/react-transition-group': 4.4.12(@types/react@19.2.14)
+ '@types/react-transition-group': 4.4.12(@types/react@19.2.15)
clsx: 2.1.1
csstype: 3.1.3
prop-types: 15.8.1
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
react-is: 19.1.1
- react-transition-group: 4.4.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ react-transition-group: 4.4.5(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
optionalDependencies:
- '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.5)
- '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
- '@types/react': 19.2.14
+ '@emotion/react': 11.14.0(@types/react@19.2.15)(react@19.2.6)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)
+ '@types/react': 19.2.15
- '@mui/private-theming@5.17.1(@types/react@19.2.14)(react@19.2.5)':
+ '@mui/private-theming@5.17.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
'@babel/runtime': 7.26.10
- '@mui/utils': 5.17.1(@types/react@19.2.14)(react@19.2.5)
+ '@mui/utils': 5.17.1(@types/react@19.2.15)(react@19.2.6)
prop-types: 15.8.1
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@mui/styled-engine@5.18.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(react@19.2.5)':
+ '@mui/styled-engine@5.18.0(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(react@19.2.6)':
dependencies:
'@babel/runtime': 7.26.10
'@emotion/cache': 11.14.0
'@emotion/serialize': 1.3.3
csstype: 3.2.3
prop-types: 15.8.1
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.5)
- '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
+ '@emotion/react': 11.14.0(@types/react@19.2.15)(react@19.2.6)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)
- '@mui/system@5.18.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)':
+ '@mui/system@5.18.0(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)':
dependencies:
'@babel/runtime': 7.26.10
- '@mui/private-theming': 5.17.1(@types/react@19.2.14)(react@19.2.5)
- '@mui/styled-engine': 5.18.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(react@19.2.5)
- '@mui/types': 7.2.24(@types/react@19.2.14)
- '@mui/utils': 5.17.1(@types/react@19.2.14)(react@19.2.5)
+ '@mui/private-theming': 5.17.1(@types/react@19.2.15)(react@19.2.6)
+ '@mui/styled-engine': 5.18.0(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(react@19.2.6)
+ '@mui/types': 7.2.24(@types/react@19.2.15)
+ '@mui/utils': 5.17.1(@types/react@19.2.15)(react@19.2.6)
clsx: 2.1.1
csstype: 3.1.3
prop-types: 15.8.1
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.5)
- '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
- '@types/react': 19.2.14
+ '@emotion/react': 11.14.0(@types/react@19.2.15)(react@19.2.6)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)
+ '@types/react': 19.2.15
- '@mui/types@7.2.24(@types/react@19.2.14)':
+ '@mui/types@7.2.24(@types/react@19.2.15)':
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@mui/utils@5.17.1(@types/react@19.2.14)(react@19.2.5)':
+ '@mui/utils@5.17.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
'@babel/runtime': 7.26.10
- '@mui/types': 7.2.24(@types/react@19.2.14)
+ '@mui/types': 7.2.24(@types/react@19.2.15)
'@types/prop-types': 15.7.15
clsx: 2.1.1
prop-types: 15.8.1
- react: 19.2.5
+ react: 19.2.6
react-is: 19.1.1
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
'@napi-rs/wasm-runtime@1.0.7':
dependencies:
@@ -7387,15 +7387,15 @@ snapshots:
'@oxc-resolver/binding-win32-x64-msvc@11.14.0':
optional: true
- '@pierre/diffs@1.1.19(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@pierre/diffs@1.1.19(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@pierre/theme': 0.0.28
'@shikijs/transformers': 3.23.0
diff: 8.0.3
hast-util-to-html: 9.0.5
lru_map: 0.4.1
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
shiki: 3.23.0
'@pierre/theme@0.0.28': {}
@@ -7440,746 +7440,746 @@ snapshots:
'@radix-ui/primitive@1.1.3': {}
- '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
-
- '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
- dependencies:
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
+
+ '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
+ dependencies:
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-context@1.1.2(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
aria-hidden: 1.2.6
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
- react-remove-scroll: 2.7.1(@types/react@19.2.14)(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
+ react-remove-scroll: 2.7.1(@types/react@19.2.15)(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-direction@1.1.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-id@1.1.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
aria-hidden: 1.2.6
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
- react-remove-scroll: 2.7.1(@types/react@19.2.14)(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
+ react-remove-scroll: 2.7.1(@types/react@19.2.15)(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/number': 1.1.1
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
aria-hidden: 1.2.6
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
- react-remove-scroll: 2.7.1(@types/react@19.2.14)(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
+ react-remove-scroll: 2.7.1(@types/react@19.2.15)(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
-
- '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
- dependencies:
- '@floating-ui/react-dom': 2.1.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.5)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
+
+ '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.2.6)
'@radix-ui/rect': 1.1.1
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/number': 1.1.1
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/number': 1.1.1
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
aria-hidden: 1.2.6
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
- react-remove-scroll: 2.7.1(@types/react@19.2.14)(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
+ react-remove-scroll: 2.7.1(@types/react@19.2.15)(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/number': 1.1.1
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-slot@1.2.3(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
- '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- react: 19.2.5
- use-sync-external-store: 1.6.0(react@19.2.5)
+ react: 19.2.6
+ use-sync-external-store: 1.6.0(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
'@radix-ui/rect': 1.1.1
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.5)':
+ '@radix-ui/react-use-size@1.1.1(@types/react@19.2.15)(react@19.2.6)':
dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- react: 19.2.5
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
'@radix-ui/rect@1.1.1': {}
@@ -8293,21 +8293,21 @@ snapshots:
'@standard-schema/spec@1.1.0': {}
- '@storybook/addon-a11y@10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))':
+ '@storybook/addon-a11y@10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))':
dependencies:
'@storybook/global': 5.0.0
axe-core: 4.11.1
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
- '@storybook/addon-docs@10.3.3(@types/react@19.2.14)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/addon-docs@10.3.3(@types/react@19.2.15)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.5)
- '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
- '@storybook/icons': 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@storybook/react-dom-shim': 10.3.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ '@mdx-js/react': 3.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@storybook/icons': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@storybook/react-dom-shim': 10.3.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
ts-dedent: 2.2.0
transitivePeerDependencies:
- '@types/react'
@@ -8316,38 +8316,38 @@ snapshots:
- vite
- webpack
- '@storybook/addon-links@10.3.3(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))':
+ '@storybook/addon-links@10.3.3(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))':
dependencies:
'@storybook/global': 5.0.0
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
optionalDependencies:
- react: 19.2.5
+ react: 19.2.6
- '@storybook/addon-mcp@0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@6.0.2)':
+ '@storybook/addon-mcp@0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)':
dependencies:
'@storybook/mcp': 0.7.0(typescript@6.0.2)
'@tmcp/adapter-valibot': 0.1.5(tmcp@1.19.3(typescript@6.0.2))(valibot@1.2.0(typescript@6.0.2))
'@tmcp/transport-http': 0.8.5(tmcp@1.19.3(typescript@6.0.2))
picoquery: 2.5.0
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
tmcp: 1.19.3(typescript@6.0.2)
valibot: 1.2.0(typescript@6.0.2)
optionalDependencies:
- '@storybook/addon-vitest': 10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.5)
+ '@storybook/addon-vitest': 10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
transitivePeerDependencies:
- '@tmcp/auth'
- typescript
- '@storybook/addon-themes@10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))':
+ '@storybook/addon-themes@10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))':
dependencies:
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
ts-dedent: 2.2.0
- '@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.5)':
+ '@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)':
dependencies:
'@storybook/global': 5.0.0
- '@storybook/icons': 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ '@storybook/icons': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
optionalDependencies:
'@vitest/browser': 4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
'@vitest/browser-playwright': 4.1.1(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
@@ -8357,10 +8357,10 @@ snapshots:
- react
- react-dom
- '@storybook/builder-vite@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/builder-vite@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
ts-dedent: 2.2.0
vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
transitivePeerDependencies:
@@ -8368,9 +8368,9 @@ snapshots:
- rollup
- webpack
- '@storybook/csf-plugin@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/csf-plugin@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
unplugin: 2.3.11
optionalDependencies:
esbuild: 0.25.12
@@ -8378,10 +8378,10 @@ snapshots:
'@storybook/global@5.0.0': {}
- '@storybook/icons@2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@storybook/icons@2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
'@storybook/mcp@0.7.0(typescript@6.0.2)':
dependencies:
@@ -8393,25 +8393,25 @@ snapshots:
- '@tmcp/auth'
- typescript
- '@storybook/react-dom-shim@10.3.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))':
+ '@storybook/react-dom-shim@10.3.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))':
dependencies:
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
- '@storybook/react-vite@10.3.3(esbuild@0.25.12)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/react-vite@10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
'@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@rollup/pluginutils': 5.3.0
- '@storybook/builder-vite': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
- '@storybook/react': 10.3.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@6.0.2)
+ '@storybook/builder-vite': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@storybook/react': 10.3.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)
empathic: 2.0.0
magic-string: 0.30.21
- react: 19.2.5
+ react: 19.2.6
react-docgen: 8.0.2
- react-dom: 19.2.5(react@19.2.5)
+ react-dom: 19.2.6(react@19.2.6)
resolve: 1.22.11
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
tsconfig-paths: 4.2.0
vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
transitivePeerDependencies:
@@ -8421,15 +8421,15 @@ snapshots:
- typescript
- webpack
- '@storybook/react@10.3.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@6.0.2)':
+ '@storybook/react@10.3.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)':
dependencies:
'@storybook/global': 5.0.0
- '@storybook/react-dom-shim': 10.3.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))
- react: 19.2.5
+ '@storybook/react-dom-shim': 10.3.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
+ react: 19.2.6
react-docgen: 8.0.2
react-docgen-typescript: 2.4.0(typescript@6.0.2)
- react-dom: 19.2.5(react@19.2.5)
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ react-dom: 19.2.6(react@19.2.6)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
optionalDependencies:
typescript: 6.0.2
transitivePeerDependencies:
@@ -8446,16 +8446,16 @@ snapshots:
'@tanstack/query-devtools@5.76.0': {}
- '@tanstack/react-query-devtools@5.77.0(@tanstack/react-query@5.77.0(react@19.2.5))(react@19.2.5)':
+ '@tanstack/react-query-devtools@5.77.0(@tanstack/react-query@5.77.0(react@19.2.6))(react@19.2.6)':
dependencies:
'@tanstack/query-devtools': 5.76.0
- '@tanstack/react-query': 5.77.0(react@19.2.5)
- react: 19.2.5
+ '@tanstack/react-query': 5.77.0(react@19.2.6)
+ react: 19.2.6
- '@tanstack/react-query@5.77.0(react@19.2.5)':
+ '@tanstack/react-query@5.77.0(react@19.2.6)':
dependencies:
'@tanstack/query-core': 5.77.0
- react: 19.2.5
+ react: 19.2.6
'@testing-library/dom@10.4.0':
dependencies:
@@ -8488,13 +8488,13 @@ snapshots:
picocolors: 1.1.1
redent: 3.0.0
- '@testing-library/react@14.3.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@testing-library/react@14.3.1(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
'@babel/runtime': 7.26.10
'@testing-library/dom': 9.3.3
- '@types/react-dom': 18.3.7(@types/react@19.2.14)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@types/react-dom': 18.3.7(@types/react@19.2.15)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
transitivePeerDependencies:
- '@types/react'
@@ -8734,9 +8734,9 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
- '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.14)':
+ '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.15)':
dependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
hoist-non-react-statics: 3.3.2
'@types/http-errors@2.0.1': {}
@@ -8783,45 +8783,45 @@ snapshots:
'@types/range-parser@1.2.4': {}
- '@types/react-color@3.0.13(@types/react@19.2.14)':
+ '@types/react-color@3.0.13(@types/react@19.2.15)':
dependencies:
- '@types/react': 19.2.14
- '@types/reactcss': 1.2.13(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/reactcss': 1.2.13(@types/react@19.2.15)
- '@types/react-dom@18.3.7(@types/react@19.2.14)':
+ '@types/react-dom@18.3.7(@types/react@19.2.15)':
dependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@types/react-dom@19.2.3(@types/react@19.2.14)':
+ '@types/react-dom@19.2.3(@types/react@19.2.15)':
dependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
'@types/react-syntax-highlighter@15.5.13':
dependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@types/react-transition-group@4.4.12(@types/react@19.2.14)':
+ '@types/react-transition-group@4.4.12(@types/react@19.2.15)':
dependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@types/react-virtualized-auto-sizer@1.0.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
+ '@types/react-virtualized-auto-sizer@1.0.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies:
- react-virtualized-auto-sizer: 1.0.26(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ react-virtualized-auto-sizer: 1.0.26(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
transitivePeerDependencies:
- react
- react-dom
'@types/react-window@1.8.8':
dependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- '@types/react@19.2.14':
+ '@types/react@19.2.15':
dependencies:
csstype: 3.2.3
- '@types/reactcss@1.2.13(@types/react@19.2.14)':
+ '@types/reactcss@1.2.13(@types/react@19.2.15)':
dependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
'@types/resolve@1.20.6': {}
@@ -9316,14 +9316,14 @@ snapshots:
clsx@2.1.1: {}
- cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
transitivePeerDependencies:
- '@types/react'
- '@types/react-dom'
@@ -9998,14 +9998,14 @@ snapshots:
dependencies:
fd-package-json: 2.0.0
- formik@2.4.9(@types/react@19.2.14)(react@19.2.5):
+ formik@2.4.9(@types/react@19.2.15)(react@19.2.6):
dependencies:
- '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.14)
+ '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.15)
deepmerge: 2.2.1
hoist-non-react-statics: 3.3.2
lodash: 4.18.1
lodash-es: 4.18.1
- react: 19.2.5
+ react: 19.2.6
react-fast-compare: 2.0.4
tiny-warning: 1.0.3
tslib: 2.8.1
@@ -10016,15 +10016,15 @@ snapshots:
fraction.js@5.3.4: {}
- framer-motion@12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ framer-motion@12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
motion-dom: 12.38.0
motion-utils: 12.36.0
tslib: 2.8.1
optionalDependencies:
'@emotion/is-prop-valid': 1.4.0
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
fresh@0.5.2: {}
@@ -10663,9 +10663,9 @@ snapshots:
lru_map@0.4.1: {}
- lucide-react@0.555.0(react@19.2.5):
+ lucide-react@0.555.0(react@19.2.6):
dependencies:
- react: 19.2.5
+ react: 19.2.6
luxon@3.3.0: {}
@@ -11116,14 +11116,14 @@ snapshots:
motion-utils@12.36.0: {}
- motion@12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ motion@12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
- framer-motion: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ framer-motion: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
tslib: 2.8.1
optionalDependencies:
'@emotion/is-prop-valid': 1.4.0
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
mrmime@2.0.1: {}
@@ -11506,68 +11506,68 @@ snapshots:
queue-microtask@1.2.3: {}
- radix-ui@1.4.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ radix-ui@1.4.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.5)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.2.6)
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
- '@types/react-dom': 19.2.3(@types/react@19.2.14)
+ '@types/react': 19.2.15
+ '@types/react-dom': 19.2.3(@types/react@19.2.15)
range-parser@1.2.1: {}
@@ -11578,29 +11578,29 @@ snapshots:
iconv-lite: 0.4.24
unpipe: 1.0.0
- react-color@2.19.3(react@19.2.5):
+ react-color@2.19.3(react@19.2.6):
dependencies:
- '@icons/material': 0.2.4(react@19.2.5)
+ '@icons/material': 0.2.4(react@19.2.6)
lodash: 4.18.1
lodash-es: 4.18.1
material-colors: 1.2.6
prop-types: 15.8.1
- react: 19.2.5
- reactcss: 1.2.3(react@19.2.5)
+ react: 19.2.6
+ reactcss: 1.2.3(react@19.2.6)
tinycolor2: 1.6.0
- react-confetti@6.4.0(react@19.2.5):
+ react-confetti@6.4.0(react@19.2.6):
dependencies:
- react: 19.2.5
+ react: 19.2.6
tween-functions: 1.2.0
- react-day-picker@9.14.0(react@19.2.5):
+ react-day-picker@9.14.0(react@19.2.6):
dependencies:
'@date-fns/tz': 1.4.1
'@tabby_ai/hijri-converter': 1.0.5
date-fns: 4.1.0
date-fns-jalali: 4.1.0-0
- react: 19.2.5
+ react: 19.2.6
react-docgen-typescript@2.4.0(typescript@6.0.2):
dependencies:
@@ -11621,25 +11621,25 @@ snapshots:
transitivePeerDependencies:
- supports-color
- react-dom@19.2.5(react@19.2.5):
+ react-dom@19.2.6(react@19.2.6):
dependencies:
- react: 19.2.5
+ react: 19.2.6
scheduler: 0.27.0
- react-error-boundary@6.1.1(react@19.2.5):
+ react-error-boundary@6.1.1(react@19.2.6):
dependencies:
- react: 19.2.5
+ react: 19.2.6
react-fast-compare@2.0.4: {}
- react-infinite-scroll-component@7.1.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ react-infinite-scroll-component@7.1.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
- react-inspector@6.0.2(react@19.2.5):
+ react-inspector@6.0.2(react@19.2.6):
dependencies:
- react: 19.2.5
+ react: 19.2.6
react-is@16.13.1: {}
@@ -11649,16 +11649,16 @@ snapshots:
react-is@19.1.1: {}
- react-markdown@9.1.0(@types/react@19.2.14)(react@19.2.5):
+ react-markdown@9.1.0(@types/react@19.2.15)(react@19.2.6):
dependencies:
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
devlop: 1.1.0
hast-util-to-jsx-runtime: 2.3.6
html-url-attributes: 3.0.1
mdast-util-to-hast: 13.2.1
- react: 19.2.5
+ react: 19.2.6
remark-parse: 11.0.0
remark-rehype: 11.1.2
unified: 11.0.5
@@ -11667,100 +11667,100 @@ snapshots:
transitivePeerDependencies:
- supports-color
- react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.5):
+ react-remove-scroll-bar@2.3.8(@types/react@19.2.15)(react@19.2.6):
dependencies:
- react: 19.2.5
- react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.5)
+ react: 19.2.6
+ react-style-singleton: 2.2.3(@types/react@19.2.15)(react@19.2.6)
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- react-remove-scroll@2.7.1(@types/react@19.2.14)(react@19.2.5):
+ react-remove-scroll@2.7.1(@types/react@19.2.15)(react@19.2.6):
dependencies:
- react: 19.2.5
- react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.5)
- react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.5)
+ react: 19.2.6
+ react-remove-scroll-bar: 2.3.8(@types/react@19.2.15)(react@19.2.6)
+ react-style-singleton: 2.2.3(@types/react@19.2.15)(react@19.2.6)
tslib: 2.8.1
- use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.5)
- use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.5)
+ use-callback-ref: 1.3.3(@types/react@19.2.15)(react@19.2.6)
+ use-sidecar: 1.1.3(@types/react@19.2.15)(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- react-resizable-panels@3.0.6(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ react-resizable-panels@3.0.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
- react-router@7.12.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ react-router@7.12.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
cookie: 1.1.1
- react: 19.2.5
+ react: 19.2.6
set-cookie-parser: 2.7.2
optionalDependencies:
- react-dom: 19.2.5(react@19.2.5)
+ react-dom: 19.2.6(react@19.2.6)
- react-smooth@4.0.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ react-smooth@4.0.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
fast-equals: 5.3.2
prop-types: 15.8.1
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
- react-transition-group: 4.4.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
+ react-transition-group: 4.4.5(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
- react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.5):
+ react-style-singleton@2.2.3(@types/react@19.2.15)(react@19.2.6):
dependencies:
get-nonce: 1.0.1
- react: 19.2.5
+ react: 19.2.6
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- react-syntax-highlighter@15.6.6(react@19.2.5):
+ react-syntax-highlighter@15.6.6(react@19.2.6):
dependencies:
'@babel/runtime': 7.26.10
highlight.js: 10.7.3
highlightjs-vue: 1.0.0
lowlight: 1.20.0
prismjs: 1.30.0
- react: 19.2.5
+ react: 19.2.6
refractor: 3.6.0
- react-textarea-autosize@8.5.9(@types/react@19.2.14)(react@19.2.5):
+ react-textarea-autosize@8.5.9(@types/react@19.2.15)(react@19.2.6):
dependencies:
'@babel/runtime': 7.26.10
- react: 19.2.5
- use-composed-ref: 1.4.0(@types/react@19.2.14)(react@19.2.5)
- use-latest: 1.3.0(@types/react@19.2.14)(react@19.2.5)
+ react: 19.2.6
+ use-composed-ref: 1.4.0(@types/react@19.2.15)(react@19.2.6)
+ use-latest: 1.3.0(@types/react@19.2.15)(react@19.2.6)
transitivePeerDependencies:
- '@types/react'
- react-transition-group@4.4.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ react-transition-group@4.4.5(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
'@babel/runtime': 7.26.10
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
- react-virtualized-auto-sizer@1.0.26(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ react-virtualized-auto-sizer@1.0.26(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
- react-window@1.8.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ react-window@1.8.11(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
'@babel/runtime': 7.26.10
memoize-one: 5.2.1
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
- react@19.2.5: {}
+ react@19.2.6: {}
- reactcss@1.2.3(react@19.2.5):
+ reactcss@1.2.3(react@19.2.6):
dependencies:
lodash: 4.18.1
- react: 19.2.5
+ react: 19.2.6
read-cache@1.0.0:
dependencies:
@@ -11800,15 +11800,15 @@ snapshots:
dependencies:
decimal.js-light: 2.5.1
- recharts@2.15.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ recharts@2.15.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
clsx: 2.1.1
eventemitter3: 4.0.7
lodash: 4.18.1
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
react-is: 18.3.1
- react-smooth: 4.0.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ react-smooth: 4.0.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
recharts-scale: 0.4.5
tiny-invariant: 1.3.3
victory-vendor: 36.9.2
@@ -12096,10 +12096,10 @@ snapshots:
smol-toml@1.5.2: {}
- sonner@2.0.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ sonner@2.0.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
source-map-js@1.2.1: {}
@@ -12139,21 +12139,21 @@ snapshots:
dependencies:
internal-slot: 1.0.6
- storybook-addon-remix-react-router@6.0.0(react-dom@19.2.5(react@19.2.5))(react-router@7.12.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)):
+ storybook-addon-remix-react-router@6.0.0(react-dom@19.2.6(react@19.2.6))(react-router@7.12.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)):
dependencies:
'@mjackson/form-data-parser': 0.4.0
compare-versions: 6.1.0
- react-inspector: 6.0.2(react@19.2.5)
- react-router: 7.12.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ react-inspector: 6.0.2(react@19.2.6)
+ react-router: 7.12.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
optionalDependencies:
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
- storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
'@storybook/global': 5.0.0
- '@storybook/icons': 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ '@storybook/icons': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@testing-library/jest-dom': 6.9.1
'@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0)
'@vitest/expect': 3.2.4
@@ -12162,7 +12162,7 @@ snapshots:
open: 10.2.0
recast: 0.23.11
semver: 7.7.3
- use-sync-external-store: 1.6.0(react@19.2.5)
+ use-sync-external-store: 1.6.0(react@19.2.6)
ws: 8.20.0
optionalDependencies:
prettier: 3.4.1
@@ -12173,15 +12173,15 @@ snapshots:
- react-dom
- utf-8-validate
- streamdown@2.5.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
+ streamdown@2.5.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
clsx: 2.1.1
hast-util-to-jsx-runtime: 2.3.6
html-url-attributes: 3.0.1
marked: 17.0.5
mermaid: 11.13.0
- react: 19.2.5
- react-dom: 19.2.5(react@19.2.5)
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
rehype-harden: 1.1.8
rehype-raw: 7.0.0
rehype-sanitize: 6.0.0
@@ -12535,43 +12535,43 @@ snapshots:
querystringify: 2.2.0
requires-port: 1.0.0
- use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.5):
+ use-callback-ref@1.3.3(@types/react@19.2.15)(react@19.2.6):
dependencies:
- react: 19.2.5
+ react: 19.2.6
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- use-composed-ref@1.4.0(@types/react@19.2.14)(react@19.2.5):
+ use-composed-ref@1.4.0(@types/react@19.2.15)(react@19.2.6):
dependencies:
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- use-isomorphic-layout-effect@1.2.1(@types/react@19.2.14)(react@19.2.5):
+ use-isomorphic-layout-effect@1.2.1(@types/react@19.2.15)(react@19.2.6):
dependencies:
- react: 19.2.5
+ react: 19.2.6
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- use-latest@1.3.0(@types/react@19.2.14)(react@19.2.5):
+ use-latest@1.3.0(@types/react@19.2.15)(react@19.2.6):
dependencies:
- react: 19.2.5
- use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.14)(react@19.2.5)
+ react: 19.2.6
+ use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.15)(react@19.2.6)
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.5):
+ use-sidecar@1.1.3(@types/react@19.2.15)(react@19.2.6):
dependencies:
detect-node-es: 1.1.0
- react: 19.2.5
+ react: 19.2.6
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.14
+ '@types/react': 19.2.15
- use-sync-external-store@1.6.0(react@19.2.5):
+ use-sync-external-store@1.6.0(react@19.2.6):
dependencies:
- react: 19.2.5
+ react: 19.2.6
util-deprecate@1.0.2: {}
From 91aee5010de36884e76d989b40aa81a46dd08a0a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:19:57 +0000
Subject: [PATCH 008/112] chore: bump @fontsource-variable/geist from 5.2.8 to
5.2.9 in /site (#25953)
Bumps
[@fontsource-variable/geist](https://github.com/fontsource/font-files/tree/HEAD/fonts/variable/geist)
from 5.2.8 to 5.2.9.
Commits
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 10 +++++-----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/site/package.json b/site/package.json
index c14a76a6ab4c1..89143ea494be0 100644
--- a/site/package.json
+++ b/site/package.json
@@ -48,7 +48,7 @@
"@emotion/css": "11.13.5",
"@emotion/react": "11.14.0",
"@emotion/styled": "11.14.1",
- "@fontsource-variable/geist": "5.2.8",
+ "@fontsource-variable/geist": "5.2.9",
"@fontsource-variable/geist-mono": "5.2.7",
"@fontsource/fira-code": "5.2.7",
"@fontsource/ibm-plex-mono": "5.2.7",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index fb5c914ab9b2a..181f48ce047d4 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -60,8 +60,8 @@ importers:
specifier: 11.14.1
version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)
'@fontsource-variable/geist':
- specifier: 5.2.8
- version: 5.2.8
+ specifier: 5.2.9
+ version: 5.2.9
'@fontsource-variable/geist-mono':
specifier: 5.2.7
version: 5.2.7
@@ -1010,8 +1010,8 @@ packages:
'@fontsource-variable/geist-mono@5.2.7':
resolution: {integrity: sha512-ZKlZ5sjtalb2TwXKs400mAGDlt/+2ENLNySPx0wTz3bP3mWARCsUW+rpxzZc7e05d2qGch70pItt3K4qttbIYA==, tarball: https://registry.npmjs.org/@fontsource-variable/geist-mono/-/geist-mono-5.2.7.tgz}
- '@fontsource-variable/geist@5.2.8':
- resolution: {integrity: sha512-cJ6m9e+8MQ5dCYJsLylfZrgBh6KkG4bOLckB35Tr9J/EqdkEM6QllH5PxqP1dhTvFup+HtMRPuz9xOjxXJggxw==, tarball: https://registry.npmjs.org/@fontsource-variable/geist/-/geist-5.2.8.tgz}
+ '@fontsource-variable/geist@5.2.9':
+ resolution: {integrity: sha512-TP+QSBG3wxKGPE33CbMy/L0Nu3qvJ6Fy81Yc4LnQ95xH+i+cfEp8fyU8/kfV14YwszxIFPhnoMTbjL71waVpyQ==, tarball: https://registry.npmjs.org/@fontsource-variable/geist/-/geist-5.2.9.tgz}
'@fontsource/fira-code@5.2.7':
resolution: {integrity: sha512-tnB9NNund9TwIym8/7DMJe573nlPEQb+fKUV5GL8TBYXjIhDvL0D7mgmNVNQUPhXp+R7RylQeiBdkA4EbOHPGQ==, tarball: https://registry.npmjs.org/@fontsource/fira-code/-/fira-code-5.2.7.tgz}
@@ -6916,7 +6916,7 @@ snapshots:
'@fontsource-variable/geist-mono@5.2.7': {}
- '@fontsource-variable/geist@5.2.8': {}
+ '@fontsource-variable/geist@5.2.9': {}
'@fontsource/fira-code@5.2.7': {}
From 5320702a8a02fed59eccb9dbfe5c2c3199a588df Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:20:33 +0000
Subject: [PATCH 009/112] chore: bump axios from 1.16.0 to 1.16.1 in /site
(#25954)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bumps [axios](https://github.com/axios/axios) from 1.16.0 to 1.16.1.
Release notes
Sourced from axios's
releases .
v1.16.1 — May 13, 2026
This release ships a defence-in-depth fix for prototype pollution in
formDataToJSON, hardens proxy and CI workflows, restores
Webpack 4 compatibility for the fetch adapter, and includes several
small bug fixes and maintenance improvements.
🔒 Security Fixes
Prototype Pollution Defence-in-Depth: Hardened
formDataToJSON against already-polluted
Object.prototype by walking own properties only, so
attacker-controlled keys inherited from a poisoned prototype cannot
propagate through deserialization. (#7413 )
Proxy Cleartext Leak: Fixed an issue where HTTPS
request data could be transmitted in cleartext to an HTTP proxy under
certain configurations. (#10858 )
CI Cache Removal: Removed all GitHub Actions caches
as a defence-in-depth measure against cache poisoning vectors in the
build pipeline. (#10882 )
🐛 Bug Fixes
Data URI Parsing: Updated the
fromDataURI regex to match RFC 2397 more strictly, fixing
edge cases in data: URL handling. (#10829 )
Unicode Headers: Preserved Unicode header values
when running through request interceptors, so non-ASCII header content
is no longer corrupted before dispatch. (#10850 )
XHR Upload Progress: Guarded against malformed
ProgressEvent payloads emitted by some environments during
XHR upload, preventing crashes when loaded /
total are missing or invalid. (#10868 )
Webpack 4 Fetch Adapter: Fixed an "unexpected
token" error caused by syntax in the fetch adapter that Webpack 4
could not parse, restoring compatibility for legacy bundler users.
(#10864 )
Type Definitions: Made parseReviver
context.source optional in the type definitions to align
with the ES2023 specification. (#10837 )
URL Object Support Reverted: Reverted the change
that allowed passing a URL object as
config.url (originally #10866 )
due to regressions; this support will be reintroduced in a later release
once the underlying issues are addressed. (#10874 )
🔧 Maintenance & Chores
Cycle Detection Refactor: Replaced the array-based
cycle tracker in toJSONObject with a WeakSet,
improving performance and memory behaviour on large nested structures.
(#10832 )
composeSignals Cleanup: Refactored
composeSignals to use a clearer early-return structure,
simplifying the cancellation/abort composition path. (#10844 )
AI Readiness & Repo Docs: Added
AGENTS.md and related contributor-guide updates for both
human and AI agents, plus post-release documentation improvements.
(#10835 ,
#10841 )
Docs Improvements: Clarified the GET request
example, fixed the interceptor eject example to reference
the correct instance, and corrected the Buzzoid sponsor description in
the README. (#10836 ,
#10853 ,
#10856 )
Sponsorship Tooling: Fixed empty sponsor arrays in
the sponsor processing script, added the ability to inject additional
sponsors, updated the sponsorship link, and added a Twicsy advertisement
entry. (#10843 ,
#10859 ,
#10869 )
Dependencies: Bumped @commitlint/cli
from 20.5.0 to 20.5.2. (#10846 )
🌟 New Contributors
We are thrilled to welcome our new contributors. Thank you for
helping improve axios:
Full
Changelog
Changelog
Sourced from axios's
changelog .
v1.16.1 — May 13, 2026
This release ships a defence-in-depth fix for prototype pollution in
formDataToJSON, hardens proxy and CI workflows, restores
Webpack 4 compatibility for the fetch adapter, and includes several
small bug fixes and maintenance improvements.
🔒 Security Fixes
Prototype Pollution Defence-in-Depth: Hardened
formDataToJSON against already-polluted
Object.prototype by walking own properties only, so
attacker-controlled keys inherited from a poisoned prototype cannot
propagate through deserialization. (#7413 )
Proxy Cleartext Leak: Fixed an issue where HTTPS
request data could be transmitted in cleartext to an HTTP proxy under
certain configurations. (#10858 )
CI Cache Removal: Removed all GitHub Actions caches
as a defence-in-depth measure against cache poisoning vectors in the
build pipeline. (#10882 )
🐛 Bug Fixes
Data URI Parsing: Updated the
fromDataURI regex to match RFC 2397 more strictly, fixing
edge cases in data: URL handling. (#10829 )
Unicode Headers: Preserved Unicode header values
when running through request interceptors, so non-ASCII header content
is no longer corrupted before dispatch. (#10850 )
XHR Upload Progress: Guarded against malformed
ProgressEvent payloads emitted by some environments during
XHR upload, preventing crashes when loaded /
total are missing or invalid. (#10868 )
Webpack 4 Fetch Adapter: Fixed an "unexpected
token" error caused by syntax in the fetch adapter that Webpack 4
could not parse, restoring compatibility for legacy bundler users.
(#10864 )
Type Definitions: Made parseReviver
context.source optional in the type definitions to align
with the ES2023 specification. (#10837 )
URL Object Support Reverted: Reverted the change
that allowed passing a URL object as
config.url (originally #10866 )
due to regressions; this support will be reintroduced in a later release
once the underlying issues are addressed. (#10874 )
🔧 Maintenance & Chores
Cycle Detection Refactor: Replaced the array-based
cycle tracker in toJSONObject with a WeakSet,
improving performance and memory behaviour on large nested structures.
(#10832 )
composeSignals Cleanup: Refactored
composeSignals to use a clearer early-return structure,
simplifying the cancellation/abort composition path. (#10844 )
AI Readiness & Repo Docs: Added
AGENTS.md and related contributor-guide updates for both
human and AI agents, plus post-release documentation improvements.
(#10835 ,
#10841 )
Docs Improvements: Clarified the GET request
example, fixed the interceptor eject example to reference
the correct instance, and corrected the Buzzoid sponsor description in
the README. (#10836 ,
#10853 ,
#10856 )
Sponsorship Tooling: Fixed empty sponsor arrays in
the sponsor processing script, added the ability to inject additional
sponsors, updated the sponsorship link, and added a Twicsy advertisement
entry. (#10843 ,
#10859 ,
#10869 )
Dependencies: Bumped @commitlint/cli
from 20.5.0 to 20.5.2. (#10846 )
🌟 New Contributors
We are thrilled to welcome our new contributors. Thank you for
helping improve axios:
Full
Changelog
Commits
1337d6b
chore(release): prepare release 1.16.1 (#10877 )
858a790
fix: remove all caches (#10882 )
34adfd9
revert: "fix: support URL object as config.url input (#10866 )"
(#10874 )
847d89b
fix: support URL object as config.url input (#10866 )
4094886
fix(progress): guard malformed XHR upload events (#10868 )
44f0c5b
chore: change sponsorship link and add Twicsy advertisement (#10869 )
64e1095
chore: update PR and issue template to use h2 (#10865 )
3e6b4e1
fix: error unexpected token in fetch JS compatibility issue with Webpack
4 (#...
c4453ba
fix: add the ability to add additional sponsors to the process sponsors
scrip...
caa00a9
fix: https data in cleartext to proxy (#10858 )
Additional commits viewable in compare
view
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 33 ++++++++++++++++++++++++++++-----
2 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/site/package.json b/site/package.json
index 89143ea494be0..d0f115c41cc25 100644
--- a/site/package.json
+++ b/site/package.json
@@ -69,7 +69,7 @@
"@xterm/addon-webgl": "0.19.0",
"@xterm/xterm": "5.5.0",
"ansi-to-html": "0.7.2",
- "axios": "1.16.0",
+ "axios": "1.16.1",
"chroma-js": "2.6.0",
"class-variance-authority": "0.7.1",
"clsx": "2.1.1",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index 181f48ce047d4..40a9596d9e4be 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -123,8 +123,8 @@ importers:
specifier: 0.7.2
version: 0.7.2
axios:
- specifier: 1.16.0
- version: 1.16.0
+ specifier: 1.16.1
+ version: 1.16.1
chroma-js:
specifier: 2.6.0
version: 2.6.0
@@ -2943,6 +2943,10 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ agent-base@6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, tarball: https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz}
+ engines: {node: '>= 6.0.0'}
+
agent-base@7.1.4:
resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==, tarball: https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz}
engines: {node: '>= 14'}
@@ -3038,8 +3042,8 @@ packages:
resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==, tarball: https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz}
engines: {node: '>=4'}
- axios@1.16.0:
- resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==, tarball: https://registry.npmjs.org/axios/-/axios-1.16.0.tgz}
+ axios@1.16.1:
+ resolution: {integrity: sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==, tarball: https://registry.npmjs.org/axios/-/axios-1.16.1.tgz}
babel-plugin-macros@3.1.0:
resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==, tarball: https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz}
@@ -4090,6 +4094,10 @@ packages:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, tarball: https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz}
engines: {node: '>= 14'}
+ https-proxy-agent@5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, tarball: https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz}
+ engines: {node: '>= 6'}
+
https-proxy-agent@7.0.6:
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==, tarball: https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz}
engines: {node: '>= 14'}
@@ -9013,6 +9021,12 @@ snapshots:
acorn@8.16.0: {}
+ agent-base@6.0.2:
+ dependencies:
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
agent-base@7.1.4: {}
ansi-escapes@4.3.2:
@@ -9096,13 +9110,15 @@ snapshots:
axe-core@4.11.1: {}
- axios@1.16.0:
+ axios@1.16.1:
dependencies:
follow-redirects: 1.16.0
form-data: 4.0.4
+ https-proxy-agent: 5.0.1
proxy-from-env: 2.1.0
transitivePeerDependencies:
- debug
+ - supports-color
babel-plugin-macros@3.1.0:
dependencies:
@@ -10257,6 +10273,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ https-proxy-agent@5.0.1:
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
https-proxy-agent@7.0.6:
dependencies:
agent-base: 7.1.4
From cc533846db0d14158468d05af27f6b83f817e71d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:20:55 +0000
Subject: [PATCH 010/112] chore: bump @babel/core from 7.29.0 to 7.29.7 in
/site (#25956)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bumps
[@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core)
from 7.29.0 to 7.29.7.
Release notes
Sourced from @babel/core's
releases .
v7.29.7 (2026-05-25)
Re-release all packages with npm provenance attestations
v7.29.6 (2026-05-25)
:bug: Bug Fix
babel-generator
babel-core
babel-core, babel-generator
Committers: 3
v7.29.5 (2026-05-05)
:house: Internal
babel-preset-env
Update @babel/* dependencies
v7.29.4 (2026-05-05)
:bug: Bug Fix
babel-plugin-transform-modules-systemjs
#17974
[7.x backport]fix(systemjs): improve module string name support (@JLHwung )
Committers: 1
v7.29.3 (2026-04-30)
:eyeglasses: Spec Compliance
:bug: Bug Fix
babel-helper-create-class-features-plugin,
babel-plugin-proposal-decorators
#17931
fix(decorators): replace super within all removed static elements (@JLHwung )
babel-register
babel-compat-data,
babel-plugin-bugfix-safari-rest-destructuring-rhs-array,
babel-preset-env
#17788 Add
bugfix plugin for Safari array rest destructuring bug (@JLHwung )
:nail_care: Polish
... (truncated)
Commits
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 245 +++++++++++++++++++-------------------------
2 files changed, 106 insertions(+), 141 deletions(-)
diff --git a/site/package.json b/site/package.json
index d0f115c41cc25..86bfbf708a935 100644
--- a/site/package.json
+++ b/site/package.json
@@ -122,7 +122,7 @@
"yup": "1.7.1"
},
"devDependencies": {
- "@babel/core": "7.29.0",
+ "@babel/core": "7.29.7",
"@babel/plugin-syntax-typescript": "7.28.6",
"@biomejs/biome": "2.4.10",
"@chromatic-com/storybook": "5.0.1",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index 40a9596d9e4be..e6544806d7888 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -277,11 +277,11 @@ importers:
version: 1.7.1
devDependencies:
'@babel/core':
- specifier: 7.29.0
- version: 7.29.0
+ specifier: 7.29.7
+ version: 7.29.7
'@babel/plugin-syntax-typescript':
specifier: 7.28.6
- version: 7.28.6(@babel/core@7.29.0)
+ version: 7.28.6(@babel/core@7.29.7)
'@biomejs/biome':
specifier: 2.4.10
version: 2.4.10
@@ -296,7 +296,7 @@ importers:
version: 1.50.1
'@rolldown/plugin-babel':
specifier: 0.2.3
- version: 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/addon-a11y':
specifier: 10.3.3
version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
@@ -386,7 +386,7 @@ importers:
version: 9.0.2
'@vitejs/plugin-react':
specifier: 6.0.1
- version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@vitest/browser-playwright':
specifier: 4.1.1
version: 4.1.1(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
@@ -499,40 +499,36 @@ packages:
resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==, tarball: https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz}
engines: {node: '>=6.9.0'}
- '@babel/compat-data@7.29.0':
- resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==, tarball: https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz}
+ '@babel/compat-data@7.29.7':
+ resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==, tarball: https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz}
engines: {node: '>=6.9.0'}
- '@babel/core@7.29.0':
- resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==, tarball: https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz}
+ '@babel/core@7.29.7':
+ resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==, tarball: https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz}
engines: {node: '>=6.9.0'}
- '@babel/generator@7.28.5':
- resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==, tarball: https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz}
+ '@babel/generator@7.29.7':
+ resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==, tarball: https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz}
engines: {node: '>=6.9.0'}
- '@babel/generator@7.29.1':
- resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==, tarball: https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz}
+ '@babel/helper-compilation-targets@7.29.7':
+ resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==, tarball: https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz}
engines: {node: '>=6.9.0'}
- '@babel/helper-compilation-targets@7.28.6':
- resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==, tarball: https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-globals@7.28.0':
- resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, tarball: https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz}
+ '@babel/helper-globals@7.29.7':
+ resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==, tarball: https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz}
engines: {node: '>=6.9.0'}
'@babel/helper-module-imports@7.27.1':
resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==, tarball: https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz}
engines: {node: '>=6.9.0'}
- '@babel/helper-module-imports@7.28.6':
- resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==, tarball: https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz}
+ '@babel/helper-module-imports@7.29.7':
+ resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==, tarball: https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz}
engines: {node: '>=6.9.0'}
- '@babel/helper-module-transforms@7.28.6':
- resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==, tarball: https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz}
+ '@babel/helper-module-transforms@7.29.7':
+ resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==, tarball: https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
@@ -545,6 +541,10 @@ packages:
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, tarball: https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz}
engines: {node: '>=6.9.0'}
+ '@babel/helper-string-parser@7.29.7':
+ resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==, tarball: https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-identifier@7.28.5':
resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==, tarball: https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz}
engines: {node: '>=6.9.0'}
@@ -553,21 +553,16 @@ packages:
resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==, tarball: https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-option@7.27.1':
- resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, tarball: https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz}
+ '@babel/helper-validator-option@7.29.7':
+ resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==, tarball: https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz}
engines: {node: '>=6.9.0'}
'@babel/helpers@7.26.10':
resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==, tarball: https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz}
engines: {node: '>=6.9.0'}
- '@babel/parser@7.28.5':
- resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==, tarball: https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
- '@babel/parser@7.29.2':
- resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==, tarball: https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz}
+ '@babel/parser@7.29.7':
+ resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==, tarball: https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz}
engines: {node: '>=6.0.0'}
hasBin: true
@@ -581,28 +576,20 @@ packages:
resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==, tarball: https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz}
engines: {node: '>=6.9.0'}
- '@babel/template@7.27.2':
- resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==, tarball: https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz}
+ '@babel/template@7.29.7':
+ resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==, tarball: https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz}
engines: {node: '>=6.9.0'}
- '@babel/template@7.28.6':
- resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==, tarball: https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz}
- engines: {node: '>=6.9.0'}
-
- '@babel/traverse@7.28.5':
- resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==, tarball: https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz}
- engines: {node: '>=6.9.0'}
-
- '@babel/traverse@7.29.0':
- resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==, tarball: https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz}
+ '@babel/traverse@7.29.7':
+ resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==, tarball: https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz}
engines: {node: '>=6.9.0'}
'@babel/types@7.28.5':
resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==, tarball: https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz}
engines: {node: '>=6.9.0'}
- '@babel/types@7.29.0':
- resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==, tarball: https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz}
+ '@babel/types@7.29.7':
+ resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==, tarball: https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz}
engines: {node: '>=6.9.0'}
'@biomejs/biome@2.4.10':
@@ -4524,6 +4511,10 @@ packages:
resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz}
engines: {node: 20 || >=22}
+ lru-cache@11.5.1:
+ resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz}
+ engines: {node: 20 || >=22}
+
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz}
@@ -6400,7 +6391,7 @@ snapshots:
'@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
- lru-cache: 11.2.4
+ lru-cache: 11.5.1
'@asamuzakjp/dom-selector@6.7.5':
dependencies:
@@ -6424,19 +6415,19 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.1.1
- '@babel/compat-data@7.29.0': {}
+ '@babel/compat-data@7.29.7': {}
- '@babel/core@7.29.0':
+ '@babel/core@7.29.7':
dependencies:
- '@babel/code-frame': 7.29.0
- '@babel/generator': 7.29.1
- '@babel/helper-compilation-targets': 7.28.6
- '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0)
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.7
+ '@babel/helper-compilation-targets': 7.29.7
+ '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
'@babel/helpers': 7.26.10
- '@babel/parser': 7.29.2
- '@babel/template': 7.28.6
- '@babel/traverse': 7.29.0
- '@babel/types': 7.29.0
+ '@babel/parser': 7.29.7
+ '@babel/template': 7.29.7
+ '@babel/traverse': 7.29.7
+ '@babel/types': 7.29.7
'@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0
debug: 4.4.3
@@ -6446,52 +6437,44 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@babel/generator@7.28.5':
- dependencies:
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
- jsesc: 3.1.0
-
- '@babel/generator@7.29.1':
+ '@babel/generator@7.29.7':
dependencies:
- '@babel/parser': 7.29.2
- '@babel/types': 7.29.0
+ '@babel/parser': 7.29.7
+ '@babel/types': 7.29.7
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
jsesc: 3.1.0
- '@babel/helper-compilation-targets@7.28.6':
+ '@babel/helper-compilation-targets@7.29.7':
dependencies:
- '@babel/compat-data': 7.29.0
- '@babel/helper-validator-option': 7.27.1
+ '@babel/compat-data': 7.29.7
+ '@babel/helper-validator-option': 7.29.7
browserslist: 4.28.2
lru-cache: 5.1.1
semver: 7.7.3
- '@babel/helper-globals@7.28.0': {}
+ '@babel/helper-globals@7.29.7': {}
'@babel/helper-module-imports@7.27.1':
dependencies:
- '@babel/traverse': 7.28.5
- '@babel/types': 7.28.5
+ '@babel/traverse': 7.29.7
+ '@babel/types': 7.29.7
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-imports@7.28.6':
+ '@babel/helper-module-imports@7.29.7':
dependencies:
- '@babel/traverse': 7.29.0
- '@babel/types': 7.29.0
+ '@babel/traverse': 7.29.7
+ '@babel/types': 7.29.7
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)':
+ '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)':
dependencies:
- '@babel/core': 7.29.0
- '@babel/helper-module-imports': 7.28.6
- '@babel/helper-validator-identifier': 7.28.5
- '@babel/traverse': 7.29.0
+ '@babel/core': 7.29.7
+ '@babel/helper-module-imports': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+ '@babel/traverse': 7.29.7
transitivePeerDependencies:
- supports-color
@@ -6499,66 +6482,46 @@ snapshots:
'@babel/helper-string-parser@7.27.1': {}
+ '@babel/helper-string-parser@7.29.7': {}
+
'@babel/helper-validator-identifier@7.28.5': {}
'@babel/helper-validator-identifier@7.29.7': {}
- '@babel/helper-validator-option@7.27.1': {}
+ '@babel/helper-validator-option@7.29.7': {}
'@babel/helpers@7.26.10':
dependencies:
- '@babel/template': 7.28.6
- '@babel/types': 7.29.0
-
- '@babel/parser@7.28.5':
- dependencies:
- '@babel/types': 7.28.5
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.7
- '@babel/parser@7.29.2':
+ '@babel/parser@7.29.7':
dependencies:
- '@babel/types': 7.29.0
+ '@babel/types': 7.29.7
- '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)':
+ '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.7)':
dependencies:
- '@babel/core': 7.29.0
+ '@babel/core': 7.29.7
'@babel/helper-plugin-utils': 7.28.6
'@babel/runtime@7.26.10':
dependencies:
regenerator-runtime: 0.14.1
- '@babel/template@7.27.2':
- dependencies:
- '@babel/code-frame': 7.29.0
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
-
- '@babel/template@7.28.6':
- dependencies:
- '@babel/code-frame': 7.29.0
- '@babel/parser': 7.29.2
- '@babel/types': 7.29.0
-
- '@babel/traverse@7.28.5':
+ '@babel/template@7.29.7':
dependencies:
- '@babel/code-frame': 7.29.0
- '@babel/generator': 7.28.5
- '@babel/helper-globals': 7.28.0
- '@babel/parser': 7.28.5
- '@babel/template': 7.27.2
- '@babel/types': 7.28.5
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
+ '@babel/code-frame': 7.29.7
+ '@babel/parser': 7.29.7
+ '@babel/types': 7.29.7
- '@babel/traverse@7.29.0':
+ '@babel/traverse@7.29.7':
dependencies:
- '@babel/code-frame': 7.29.0
- '@babel/generator': 7.29.1
- '@babel/helper-globals': 7.28.0
- '@babel/parser': 7.29.2
- '@babel/template': 7.28.6
- '@babel/types': 7.29.0
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.7
+ '@babel/helper-globals': 7.29.7
+ '@babel/parser': 7.29.7
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.7
debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -6568,10 +6531,10 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
- '@babel/types@7.29.0':
+ '@babel/types@7.29.7':
dependencies:
- '@babel/helper-string-parser': 7.27.1
- '@babel/helper-validator-identifier': 7.28.5
+ '@babel/helper-string-parser': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
'@biomejs/biome@2.4.10':
optionalDependencies:
@@ -8240,9 +8203,9 @@ snapshots:
'@rolldown/binding-win32-x64-msvc@1.0.0-rc.17':
optional: true
- '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- '@babel/core': 7.29.0
+ '@babel/core': 7.29.7
picomatch: 4.0.4
rolldown: 1.0.0-rc.17
optionalDependencies:
@@ -8478,7 +8441,7 @@ snapshots:
'@testing-library/dom@9.3.3':
dependencies:
- '@babel/code-frame': 7.29.0
+ '@babel/code-frame': 7.29.7
'@babel/runtime': 7.26.10
'@types/aria-query': 5.0.3
aria-query: 5.1.3
@@ -8538,24 +8501,24 @@ snapshots:
'@types/babel__core@7.20.5':
dependencies:
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
+ '@babel/parser': 7.29.7
+ '@babel/types': 7.29.7
'@types/babel__generator': 7.27.0
'@types/babel__template': 7.4.4
'@types/babel__traverse': 7.28.0
'@types/babel__generator@7.27.0':
dependencies:
- '@babel/types': 7.28.5
+ '@babel/types': 7.29.7
'@types/babel__template@7.4.4':
dependencies:
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
+ '@babel/parser': 7.29.7
+ '@babel/types': 7.29.7
'@types/babel__traverse@7.28.0':
dependencies:
- '@babel/types': 7.28.5
+ '@babel/types': 7.29.7
'@types/body-parser@1.19.2':
dependencies:
@@ -8877,12 +8840,12 @@ snapshots:
dependencies:
valibot: 1.2.0(typescript@6.0.2)
- '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
'@rolldown/pluginutils': 1.0.0-rc.7
vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
optionalDependencies:
- '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
babel-plugin-react-compiler: 1.0.0
'@vitest/browser-playwright@4.1.1(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
@@ -10680,6 +10643,8 @@ snapshots:
lru-cache@11.2.4: {}
+ lru-cache@11.5.1: {}
+
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
@@ -11331,7 +11296,7 @@ snapshots:
parse-json@5.2.0:
dependencies:
- '@babel/code-frame': 7.29.0
+ '@babel/code-frame': 7.29.7
error-ex: 1.3.2
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
@@ -11631,9 +11596,9 @@ snapshots:
react-docgen@8.0.2:
dependencies:
- '@babel/core': 7.29.0
- '@babel/traverse': 7.29.0
- '@babel/types': 7.29.0
+ '@babel/core': 7.29.7
+ '@babel/traverse': 7.29.7
+ '@babel/types': 7.29.7
'@types/babel__core': 7.20.5
'@types/babel__traverse': 7.28.0
'@types/doctrine': 0.0.9
From da3ce16d0042dc3e501c07c98eee430eda0afc04 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:22:09 +0000
Subject: [PATCH 011/112] chore: bump protobufjs from 7.5.6 to 7.6.1 in /site
(#25958)
Bumps [protobufjs](https://github.com/protobufjs/protobuf.js) from 7.5.6
to 7.6.1.
Release notes
Sourced from protobufjs's
releases .
protobufjs: v7.6.1
7.6.1
(2026-05-22)
Bug Fixes
protobufjs: v7.6.0
7.6.0
(2026-05-18)
Features
protobufjs: v7.5.9
7.5.9
(2026-05-17)
Bug Fixes
Backport bundler-safe optional module lookups (#2254 )
(0853a62 )
protobufjs: v7.5.8
7.5.8
(2026-05-12)
Bug Fixes
protobufjs: v7.5.7
7.5.7
(2026-05-09)
Bug Fixes
Changelog
Sourced from protobufjs's
changelog .
7.6.1
(2026-05-22)
Bug Fixes
7.6.0
(2026-05-18)
Features
7.5.9
(2026-05-17)
Bug Fixes
Backport bundler-safe optional module lookups (#2254 )
(0853a62 )
7.5.8
(2026-05-12)
Bug Fixes
7.5.7
(2026-05-09)
Bug Fixes
Commits
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 39 +++++++++++++++++++--------------------
2 files changed, 20 insertions(+), 21 deletions(-)
diff --git a/site/package.json b/site/package.json
index 86bfbf708a935..ac5ada7669983 100644
--- a/site/package.json
+++ b/site/package.json
@@ -171,7 +171,7 @@
"knip": "5.71.0",
"msw": "2.4.8",
"postcss": "8.5.10",
- "protobufjs": "7.5.6",
+ "protobufjs": "7.6.1",
"resize-observer-polyfill": "1.5.1",
"rollup-plugin-visualizer": "7.0.1",
"rxjs": "7.8.2",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index e6544806d7888..23d9664bdc70d 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -424,8 +424,8 @@ importers:
specifier: 8.5.10
version: 8.5.10
protobufjs:
- specifier: 7.5.6
- version: 7.5.6
+ specifier: 7.6.1
+ version: 7.6.1
resize-observer-polyfill:
specifier: 1.5.1
version: 1.5.1
@@ -1448,17 +1448,17 @@ packages:
'@protobufjs/codegen@2.0.5':
resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==, tarball: https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz}
- '@protobufjs/eventemitter@1.1.0':
- resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==, tarball: https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz}
+ '@protobufjs/eventemitter@1.1.1':
+ resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==, tarball: https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz}
- '@protobufjs/fetch@1.1.0':
- resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==, tarball: https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz}
+ '@protobufjs/fetch@1.1.1':
+ resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==, tarball: https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz}
'@protobufjs/float@1.0.2':
resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==, tarball: https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz}
- '@protobufjs/inquire@1.1.1':
- resolution: {integrity: sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==, tarball: https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz}
+ '@protobufjs/inquire@1.1.2':
+ resolution: {integrity: sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==, tarball: https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz}
'@protobufjs/path@1.1.2':
resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==, tarball: https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz}
@@ -5112,8 +5112,8 @@ packages:
property-information@7.1.0:
resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==, tarball: https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz}
- protobufjs@7.5.6:
- resolution: {integrity: sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==, tarball: https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz}
+ protobufjs@7.6.1:
+ resolution: {integrity: sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg==, tarball: https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.1.tgz}
engines: {node: '>=12.0.0'}
proxy-addr@2.0.7:
@@ -7390,16 +7390,15 @@ snapshots:
'@protobufjs/codegen@2.0.5': {}
- '@protobufjs/eventemitter@1.1.0': {}
+ '@protobufjs/eventemitter@1.1.1': {}
- '@protobufjs/fetch@1.1.0':
+ '@protobufjs/fetch@1.1.1':
dependencies:
'@protobufjs/aspromise': 1.1.2
- '@protobufjs/inquire': 1.1.1
'@protobufjs/float@1.0.2': {}
- '@protobufjs/inquire@1.1.1': {}
+ '@protobufjs/inquire@1.1.2': {}
'@protobufjs/path@1.1.2': {}
@@ -11460,15 +11459,15 @@ snapshots:
property-information@7.1.0: {}
- protobufjs@7.5.6:
+ protobufjs@7.6.1:
dependencies:
'@protobufjs/aspromise': 1.1.2
'@protobufjs/base64': 1.1.2
'@protobufjs/codegen': 2.0.5
- '@protobufjs/eventemitter': 1.1.0
- '@protobufjs/fetch': 1.1.0
+ '@protobufjs/eventemitter': 1.1.1
+ '@protobufjs/fetch': 1.1.1
'@protobufjs/float': 1.0.2
- '@protobufjs/inquire': 1.1.1
+ '@protobufjs/inquire': 1.1.2
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.1
@@ -12394,12 +12393,12 @@ snapshots:
ts-proto-descriptors@1.16.0:
dependencies:
long: 5.3.2
- protobufjs: 7.5.6
+ protobufjs: 7.6.1
ts-proto@1.181.2:
dependencies:
case-anything: 2.1.13
- protobufjs: 7.5.6
+ protobufjs: 7.6.1
ts-poet: 6.12.0
ts-proto-descriptors: 1.16.0
From 1c81b25bba680a762aed974d214d851843557101 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:24:42 +0000
Subject: [PATCH 012/112] chore: bump tailwind-merge from 2.6.0 to 2.6.1 in
/site (#25965)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bumps [tailwind-merge](https://github.com/dcastil/tailwind-merge) from
2.6.0 to 2.6.1.
Release notes
Sourced from tailwind-merge's
releases .
v2.6.1
Bug Fixes
Fix arbitrary value using color-mix not being detected
as color by @dcastil in #591
This fix was backported from v3.3.1 to make it available for v2
users.
Full Changelog : https://github.com/dcastil/tailwind-merge/compare/v2.6.0...v2.6.1
Thanks to @brandonmcconnell ,
@manavm1990 ,
@langy , @roboflow , @syntaxfm , @getsentry , @codecov , a private
sponsor, @block , @openclaw and more
via @thnxdev for
sponsoring tailwind-merge! ❤️
Commits
0377863
v2.6.1
ce73bc0
Update publish workflow
793325f
add v2.6.1 to changelog
d4ec7cd
.gitignore: Add Claude stuff
10e326a
Cherry-picked: Merge pull request #591
from dcastil/bugfix/590/fix-arbitrary-...
47c87d8
Merge pull request #515
from dcastil/dependabot/npm_and_yarn/vite-5.4.14
35eb83f
Merge pull request #516
from dcastil/dependabot/npm_and_yarn/dot-github/actio...
faf70cc
Bump undici from 5.28.4 to 5.28.5 in
/.github/actions/metrics-report
99f3ca4
Bump vite from 5.4.6 to 5.4.14
fb91ba4
Merge pull request #514
from dcastil/other/480/make-label-name-in-label-workf...
Additional commits viewable in compare
view
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 18 +++++++++---------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/site/package.json b/site/package.json
index ac5ada7669983..88a43f7656741 100644
--- a/site/package.json
+++ b/site/package.json
@@ -111,7 +111,7 @@
"semver": "7.7.3",
"sonner": "2.0.7",
"streamdown": "2.5.0",
- "tailwind-merge": "2.6.0",
+ "tailwind-merge": "2.6.1",
"tailwindcss-animate": "1.0.7",
"tzdata": "1.0.46",
"ua-parser-js": "1.0.41",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index 23d9664bdc70d..aac7e37245e5a 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -249,8 +249,8 @@ importers:
specifier: 2.5.0
version: 2.5.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
tailwind-merge:
- specifier: 2.6.0
- version: 2.6.0
+ specifier: 2.6.1
+ version: 2.6.1
tailwindcss-animate:
specifier: 1.0.7
version: 1.0.7(tailwindcss@3.4.18(yaml@2.8.3))
@@ -5740,11 +5740,11 @@ packages:
tabbable@6.4.0:
resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==, tarball: https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz}
- tailwind-merge@2.6.0:
- resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==, tarball: https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz}
+ tailwind-merge@2.6.1:
+ resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==, tarball: https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz}
- tailwind-merge@3.5.0:
- resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==, tarball: https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz}
+ tailwind-merge@3.6.0:
+ resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==, tarball: https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz}
tailwindcss-animate@1.0.7:
resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==, tarball: https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz}
@@ -12176,7 +12176,7 @@ snapshots:
remark-parse: 11.0.0
remark-rehype: 11.1.2
remend: 1.3.0
- tailwind-merge: 3.5.0
+ tailwind-merge: 3.6.0
unified: 11.0.5
unist-util-visit: 5.1.0
unist-util-visit-parents: 6.0.2
@@ -12270,9 +12270,9 @@ snapshots:
tabbable@6.4.0: {}
- tailwind-merge@2.6.0: {}
+ tailwind-merge@2.6.1: {}
- tailwind-merge@3.5.0: {}
+ tailwind-merge@3.6.0: {}
tailwindcss-animate@1.0.7(tailwindcss@3.4.18(yaml@2.8.3)):
dependencies:
From 5e2889f6828e07eac1a8c64f858c5b340711763d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:29:04 +0000
Subject: [PATCH 013/112] chore: bump @types/lodash from 4.17.21 to 4.17.24 in
/site (#25969)
Bumps
[@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash)
from 4.17.21 to 4.17.24.
Commits
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 10 +++++-----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/site/package.json b/site/package.json
index 88a43f7656741..8779ffad4efa9 100644
--- a/site/package.json
+++ b/site/package.json
@@ -145,7 +145,7 @@
"@types/express": "4.17.17",
"@types/file-saver": "2.0.7",
"@types/humanize-duration": "3.27.4",
- "@types/lodash": "4.17.21",
+ "@types/lodash": "4.17.24",
"@types/node": "20.19.39",
"@types/novnc__novnc": "1.5.0",
"@types/react": "19.2.15",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index aac7e37245e5a..41b30943d8020 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -346,8 +346,8 @@ importers:
specifier: 3.27.4
version: 3.27.4
'@types/lodash':
- specifier: 4.17.21
- version: 4.17.21
+ specifier: 4.17.24
+ version: 4.17.24
'@types/node':
specifier: 20.19.39
version: 20.19.39
@@ -2682,8 +2682,8 @@ packages:
'@types/humanize-duration@3.27.4':
resolution: {integrity: sha512-yaf7kan2Sq0goxpbcwTQ+8E9RP6HutFBPv74T/IA/ojcHKhuKVlk2YFYyHhWZeLvZPzzLE3aatuQB4h0iqyyUA==, tarball: https://registry.npmjs.org/@types/humanize-duration/-/humanize-duration-3.27.4.tgz}
- '@types/lodash@4.17.21':
- resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==, tarball: https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz}
+ '@types/lodash@4.17.24':
+ resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==, tarball: https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz}
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==, tarball: https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz}
@@ -8713,7 +8713,7 @@ snapshots:
'@types/humanize-duration@3.27.4': {}
- '@types/lodash@4.17.21': {}
+ '@types/lodash@4.17.24': {}
'@types/mdast@4.0.4':
dependencies:
From 73249e7c1a7a6fcf92c111192e7b46cf5cab8965 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:29:12 +0000
Subject: [PATCH 014/112] chore: bump react-router from 7.12.0 to 7.15.1 in
/site (#25963)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bumps
[react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router)
from 7.12.0 to 7.15.1.
Release notes
Sourced from react-router's
releases .
v7.15.1
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v7151
v7.15.0
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v7150
v7.14.2
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v7142
v7.14.1
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v7141
v7.14.0
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v7140
v7.13.2
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v7132
v7.13.1
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v7131
v7.13.0
See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v7130
Changelog
Sourced from react-router's
changelog .
v7.15.1
Patch Changes
Update router to operate on fetcher Maps in an immutable manner to
avoid delayed React renders from potentially reading an updated but not
yet committed Map. This could result in brief flickers in some
fetcher-driven optimistic UI scenarios. (#15028 )
Fix serverLoader() returning stale SSR data when a
client navigation aborts pending hydration before the hydration
clientLoader resolves (#15022 )
Fix RouterProvider onError callback not
being called for synchronous initial loader errors in SPA mode (#15039 )
(#14942 )
Memoize useFetchers to return a stable identity and
only change if fetchers changed (#15028 )
Internal refactor to consolidate mutation request detection through
shared utility (#15033 )
Unstable Changes
⚠️ Unstable
features are not recommended for production use
Add a new unstable_useRouterState() hook that
consolidates access to active and pending router states (RFC: #12358 )
(#15017 )
Data/Framework/RSC only — throws when used without a data router
This should allow you to consolidate usages of the following hooks
which will likely be deprecated and removed in a future major
version
useLocation
useSearchParams
useParams
useMatches
useNavigationType
useNavigation
let { active, pending } =
unstable_useRouterState();
// Active is always populated with the current location
active.location; // replaces useLocation()
active.searchParams; // replaces useSearchParams()[0]
active.params; // replaces useParams()
active.matches; // replaces useMatches()
active.type; // replaces useNavigationType()
// Pending is only populated during a navigation
pending.location; // replaces useNavigation().location
pending.searchParams; // equivalent to new
URLSearchParams(useNavigation().search)
pending.params; // Not directly accessible today
pending.matches; // Not directly accessible today
pending.type; // Not directly accessible today
pending.state; // replaces useNavigation().state
pending.formMethod; // replaces useNavigation().formMethod
pending.formAction; // replaces useNavigation().formAction
pending.formEncType; // replaces useNavigation().formEncType
pending.formData; // replaces useNavigation().formData
pending.json; // replaces useNavigation().json
pending.text; // replaces useNavigation().text
v7.15.0
... (truncated)
Commits
587d08f
Release v7.15.1 (#15038 )
89996bd
Fire onError for initial-load errors when RouterProvider mounts late (#15039 )
4322e58
Update docs for useRouterState
fadd6c4
Merge branch 'main' into release
6bf91ce
chore: format
44c3478
fix: prevent fetcher formData flicker and eliminate state.fetchers
mutations ...
7e6725a
Cleanup lint issues (#15030 )
aabd30c
Use shared isMutationMethod check (#15033 )
954a4a6
Fix stale SSR data when hydration is aborted by a same-route navigation
(#15022 )
041cd32
fix(react-router): Internal preloads refactor to preserve types (#14860 )
Additional commits viewable in compare
view
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 16 ++++++++--------
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/site/package.json b/site/package.json
index 8779ffad4efa9..025d5d13318f2 100644
--- a/site/package.json
+++ b/site/package.json
@@ -101,7 +101,7 @@
"react-markdown": "9.1.0",
"react-query": "npm:@tanstack/react-query@5.77.0",
"react-resizable-panels": "3.0.6",
- "react-router": "7.12.0",
+ "react-router": "7.15.1",
"react-syntax-highlighter": "15.6.6",
"react-textarea-autosize": "8.5.9",
"react-virtualized-auto-sizer": "1.0.26",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index 41b30943d8020..3f0579b3058b4 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -219,8 +219,8 @@ importers:
specifier: 3.0.6
version: 3.0.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react-router:
- specifier: 7.12.0
- version: 7.12.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ specifier: 7.15.1
+ version: 7.15.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react-syntax-highlighter:
specifier: 15.6.6
version: 15.6.6(react@19.2.6)
@@ -443,7 +443,7 @@ importers:
version: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
storybook-addon-remix-react-router:
specifier: 6.0.0
- version: 6.0.0(react-dom@19.2.6(react@19.2.6))(react-router@7.12.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
+ version: 6.0.0(react-dom@19.2.6(react@19.2.6))(react-router@7.15.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
tailwindcss:
specifier: 3.4.18
version: 3.4.18(yaml@2.8.3)
@@ -5257,8 +5257,8 @@ packages:
react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
- react-router@7.12.0:
- resolution: {integrity: sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==, tarball: https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz}
+ react-router@7.15.1:
+ resolution: {integrity: sha512-R8rl9HhgikFYoPJymnUtPXWbnDb3oget6lQnfIoupbt61aT9aOhRkDsY2XRhZRyX1Z/8a5sL74fXmFNm3NRK5A==, tarball: https://registry.npmjs.org/react-router/-/react-router-7.15.1.tgz}
engines: {node: '>=20.0.0'}
peerDependencies:
react: '>=18'
@@ -11678,7 +11678,7 @@ snapshots:
react: 19.2.6
react-dom: 19.2.6(react@19.2.6)
- react-router@7.12.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
+ react-router@7.15.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
cookie: 1.1.1
react: 19.2.6
@@ -12126,12 +12126,12 @@ snapshots:
dependencies:
internal-slot: 1.0.6
- storybook-addon-remix-react-router@6.0.0(react-dom@19.2.6(react@19.2.6))(react-router@7.12.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)):
+ storybook-addon-remix-react-router@6.0.0(react-dom@19.2.6(react@19.2.6))(react-router@7.15.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)):
dependencies:
'@mjackson/form-data-parser': 0.4.0
compare-versions: 6.1.0
react-inspector: 6.0.2(react@19.2.6)
- react-router: 7.12.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react-router: 7.15.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
optionalDependencies:
react: 19.2.6
From d370736f55ff69454ea1dafa097c4f436df100f9 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:29:51 +0000
Subject: [PATCH 015/112] chore: bump motion from 12.38.0 to 12.40.0 in /site
(#25960)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bumps [motion](https://github.com/motiondivision/motion) from 12.38.0 to
12.40.0.
Changelog
Sourced from motion's
changelog .
[12.40.0] 2026-05-21
Added
path option to transition.
arc() for motion along an arc.
[12.39.0] 2026-05-18
Added
Support for repeatType and repeatDelay in
animation sequences.
Fixed
Variants: Re-run keyframe animations when switching between variant
labels even when they share identical keyframe arrays.
Drag: Preserve in-flight motion value animations across React 19
reorder unmount/remount so dragSnapToOrigin no longer
leaves the drag transform stranded after a layout swap.
LazyMotion: Share React contexts between the
framer-motion and framer-motion/m (and
therefore motion/react and motion/react-m) CJS
bundles so that <m.div> from the /m
subpath picks up features loaded by <LazyMotion> from
the main entry point.
useScroll: Support hydrating target and
container refs from anywhere in the tree.
Drag: Gesture no longer starts from incorrect start point when
rendered inside <AnimatePresence initial={false}
/>.
Drag: dragConstraints, when set as viewport-relative
ref, no longer break on scroll.§
Updated visualElement hydration order.
useAnimate: Now respects
skipAnimations.
AnimatePresence: Fix object-form initial
values not applied on re-entry after exit completes.
scroll: Fixed callback progress when tracking an
element.
useScroll: Fix hardware acceleration when tracking an
element.
Commits
38ebb94
v12.40.0
b1f766c
Latest
bca5544
Merge pull request #3699
from motiondivision/lochie/arcs-injectable
f1a96cf
arc(): rename amp/rotate, expose MotionPath, fix explicit cw/ccw
b4aaba0
pathRotation: non-destructive orientToPath rotation channel
8604ef3
Make arcs injectable via transition.path = arc()
f90fe29
add orientToPath
9ebe999
fix: test
bc2107e
Revert "no should"
6eeb92d
no should
Additional commits viewable in compare
view
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 36 ++++++++++++++++++------------------
2 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/site/package.json b/site/package.json
index 025d5d13318f2..8375847a635bf 100644
--- a/site/package.json
+++ b/site/package.json
@@ -89,7 +89,7 @@
"lodash": "4.18.1",
"lucide-react": "0.555.0",
"monaco-editor": "0.55.1",
- "motion": "12.38.0",
+ "motion": "12.40.0",
"pretty-bytes": "6.1.1",
"radix-ui": "1.4.3",
"react": "19.2.6",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index 3f0579b3058b4..24832885db053 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -183,8 +183,8 @@ importers:
specifier: 0.55.1
version: 0.55.1
motion:
- specifier: 12.38.0
- version: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ specifier: 12.40.0
+ version: 12.40.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
pretty-bytes:
specifier: 6.1.1
version: 6.1.1
@@ -3901,8 +3901,8 @@ packages:
fraction.js@5.3.4:
resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==, tarball: https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz}
- framer-motion@12.38.0:
- resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==, tarball: https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz}
+ framer-motion@12.40.0:
+ resolution: {integrity: sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==, tarball: https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz}
peerDependencies:
'@emotion/is-prop-valid': '*'
react: ^18.0.0 || ^19.0.0
@@ -4764,14 +4764,14 @@ packages:
moo-color@1.0.3:
resolution: {integrity: sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==, tarball: https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz}
- motion-dom@12.38.0:
- resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==, tarball: https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz}
+ motion-dom@12.40.0:
+ resolution: {integrity: sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==, tarball: https://registry.npmjs.org/motion-dom/-/motion-dom-12.40.0.tgz}
- motion-utils@12.36.0:
- resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==, tarball: https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz}
+ motion-utils@12.39.0:
+ resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==, tarball: https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz}
- motion@12.38.0:
- resolution: {integrity: sha512-uYfXzeHlgThchzwz5Te47dlv5JOUC7OB4rjJ/7XTUgtBZD8CchMN8qEJ4ZVsUmTyYA44zjV0fBwsiktRuFnn+w==, tarball: https://registry.npmjs.org/motion/-/motion-12.38.0.tgz}
+ motion@12.40.0:
+ resolution: {integrity: sha512-yjrHUrBFW6kQvjJwRsoiPSAhC5tRwRqNGJWmiJ4CrGnbKp0V88AdzkhBmDoqIsIPfarOe0Uddd37Xq43/gIocA==, tarball: https://registry.npmjs.org/motion/-/motion-12.40.0.tgz}
peerDependencies:
'@emotion/is-prop-valid': '*'
react: ^18.0.0 || ^19.0.0
@@ -9994,10 +9994,10 @@ snapshots:
fraction.js@5.3.4: {}
- framer-motion@12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
+ framer-motion@12.40.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
- motion-dom: 12.38.0
- motion-utils: 12.36.0
+ motion-dom: 12.40.0
+ motion-utils: 12.39.0
tslib: 2.8.1
optionalDependencies:
'@emotion/is-prop-valid': 1.4.0
@@ -11097,15 +11097,15 @@ snapshots:
dependencies:
color-name: 1.1.4
- motion-dom@12.38.0:
+ motion-dom@12.40.0:
dependencies:
- motion-utils: 12.36.0
+ motion-utils: 12.39.0
- motion-utils@12.36.0: {}
+ motion-utils@12.39.0: {}
- motion@12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
+ motion@12.40.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
- framer-motion: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ framer-motion: 12.40.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
tslib: 2.8.1
optionalDependencies:
'@emotion/is-prop-valid': 1.4.0
From e5b6469f6f8701bfa5b81fa9e54633c55bee0fdb Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:30:54 +0000
Subject: [PATCH 016/112] chore: bump @babel/plugin-syntax-typescript from
7.28.6 to 7.29.7 in /site (#25964)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bumps
[@babel/plugin-syntax-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-syntax-typescript)
from 7.28.6 to 7.29.7.
Release notes
Sourced from @babel/plugin-syntax-typescript's
releases .
v7.29.7 (2026-05-25)
Re-release all packages with npm provenance attestations
v7.29.6 (2026-05-25)
:bug: Bug Fix
babel-generator
babel-core
babel-core, babel-generator
Committers: 3
v7.29.5 (2026-05-05)
:house: Internal
babel-preset-env
Update @babel/* dependencies
v7.29.4 (2026-05-05)
:bug: Bug Fix
babel-plugin-transform-modules-systemjs
#17974
[7.x backport]fix(systemjs): improve module string name support (@JLHwung )
Committers: 1
v7.29.3 (2026-04-30)
:eyeglasses: Spec Compliance
:bug: Bug Fix
babel-helper-create-class-features-plugin,
babel-plugin-proposal-decorators
#17931
fix(decorators): replace super within all removed static elements (@JLHwung )
babel-register
babel-compat-data,
babel-plugin-bugfix-safari-rest-destructuring-rhs-array,
babel-preset-env
#17788 Add
bugfix plugin for Safari array rest destructuring bug (@JLHwung )
:nail_care: Polish
... (truncated)
Commits
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 18 +++++++++---------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/site/package.json b/site/package.json
index 8375847a635bf..807e75d317e5f 100644
--- a/site/package.json
+++ b/site/package.json
@@ -123,7 +123,7 @@
},
"devDependencies": {
"@babel/core": "7.29.7",
- "@babel/plugin-syntax-typescript": "7.28.6",
+ "@babel/plugin-syntax-typescript": "7.29.7",
"@biomejs/biome": "2.4.10",
"@chromatic-com/storybook": "5.0.1",
"@octokit/types": "12.6.0",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index 24832885db053..c5859fd617a9d 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -280,8 +280,8 @@ importers:
specifier: 7.29.7
version: 7.29.7
'@babel/plugin-syntax-typescript':
- specifier: 7.28.6
- version: 7.28.6(@babel/core@7.29.7)
+ specifier: 7.29.7
+ version: 7.29.7(@babel/core@7.29.7)
'@biomejs/biome':
specifier: 2.4.10
version: 2.4.10
@@ -533,8 +533,8 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-plugin-utils@7.28.6':
- resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==, tarball: https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz}
+ '@babel/helper-plugin-utils@7.29.7':
+ resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==, tarball: https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz}
engines: {node: '>=6.9.0'}
'@babel/helper-string-parser@7.27.1':
@@ -566,8 +566,8 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/plugin-syntax-typescript@7.28.6':
- resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz}
+ '@babel/plugin-syntax-typescript@7.29.7':
+ resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -6478,7 +6478,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@babel/helper-plugin-utils@7.28.6': {}
+ '@babel/helper-plugin-utils@7.29.7': {}
'@babel/helper-string-parser@7.27.1': {}
@@ -6499,10 +6499,10 @@ snapshots:
dependencies:
'@babel/types': 7.29.7
- '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.7)':
+ '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)':
dependencies:
'@babel/core': 7.29.7
- '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-plugin-utils': 7.29.7
'@babel/runtime@7.26.10':
dependencies:
From 532660d4f81e41a677d209e358d9d31d072010e4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:31:12 +0000
Subject: [PATCH 017/112] chore: bump @vitest/browser-playwright from 4.1.1 to
4.1.7 in /site (#25959)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bumps
[@vitest/browser-playwright](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright)
from 4.1.1 to 4.1.7.
Release notes
Sourced from @vitest/browser-playwright's
releases .
v4.1.7
🐞 Bug Fixes
v4.1.6
🐞 Bug Fixes
🏎 Performance
v4.1.5
🚀 Experimental Features
🐞 Bug Fixes
v4.1.4
🚀 Experimental Features
... (truncated)
Commits
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 129 +++++++++++++++++++++++++-------------------
2 files changed, 75 insertions(+), 56 deletions(-)
diff --git a/site/package.json b/site/package.json
index 807e75d317e5f..f77b7a1a4d405 100644
--- a/site/package.json
+++ b/site/package.json
@@ -159,7 +159,7 @@
"@types/ua-parser-js": "0.7.36",
"@types/uuid": "9.0.2",
"@vitejs/plugin-react": "6.0.1",
- "@vitest/browser-playwright": "4.1.1",
+ "@vitest/browser-playwright": "4.1.7",
"autoprefixer": "10.5.0",
"babel-plugin-react-compiler": "1.0.0",
"chromatic": "11.29.0",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index c5859fd617a9d..42d6c2e4bc3df 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -308,13 +308,13 @@ importers:
version: 10.3.3(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-mcp':
specifier: ^0.6.0
- version: 0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)
+ version: 0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)
'@storybook/addon-themes':
specifier: 10.3.3
version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-vitest':
specifier: 10.3.3
- version: 10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
+ version: 10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
'@storybook/react-vite':
specifier: 10.3.3
version: 10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
@@ -388,8 +388,8 @@ importers:
specifier: 6.0.1
version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@vitest/browser-playwright':
- specifier: 4.1.1
- version: 4.1.1(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ specifier: 4.1.7
+ version: 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
autoprefixer:
specifier: 10.5.0
version: 10.5.0(postcss@8.5.10)
@@ -461,7 +461,7 @@ importers:
version: 0.13.0(@biomejs/biome@2.4.10)(optionator@0.9.3)(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
vitest:
specifier: 4.1.5
- version: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.1)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
packages:
@@ -2653,6 +2653,9 @@ packages:
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, tarball: https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz}
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==, tarball: https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz}
+
'@types/express-serve-static-core@4.17.35':
resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==, tarball: https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz}
@@ -2829,16 +2832,16 @@ packages:
babel-plugin-react-compiler:
optional: true
- '@vitest/browser-playwright@4.1.1':
- resolution: {integrity: sha512-dtVSBZZha2k/7P7EAXXrEAoxuIKl8Yv9f2Dk4GN/DGfmhf4DQvkvu+57okR2wq/gan1xppKjL/aBxK/kbYrbGw==, tarball: https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.1.tgz}
+ '@vitest/browser-playwright@4.1.7':
+ resolution: {integrity: sha512-OlTlJej7YN6VwV7zJJoNeaCsctF+JXpzpZ4oBHUbrQFfIq+0KW2f07rprCLh9N/zRIZ0v4Mchn1QDDmWMUhPKw==, tarball: https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.7.tgz}
peerDependencies:
playwright: 1.55.1
- vitest: 4.1.1
+ vitest: 4.1.7
- '@vitest/browser@4.1.1':
- resolution: {integrity: sha512-gjjrFC4+kPVK/fN9URDJWrssU5Gqh8Az8pKG/NSfQ2V+ky8b/y1BgBg0Ug13+hOGp5pzInonmGRPn7vOgSLgzA==, tarball: https://registry.npmjs.org/@vitest/browser/-/browser-4.1.1.tgz}
+ '@vitest/browser@4.1.7':
+ resolution: {integrity: sha512-N2JFGfXoEGVAut+kHeru9dD4BUMq/q5xDvBARNl0tUsly3m5KglLOu8VO/6MkDfOlgxXTycojkt6gBKsuyR+IQ==, tarball: https://registry.npmjs.org/@vitest/browser/-/browser-4.1.7.tgz}
peerDependencies:
- vitest: 4.1.1
+ vitest: 4.1.7
'@vitest/expect@3.2.4':
resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz}
@@ -2846,8 +2849,8 @@ packages:
'@vitest/expect@4.1.5':
resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz}
- '@vitest/mocker@4.1.1':
- resolution: {integrity: sha512-h3BOylsfsCLPeceuCPAAJ+BvNwSENgJa4hXoXu4im0bs9Lyp4URc4JYK4pWLZ4pG/UQn7AT92K6IByi6rE6g3A==, tarball: https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.1.tgz}
+ '@vitest/mocker@4.1.5':
+ resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==, tarball: https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz}
peerDependencies:
msw: ^2.4.9
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -2857,8 +2860,8 @@ packages:
vite:
optional: true
- '@vitest/mocker@4.1.5':
- resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==, tarball: https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz}
+ '@vitest/mocker@4.1.7':
+ resolution: {integrity: sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==, tarball: https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.7.tgz}
peerDependencies:
msw: ^2.4.9
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -2871,12 +2874,12 @@ packages:
'@vitest/pretty-format@3.2.4':
resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz}
- '@vitest/pretty-format@4.1.1':
- resolution: {integrity: sha512-GM+TEQN5WhOygr1lp7skeVjdLPqqWMHsfzXrcHAqZJi/lIVh63H0kaRCY8MDhNWikx19zBUK8ceaLB7X5AH9NQ==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.1.tgz}
-
'@vitest/pretty-format@4.1.5':
resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz}
+ '@vitest/pretty-format@4.1.7':
+ resolution: {integrity: sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.7.tgz}
+
'@vitest/runner@4.1.5':
resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==, tarball: https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz}
@@ -2886,21 +2889,21 @@ packages:
'@vitest/spy@3.2.4':
resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz}
- '@vitest/spy@4.1.1':
- resolution: {integrity: sha512-6Ti/KT5OVaiupdIZEuZN7l3CZcR0cxnxt70Z0//3CtwgObwA6jZhmVBA3yrXSVN3gmwjgd7oDNLlsXz526gpRA==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-4.1.1.tgz}
-
'@vitest/spy@4.1.5':
resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz}
+ '@vitest/spy@4.1.7':
+ resolution: {integrity: sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-4.1.7.tgz}
+
'@vitest/utils@3.2.4':
resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz}
- '@vitest/utils@4.1.1':
- resolution: {integrity: sha512-cNxAlaB3sHoCdL6pj6yyUXv9Gry1NHNg0kFTXdvSIZXLHsqKH7chiWOkwJ5s5+d/oMwcoG9T0bKU38JZWKusrQ==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-4.1.1.tgz}
-
'@vitest/utils@4.1.5':
resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz}
+ '@vitest/utils@4.1.7':
+ resolution: {integrity: sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-4.1.7.tgz}
+
'@xterm/addon-canvas@0.7.0':
resolution: {integrity: sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw==, tarball: https://registry.npmjs.org/@xterm/addon-canvas/-/addon-canvas-0.7.0.tgz}
peerDependencies:
@@ -6305,6 +6308,18 @@ packages:
utf-8-validate:
optional: true
+ ws@8.21.0:
+ resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==, tarball: https://registry.npmjs.org/ws/-/ws-8.21.0.tgz}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
wsl-utils@0.1.0:
resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==, tarball: https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz}
engines: {node: '>=18'}
@@ -8293,7 +8308,7 @@ snapshots:
optionalDependencies:
react: 19.2.6
- '@storybook/addon-mcp@0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)':
+ '@storybook/addon-mcp@0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)':
dependencies:
'@storybook/mcp': 0.7.0(typescript@6.0.2)
'@tmcp/adapter-valibot': 0.1.5(tmcp@1.19.3(typescript@6.0.2))(valibot@1.2.0(typescript@6.0.2))
@@ -8303,7 +8318,7 @@ snapshots:
tmcp: 1.19.3(typescript@6.0.2)
valibot: 1.2.0(typescript@6.0.2)
optionalDependencies:
- '@storybook/addon-vitest': 10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
+ '@storybook/addon-vitest': 10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
transitivePeerDependencies:
- '@tmcp/auth'
- typescript
@@ -8313,16 +8328,16 @@ snapshots:
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
ts-dedent: 2.2.0
- '@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.1)(@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)':
+ '@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)':
dependencies:
'@storybook/global': 5.0.0
'@storybook/icons': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
optionalDependencies:
- '@vitest/browser': 4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
- '@vitest/browser-playwright': 4.1.1(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ '@vitest/browser': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ '@vitest/browser-playwright': 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
'@vitest/runner': 4.1.5
- vitest: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.1)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ vitest: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
transitivePeerDependencies:
- react
- react-dom
@@ -8674,10 +8689,12 @@ snapshots:
'@types/estree-jsx@1.0.5':
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
'@types/estree@1.0.8': {}
+ '@types/estree@1.0.9': {}
+
'@types/express-serve-static-core@4.17.35':
dependencies:
'@types/node': 20.19.39
@@ -8847,30 +8864,30 @@ snapshots:
'@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
babel-plugin-react-compiler: 1.0.0
- '@vitest/browser-playwright@4.1.1(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
+ '@vitest/browser-playwright@4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
dependencies:
- '@vitest/browser': 4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
- '@vitest/mocker': 4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@vitest/browser': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
playwright: 1.55.1
tinyrainbow: 3.1.0
- vitest: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.1)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ vitest: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
transitivePeerDependencies:
- bufferutil
- msw
- utf-8-validate
- vite
- '@vitest/browser@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
+ '@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
dependencies:
'@blazediff/core': 1.9.1
- '@vitest/mocker': 4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
- '@vitest/utils': 4.1.1
+ '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@vitest/utils': 4.1.7
magic-string: 0.30.21
pngjs: 7.0.0
sirv: 3.0.2
tinyrainbow: 3.1.0
- vitest: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.1)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
- ws: 8.20.0
+ vitest: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ ws: 8.21.0
transitivePeerDependencies:
- bufferutil
- msw
@@ -8894,18 +8911,18 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.0
- '@vitest/mocker@4.1.1(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@vitest/mocker@4.1.5(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- '@vitest/spy': 4.1.1
+ '@vitest/spy': 4.1.5
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
msw: 2.4.8(typescript@6.0.2)
vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
- '@vitest/mocker@4.1.5(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@vitest/mocker@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- '@vitest/spy': 4.1.5
+ '@vitest/spy': 4.1.7
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
@@ -8916,11 +8933,11 @@ snapshots:
dependencies:
tinyrainbow: 2.0.0
- '@vitest/pretty-format@4.1.1':
+ '@vitest/pretty-format@4.1.5':
dependencies:
tinyrainbow: 3.1.0
- '@vitest/pretty-format@4.1.5':
+ '@vitest/pretty-format@4.1.7':
dependencies:
tinyrainbow: 3.1.0
@@ -8940,25 +8957,25 @@ snapshots:
dependencies:
tinyspy: 4.0.4
- '@vitest/spy@4.1.1': {}
-
'@vitest/spy@4.1.5': {}
+ '@vitest/spy@4.1.7': {}
+
'@vitest/utils@3.2.4':
dependencies:
'@vitest/pretty-format': 3.2.4
loupe: 3.2.1
tinyrainbow: 2.0.0
- '@vitest/utils@4.1.1':
+ '@vitest/utils@4.1.5':
dependencies:
- '@vitest/pretty-format': 4.1.1
+ '@vitest/pretty-format': 4.1.5
convert-source-map: 2.0.0
tinyrainbow: 3.1.0
- '@vitest/utils@4.1.5':
+ '@vitest/utils@4.1.7':
dependencies:
- '@vitest/pretty-format': 4.1.5
+ '@vitest/pretty-format': 4.1.7
convert-source-map: 2.0.0
tinyrainbow: 3.1.0
@@ -9852,7 +9869,7 @@ snapshots:
estree-walker@3.0.3:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
esutils@2.0.3: {}
@@ -12635,7 +12652,7 @@ snapshots:
jiti: 1.21.7
yaml: 2.8.3
- vitest@4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.1)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)):
+ vitest@4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)):
dependencies:
'@vitest/expect': 4.1.5
'@vitest/mocker': 4.1.5(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
@@ -12659,7 +12676,7 @@ snapshots:
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 20.19.39
- '@vitest/browser-playwright': 4.1.1(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ '@vitest/browser-playwright': 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
jsdom: 27.2.0
transitivePeerDependencies:
- msw
@@ -12771,6 +12788,8 @@ snapshots:
ws@8.20.0: {}
+ ws@8.21.0: {}
+
wsl-utils@0.1.0:
dependencies:
is-wsl: 3.1.1
From 5bb089b0cd1cf71b1d175e966e25da33cb43a13a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:32:12 +0000
Subject: [PATCH 018/112] chore: bump postcss from 8.5.10 to 8.5.15 in /site
(#25962)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[//]: # (dependabot-start)
⚠️ **Dependabot is rebasing this PR** ⚠️
Rebasing might not happen immediately, so don't worry if this takes some
time.
Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.
---
[//]: # (dependabot-end)
Bumps [postcss](https://github.com/postcss/postcss) from 8.5.10 to
8.5.15.
Release notes
Sourced from postcss's
releases .
8.5.15
Fixed declaration parsing performance (by @homanp ).
8.5.14
Fixed custom syntax regression (by @43081j ).
8.5.13
Fixed postcss-scss commend regression.
8.5.12
Fixed reading any file via user-generated CSS.
Added opts.unsafeMap to disable checks.
8.5.11
Fixed nested brackets parsing performance (by @offset ).
Changelog
Sourced from postcss's
changelog .
8.5.15
Fixed declaration parsing performance (by @homanp ).
8.5.14
Fixed custom syntax regression (by @43081j ).
8.5.13
Fixed postcss-scss commend regression.
8.5.12
Fixed reading any file via user-generated CSS.
Added opts.unsafeMap to disable checks.
8.5.11
Fixed nested brackets parsing performance (by @offset ).
Commits
eae46db
Release 8.5.15 version
79508ff
Update CI actions
b128e21
Speed up declaration parsing by avoiding creating new array on each
token
9825dca
Fix code format
55789c8
Update dependencies
84fbbe9
Install older pnpm action for old Node.js
9f860bd
Revert pnpm action for old Node.js
0877198
Update CI actions
b2d1a33
Fix linter warnings
0700dac
Merge pull request #2088
from rootvector2/add-oss-fuzz-harness
Additional commits viewable in compare
view
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 52 ++++++++++++++++++++++-----------------------
2 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/site/package.json b/site/package.json
index f77b7a1a4d405..50c3ed443c8e4 100644
--- a/site/package.json
+++ b/site/package.json
@@ -170,7 +170,7 @@
"jsdom": "27.2.0",
"knip": "5.71.0",
"msw": "2.4.8",
- "postcss": "8.5.10",
+ "postcss": "8.5.15",
"protobufjs": "7.6.1",
"resize-observer-polyfill": "1.5.1",
"rollup-plugin-visualizer": "7.0.1",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index 42d6c2e4bc3df..75f28a39c756a 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -392,7 +392,7 @@ importers:
version: 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
autoprefixer:
specifier: 10.5.0
- version: 10.5.0(postcss@8.5.10)
+ version: 10.5.0(postcss@8.5.15)
babel-plugin-react-compiler:
specifier: 1.0.0
version: 1.0.0
@@ -421,8 +421,8 @@ importers:
specifier: 2.4.8
version: 2.4.8(typescript@6.0.2)
postcss:
- specifier: 8.5.10
- version: 8.5.10
+ specifier: 8.5.15
+ version: 8.5.15
protobufjs:
specifier: 7.6.1
version: 7.6.1
@@ -4817,8 +4817,8 @@ packages:
nan@2.23.0:
resolution: {integrity: sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==, tarball: https://registry.npmjs.org/nan/-/nan-2.23.0.tgz}
- nanoid@3.3.11:
- resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, tarball: https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz}
+ nanoid@3.3.12:
+ resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==, tarball: https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
@@ -5064,8 +5064,8 @@ packages:
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, tarball: https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz}
- postcss@8.5.10:
- resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==, tarball: https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz}
+ postcss@8.5.15:
+ resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==, tarball: https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz}
engines: {node: ^10 || ^12 || >=14}
powershell-utils@0.1.0:
@@ -9074,13 +9074,13 @@ snapshots:
asynckit@0.4.0: {}
- autoprefixer@10.5.0(postcss@8.5.10):
+ autoprefixer@10.5.0(postcss@8.5.15):
dependencies:
browserslist: 4.28.2
caniuse-lite: 1.0.30001791
fraction.js: 5.3.4
picocolors: 1.1.1
- postcss: 8.5.10
+ postcss: 8.5.15
postcss-value-parser: 4.2.0
available-typed-arrays@1.0.7:
@@ -11168,7 +11168,7 @@ snapshots:
nan@2.23.0:
optional: true
- nanoid@3.3.11: {}
+ nanoid@3.3.12: {}
negotiator@0.6.3: {}
@@ -11387,29 +11387,29 @@ snapshots:
possible-typed-array-names@1.0.0: {}
- postcss-import@15.1.0(postcss@8.5.10):
+ postcss-import@15.1.0(postcss@8.5.15):
dependencies:
- postcss: 8.5.10
+ postcss: 8.5.15
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.11
- postcss-js@4.1.0(postcss@8.5.10):
+ postcss-js@4.1.0(postcss@8.5.15):
dependencies:
camelcase-css: 2.0.1
- postcss: 8.5.10
+ postcss: 8.5.15
- postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.10)(yaml@2.8.3):
+ postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.15)(yaml@2.8.3):
dependencies:
lilconfig: 3.1.3
optionalDependencies:
jiti: 1.21.7
- postcss: 8.5.10
+ postcss: 8.5.15
yaml: 2.8.3
- postcss-nested@6.2.0(postcss@8.5.10):
+ postcss-nested@6.2.0(postcss@8.5.15):
dependencies:
- postcss: 8.5.10
+ postcss: 8.5.15
postcss-selector-parser: 6.1.2
postcss-selector-parser@6.0.10:
@@ -11424,9 +11424,9 @@ snapshots:
postcss-value-parser@4.2.0: {}
- postcss@8.5.10:
+ postcss@8.5.15:
dependencies:
- nanoid: 3.3.11
+ nanoid: 3.3.12
picocolors: 1.1.1
source-map-js: 1.2.1
@@ -12311,11 +12311,11 @@ snapshots:
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.1.1
- postcss: 8.5.10
- postcss-import: 15.1.0(postcss@8.5.10)
- postcss-js: 4.1.0(postcss@8.5.10)
- postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.10)(yaml@2.8.3)
- postcss-nested: 6.2.0(postcss@8.5.10)
+ postcss: 8.5.15
+ postcss-import: 15.1.0(postcss@8.5.15)
+ postcss-js: 4.1.0(postcss@8.5.15)
+ postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.15)(yaml@2.8.3)
+ postcss-nested: 6.2.0(postcss@8.5.15)
postcss-selector-parser: 6.1.2
resolve: 1.22.10
sucrase: 3.35.0
@@ -12642,7 +12642,7 @@ snapshots:
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.4
- postcss: 8.5.10
+ postcss: 8.5.15
rolldown: 1.0.0-rc.17
tinyglobby: 0.2.16
optionalDependencies:
From 36e71e04edcb218aad1337b4988ddb404a2019cf Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:41:19 +0000
Subject: [PATCH 019/112] chore: bump @types/node from 20.19.39 to 20.19.41 in
/site (#25955)
Bumps
[@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)
from 20.19.39 to 20.19.41.
Commits
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 2 +-
site/pnpm-lock.yaml | 138 ++++++++++++++++++++++----------------------
2 files changed, 70 insertions(+), 70 deletions(-)
diff --git a/site/package.json b/site/package.json
index 50c3ed443c8e4..519ec47024300 100644
--- a/site/package.json
+++ b/site/package.json
@@ -146,7 +146,7 @@
"@types/file-saver": "2.0.7",
"@types/humanize-duration": "3.27.4",
"@types/lodash": "4.17.24",
- "@types/node": "20.19.39",
+ "@types/node": "20.19.41",
"@types/novnc__novnc": "1.5.0",
"@types/react": "19.2.15",
"@types/react-color": "3.0.13",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index 75f28a39c756a..ee213752edfdf 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -296,28 +296,28 @@ importers:
version: 1.50.1
'@rolldown/plugin-babel':
specifier: 0.2.3
- version: 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/addon-a11y':
specifier: 10.3.3
version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-docs':
specifier: 10.3.3
- version: 10.3.3(@types/react@19.2.15)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 10.3.3(@types/react@19.2.15)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/addon-links':
specifier: 10.3.3
version: 10.3.3(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-mcp':
specifier: ^0.6.0
- version: 0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)
+ version: 0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)
'@storybook/addon-themes':
specifier: 10.3.3
version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-vitest':
specifier: 10.3.3
- version: 10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
+ version: 10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
'@storybook/react-vite':
specifier: 10.3.3
- version: 10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@tailwindcss/typography':
specifier: 0.5.19
version: 0.5.19(tailwindcss@3.4.18(yaml@2.8.3))
@@ -349,8 +349,8 @@ importers:
specifier: 4.17.24
version: 4.17.24
'@types/node':
- specifier: 20.19.39
- version: 20.19.39
+ specifier: 20.19.41
+ version: 20.19.41
'@types/novnc__novnc':
specifier: 1.5.0
version: 1.5.0
@@ -386,10 +386,10 @@ importers:
version: 9.0.2
'@vitejs/plugin-react':
specifier: 6.0.1
- version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@vitest/browser-playwright':
specifier: 4.1.7
- version: 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ version: 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
autoprefixer:
specifier: 10.5.0
version: 10.5.0(postcss@8.5.15)
@@ -416,7 +416,7 @@ importers:
version: 27.2.0
knip:
specifier: 5.71.0
- version: 5.71.0(@types/node@20.19.39)(typescript@6.0.2)
+ version: 5.71.0(@types/node@20.19.41)(typescript@6.0.2)
msw:
specifier: 2.4.8
version: 2.4.8(typescript@6.0.2)
@@ -455,13 +455,13 @@ importers:
version: 6.0.2
vite:
specifier: 8.0.10
- version: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ version: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
vite-plugin-checker:
specifier: 0.13.0
- version: 0.13.0(@biomejs/biome@2.4.10)(optionator@0.9.3)(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 0.13.0(@biomejs/biome@2.4.10)(optionator@0.9.3)(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
vitest:
specifier: 4.1.5
- version: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 4.1.5(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
packages:
@@ -2709,8 +2709,8 @@ packages:
'@types/node@18.19.130':
resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==, tarball: https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz}
- '@types/node@20.19.39':
- resolution: {integrity: sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==, tarball: https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz}
+ '@types/node@20.19.41':
+ resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==, tarball: https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz}
'@types/node@22.19.19':
resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==, tarball: https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz}
@@ -6967,11 +6967,11 @@ snapshots:
dependencies:
'@sinclair/typebox': 0.27.8
- '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
glob: 10.5.0
react-docgen-typescript: 2.4.0(typescript@6.0.2)
- vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
optionalDependencies:
typescript: 6.0.2
@@ -8217,14 +8217,14 @@ snapshots:
'@rolldown/binding-win32-x64-msvc@1.0.0-rc.17':
optional: true
- '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
'@babel/core': 7.29.7
picomatch: 4.0.4
rolldown: 1.0.0-rc.17
optionalDependencies:
'@babel/runtime': 7.26.10
- vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
'@rolldown/pluginutils@1.0.0-rc.17': {}
@@ -8284,10 +8284,10 @@ snapshots:
axe-core: 4.11.1
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
- '@storybook/addon-docs@10.3.3(@types/react@19.2.15)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/addon-docs@10.3.3(@types/react@19.2.15)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
'@mdx-js/react': 3.1.1(@types/react@19.2.15)(react@19.2.6)
- '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/icons': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@storybook/react-dom-shim': 10.3.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
react: 19.2.6
@@ -8308,7 +8308,7 @@ snapshots:
optionalDependencies:
react: 19.2.6
- '@storybook/addon-mcp@0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)':
+ '@storybook/addon-mcp@0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)':
dependencies:
'@storybook/mcp': 0.7.0(typescript@6.0.2)
'@tmcp/adapter-valibot': 0.1.5(tmcp@1.19.3(typescript@6.0.2))(valibot@1.2.0(typescript@6.0.2))
@@ -8318,7 +8318,7 @@ snapshots:
tmcp: 1.19.3(typescript@6.0.2)
valibot: 1.2.0(typescript@6.0.2)
optionalDependencies:
- '@storybook/addon-vitest': 10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
+ '@storybook/addon-vitest': 10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
transitivePeerDependencies:
- '@tmcp/auth'
- typescript
@@ -8328,38 +8328,38 @@ snapshots:
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
ts-dedent: 2.2.0
- '@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)':
+ '@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)':
dependencies:
'@storybook/global': 5.0.0
'@storybook/icons': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
optionalDependencies:
- '@vitest/browser': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
- '@vitest/browser-playwright': 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ '@vitest/browser': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ '@vitest/browser-playwright': 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
'@vitest/runner': 4.1.5
- vitest: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ vitest: 4.1.5(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
transitivePeerDependencies:
- react
- react-dom
- '@storybook/builder-vite@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/builder-vite@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
ts-dedent: 2.2.0
- vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
transitivePeerDependencies:
- esbuild
- rollup
- webpack
- '@storybook/csf-plugin@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/csf-plugin@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
unplugin: 2.3.11
optionalDependencies:
esbuild: 0.25.12
- vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
'@storybook/global@5.0.0': {}
@@ -8384,11 +8384,11 @@ snapshots:
react-dom: 19.2.6(react@19.2.6)
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
- '@storybook/react-vite@10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/react-vite@10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@rollup/pluginutils': 5.3.0
- '@storybook/builder-vite': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@storybook/builder-vite': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/react': 10.3.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)
empathic: 2.0.0
magic-string: 0.30.21
@@ -8398,7 +8398,7 @@ snapshots:
resolve: 1.22.11
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
tsconfig-paths: 4.2.0
- vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
transitivePeerDependencies:
- esbuild
- rollup
@@ -8537,7 +8537,7 @@ snapshots:
'@types/body-parser@1.19.2':
dependencies:
'@types/connect': 3.4.35
- '@types/node': 20.19.39
+ '@types/node': 20.19.41
'@types/chai@5.2.3':
dependencies:
@@ -8554,7 +8554,7 @@ snapshots:
'@types/connect@3.4.35':
dependencies:
- '@types/node': 20.19.39
+ '@types/node': 20.19.41
'@types/cookie@0.6.0': {}
@@ -8697,7 +8697,7 @@ snapshots:
'@types/express-serve-static-core@4.17.35':
dependencies:
- '@types/node': 20.19.39
+ '@types/node': 20.19.41
'@types/qs': 6.9.7
'@types/range-parser': 1.2.4
'@types/send': 0.17.1
@@ -8746,13 +8746,13 @@ snapshots:
'@types/mute-stream@0.0.4':
dependencies:
- '@types/node': 20.19.39
+ '@types/node': 20.19.41
'@types/node@18.19.130':
dependencies:
undici-types: 5.26.5
- '@types/node@20.19.39':
+ '@types/node@20.19.41':
dependencies:
undici-types: 6.21.0
@@ -8817,13 +8817,13 @@ snapshots:
'@types/send@0.17.1':
dependencies:
'@types/mime': 1.3.2
- '@types/node': 20.19.39
+ '@types/node': 20.19.41
'@types/serve-static@1.15.2':
dependencies:
'@types/http-errors': 2.0.1
'@types/mime': 3.0.1
- '@types/node': 20.19.39
+ '@types/node': 20.19.41
'@types/ssh2@1.15.5':
dependencies:
@@ -8856,37 +8856,37 @@ snapshots:
dependencies:
valibot: 1.2.0(typescript@6.0.2)
- '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
'@rolldown/pluginutils': 1.0.0-rc.7
- vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
optionalDependencies:
- '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
babel-plugin-react-compiler: 1.0.0
- '@vitest/browser-playwright@4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
+ '@vitest/browser-playwright@4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
dependencies:
- '@vitest/browser': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
- '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@vitest/browser': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
playwright: 1.55.1
tinyrainbow: 3.1.0
- vitest: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ vitest: 4.1.5(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
transitivePeerDependencies:
- bufferutil
- msw
- utf-8-validate
- vite
- '@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
+ '@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
dependencies:
'@blazediff/core': 1.9.1
- '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@vitest/utils': 4.1.7
magic-string: 0.30.21
pngjs: 7.0.0
sirv: 3.0.2
tinyrainbow: 3.1.0
- vitest: 4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ vitest: 4.1.5(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
ws: 8.21.0
transitivePeerDependencies:
- bufferutil
@@ -8911,23 +8911,23 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.0
- '@vitest/mocker@4.1.5(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@vitest/mocker@4.1.5(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
'@vitest/spy': 4.1.5
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
msw: 2.4.8(typescript@6.0.2)
- vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
- '@vitest/mocker@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@vitest/mocker@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
'@vitest/spy': 4.1.7
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
msw: 2.4.8(typescript@6.0.2)
- vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
'@vitest/pretty-format@3.2.4':
dependencies:
@@ -10533,10 +10533,10 @@ snapshots:
khroma@2.1.0: {}
- knip@5.71.0(@types/node@20.19.39)(typescript@6.0.2):
+ knip@5.71.0(@types/node@20.19.41)(typescript@6.0.2):
dependencies:
'@nodelib/fs.walk': 1.2.8
- '@types/node': 20.19.39
+ '@types/node': 20.19.41
fast-glob: 3.3.3
formatly: 0.3.0
jiti: 2.6.1
@@ -11488,7 +11488,7 @@ snapshots:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.1
- '@types/node': 20.19.39
+ '@types/node': 20.19.41
long: 5.3.2
proxy-addr@2.0.7:
@@ -12621,7 +12621,7 @@ snapshots:
d3-time: 3.1.0
d3-timer: 3.0.1
- vite-plugin-checker@0.13.0(@biomejs/biome@2.4.10)(optionator@0.9.3)(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)):
+ vite-plugin-checker@0.13.0(@biomejs/biome@2.4.10)(optionator@0.9.3)(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)):
dependencies:
'@babel/code-frame': 7.29.0
chokidar: 4.0.3
@@ -12631,14 +12631,14 @@ snapshots:
proper-lockfile: 4.1.2
tiny-invariant: 1.3.3
tinyglobby: 0.2.16
- vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
vscode-uri: 3.1.0
optionalDependencies:
'@biomejs/biome': 2.4.10
optionator: 0.9.3
typescript: 6.0.2
- vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3):
+ vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3):
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.4
@@ -12646,16 +12646,16 @@ snapshots:
rolldown: 1.0.0-rc.17
tinyglobby: 0.2.16
optionalDependencies:
- '@types/node': 20.19.39
+ '@types/node': 20.19.41
esbuild: 0.25.12
fsevents: 2.3.3
jiti: 1.21.7
yaml: 2.8.3
- vitest@4.1.5(@types/node@20.19.39)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)):
+ vitest@4.1.5(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)):
dependencies:
'@vitest/expect': 4.1.5
- '@vitest/mocker': 4.1.5(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@vitest/mocker': 4.1.5(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@vitest/pretty-format': 4.1.5
'@vitest/runner': 4.1.5
'@vitest/snapshot': 4.1.5
@@ -12672,11 +12672,11 @@ snapshots:
tinyexec: 1.1.2
tinyglobby: 0.2.16
tinyrainbow: 3.1.0
- vite: 8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
why-is-node-running: 2.3.0
optionalDependencies:
- '@types/node': 20.19.39
- '@vitest/browser-playwright': 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.39)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ '@types/node': 20.19.41
+ '@vitest/browser-playwright': 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
jsdom: 27.2.0
transitivePeerDependencies:
- msw
From 81288656cd148dae0b91b1d7dd88c62036d00158 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:52:12 +0000
Subject: [PATCH 020/112] chore: bump the vite group across 1 directory with 3
updates (#25951)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bumps the vite group with 3 updates in the /site directory:
[@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react),
[vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) and
[vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).
Updates `@vitejs/plugin-react` from 6.0.1 to 6.0.2
Release notes
Sourced from @vitejs/plugin-react's
releases .
plugin-react@6.0.2
Allow all options in reactCompilerPreset (#1189 )
This is a type only change. Only compilationMode and
target options were available for
reactCompilerPreset.
Changelog
Sourced from @vitejs/plugin-react's
changelog .
6.0.2 (2026-05-14)
Allow all options in reactCompilerPreset (#1189 )
This is a type only change. Only compilationMode and
target options were available for
reactCompilerPreset.
Commits
Updates `vite` from 8.0.10 to 8.0.14
Release notes
Sourced from vite's
releases .
v8.0.14
Please refer to CHANGELOG.md
for details.
v8.0.13
Please refer to CHANGELOG.md
for details.
v8.0.12
Please refer to CHANGELOG.md
for details.
v8.0.11
Please refer to CHANGELOG.md
for details.
Changelog
Sourced from vite's
changelog .
8.0.14
(2026-05-21)
Features
Bug Fixes
deps: update all non-major dependencies (#22471 )
(98b8163 )
dev: handle errors when sending messages to vite
server (#22450 )
(e8e9a34 )
html: handle trailing slash paths in
transformIndexHtml (#22480 )
(5d94d1b )
optimizer: pass oxc jsx options to transformSync in
dependency scan (#22342 )
(b3132da )
Miscellaneous Chores
deps: update rolldown-related dependencies (#22470 )
(7cb728e )
remove irrelevant commits from changelog (2c69495 )
Code Refactoring
glob: do not rewrite import path for absolute base
(#22310 )
(0ae2844 )
Tests
8.0.13
(2026-05-14)
Features
bundled-dev: add lazy bundling support (#21406 )
(4f0949f )
optimizer: improve the esbuild plugin converter to
pass some properties of build result to onEnd (#22357 )
(47071ce )
update rolldown to 1.0.1 (#22444 )
(8c766a6 )
Bug Fixes
build: copy public directory after building same
environment with write=false (#22328 )
(158e8ae )
css: await sass/less/styl worker disposal on
teardown (fix #22274 )
(#22275 )
(b7edcb7 )
css: keep deprecated
name/originalFileName in synthetic
assetFileNames call (#22439 )
(8e59c97 )
make isBundled per environment (#22257 )
(a576326 )
ssr: avoid rewriting labels that collide with
imports (#22451 )
(d9b18e0 )
Miscellaneous Chores
8.0.12
(2026-05-11)
Features
... (truncated)
Commits
c917f1e
release: v8.0.14
5d94d1b
fix(html): handle trailing slash paths in transformIndexHtml (#22480 )
98b8163
fix(deps): update all non-major dependencies (#22471 )
96efc88
feat: update rolldown to 1.0.2 (#22484 )
ebf39a0
test(css): sass does not use main field (#22449 )
0ae2844
refactor(glob): do not rewrite import path for absolute base (#22310 )
7cb728e
chore(deps): update rolldown-related dependencies (#22470 )
b3132da
fix(optimizer): pass oxc jsx options to transformSync in dependency scan
...
e8e9a34
fix(dev): handle errors when sending messages to vite server (#22450 )
2c69495
chore: remove irrelevant commits from changelog
Additional commits viewable in compare
view
Updates `vitest` from 4.1.5 to 4.1.7
Release notes
Sourced from vitest's
releases .
v4.1.7
🐞 Bug Fixes
v4.1.6
🐞 Bug Fixes
🏎 Performance
Commits
a09d472
chore: release v4.1.7
a8fd24c
chore: release v4.1.6
18af98c
fix(browser): simplify orchestrator otel carrier (#10285 )
3188260
feat(browser): provide project reference in
ToMatchScreenshotResolvePath (#...
See full diff in compare
view
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
site/package.json | 6 +-
site/pnpm-lock.yaml | 411 ++++++++++++++++++++------------------------
2 files changed, 194 insertions(+), 223 deletions(-)
diff --git a/site/package.json b/site/package.json
index 519ec47024300..0bca138fe5fb1 100644
--- a/site/package.json
+++ b/site/package.json
@@ -158,7 +158,7 @@
"@types/ssh2": "1.15.5",
"@types/ua-parser-js": "0.7.36",
"@types/uuid": "9.0.2",
- "@vitejs/plugin-react": "6.0.1",
+ "@vitejs/plugin-react": "6.0.2",
"@vitest/browser-playwright": "4.1.7",
"autoprefixer": "10.5.0",
"babel-plugin-react-compiler": "1.0.0",
@@ -181,9 +181,9 @@
"tailwindcss": "3.4.18",
"ts-proto": "1.181.2",
"typescript": "6.0.2",
- "vite": "8.0.10",
+ "vite": "8.0.14",
"vite-plugin-checker": "0.13.0",
- "vitest": "4.1.5"
+ "vitest": "4.1.7"
},
"browserslist": [
"chrome 110",
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
index ee213752edfdf..d8063999effc0 100644
--- a/site/pnpm-lock.yaml
+++ b/site/pnpm-lock.yaml
@@ -296,28 +296,28 @@ importers:
version: 1.50.1
'@rolldown/plugin-babel':
specifier: 0.2.3
- version: 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/addon-a11y':
specifier: 10.3.3
version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-docs':
specifier: 10.3.3
- version: 10.3.3(@types/react@19.2.15)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 10.3.3(@types/react@19.2.15)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/addon-links':
specifier: 10.3.3
version: 10.3.3(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-mcp':
specifier: ^0.6.0
- version: 0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)
+ version: 0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7))(@vitest/runner@4.1.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.7))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)
'@storybook/addon-themes':
specifier: 10.3.3
version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
'@storybook/addon-vitest':
specifier: 10.3.3
- version: 10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
+ version: 10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7))(@vitest/runner@4.1.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.7)
'@storybook/react-vite':
specifier: 10.3.3
- version: 10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@tailwindcss/typography':
specifier: 0.5.19
version: 0.5.19(tailwindcss@3.4.18(yaml@2.8.3))
@@ -385,11 +385,11 @@ importers:
specifier: 9.0.2
version: 9.0.2
'@vitejs/plugin-react':
- specifier: 6.0.1
- version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ specifier: 6.0.2
+ version: 6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@vitest/browser-playwright':
specifier: 4.1.7
- version: 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ version: 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7)
autoprefixer:
specifier: 10.5.0
version: 10.5.0(postcss@8.5.15)
@@ -431,7 +431,7 @@ importers:
version: 1.5.1
rollup-plugin-visualizer:
specifier: 7.0.1
- version: 7.0.1(rolldown@1.0.0-rc.17)
+ version: 7.0.1(rolldown@1.0.2)
rxjs:
specifier: 7.8.2
version: 7.8.2
@@ -454,14 +454,14 @@ importers:
specifier: 6.0.2
version: 6.0.2
vite:
- specifier: 8.0.10
- version: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ specifier: 8.0.14
+ version: 8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
vite-plugin-checker:
specifier: 0.13.0
- version: 0.13.0(@biomejs/biome@2.4.10)(optionator@0.9.3)(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ version: 0.13.0(@biomejs/biome@2.4.10)(optionator@0.9.3)(typescript@6.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
vitest:
- specifier: 4.1.5
- version: 4.1.5(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ specifier: 4.1.7
+ version: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
packages:
@@ -1305,8 +1305,8 @@ packages:
'@open-draft/until@2.1.0':
resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==, tarball: https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz}
- '@oxc-project/types@0.127.0':
- resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==, tarball: https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz}
+ '@oxc-project/types@0.132.0':
+ resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==, tarball: https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz}
'@oxc-resolver/binding-android-arm-eabi@11.14.0':
resolution: {integrity: sha512-jB47iZ/thvhE+USCLv+XY3IknBbkKr/p7OBsQDTHode/GPw+OHRlit3NQ1bjt1Mj8V2CS7iHdSDYobZ1/0gagQ==, tarball: https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.14.0.tgz}
@@ -2159,97 +2159,97 @@ packages:
'@radix-ui/rect@1.1.1':
resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==, tarball: https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz}
- '@rolldown/binding-android-arm64@1.0.0-rc.17':
- resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==, tarball: https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz}
+ '@rolldown/binding-android-arm64@1.0.2':
+ resolution: {integrity: sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==, tarball: https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@rolldown/binding-darwin-arm64@1.0.0-rc.17':
- resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==, tarball: https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz}
+ '@rolldown/binding-darwin-arm64@1.0.2':
+ resolution: {integrity: sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==, tarball: https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@rolldown/binding-darwin-x64@1.0.0-rc.17':
- resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==, tarball: https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz}
+ '@rolldown/binding-darwin-x64@1.0.2':
+ resolution: {integrity: sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==, tarball: https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@rolldown/binding-freebsd-x64@1.0.0-rc.17':
- resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==, tarball: https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz}
+ '@rolldown/binding-freebsd-x64@1.0.2':
+ resolution: {integrity: sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==, tarball: https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17':
- resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz}
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.2':
+ resolution: {integrity: sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17':
- resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz}
+ '@rolldown/binding-linux-arm64-gnu@1.0.2':
+ resolution: {integrity: sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17':
- resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz}
+ '@rolldown/binding-linux-arm64-musl@1.0.2':
+ resolution: {integrity: sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17':
- resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz}
+ '@rolldown/binding-linux-ppc64-gnu@1.0.2':
+ resolution: {integrity: sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17':
- resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz}
+ '@rolldown/binding-linux-s390x-gnu@1.0.2':
+ resolution: {integrity: sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17':
- resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz}
+ '@rolldown/binding-linux-x64-gnu@1.0.2':
+ resolution: {integrity: sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-musl@1.0.0-rc.17':
- resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz}
+ '@rolldown/binding-linux-x64-musl@1.0.2':
+ resolution: {integrity: sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==, tarball: https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
- '@rolldown/binding-openharmony-arm64@1.0.0-rc.17':
- resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==, tarball: https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz}
+ '@rolldown/binding-openharmony-arm64@1.0.2':
+ resolution: {integrity: sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==, tarball: https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- '@rolldown/binding-wasm32-wasi@1.0.0-rc.17':
- resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==, tarball: https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz}
+ '@rolldown/binding-wasm32-wasi@1.0.2':
+ resolution: {integrity: sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==, tarball: https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [wasm32]
- '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17':
- resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==, tarball: https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz}
+ '@rolldown/binding-win32-arm64-msvc@1.0.2':
+ resolution: {integrity: sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==, tarball: https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17':
- resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==, tarball: https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz}
+ '@rolldown/binding-win32-x64-msvc@1.0.2':
+ resolution: {integrity: sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==, tarball: https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
@@ -2271,11 +2271,8 @@ packages:
vite:
optional: true
- '@rolldown/pluginutils@1.0.0-rc.17':
- resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==, tarball: https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz}
-
- '@rolldown/pluginutils@1.0.0-rc.7':
- resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==, tarball: https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz}
+ '@rolldown/pluginutils@1.0.1':
+ resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==, tarball: https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz}
'@rollup/pluginutils@5.3.0':
resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==, tarball: https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz}
@@ -2503,6 +2500,9 @@ packages:
'@tybys/wasm-util@0.10.1':
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==, tarball: https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz}
+ '@tybys/wasm-util@0.10.2':
+ resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==, tarball: https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz}
+
'@types/aria-query@5.0.3':
resolution: {integrity: sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==, tarball: https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.3.tgz}
@@ -2819,8 +2819,8 @@ packages:
peerDependencies:
valibot: ^1.4.0
- '@vitejs/plugin-react@6.0.1':
- resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==, tarball: https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz}
+ '@vitejs/plugin-react@6.0.2':
+ resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==, tarball: https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
'@rolldown/plugin-babel': ^0.1.7 || ^0.2.0
@@ -2846,19 +2846,8 @@ packages:
'@vitest/expect@3.2.4':
resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz}
- '@vitest/expect@4.1.5':
- resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz}
-
- '@vitest/mocker@4.1.5':
- resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==, tarball: https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz}
- peerDependencies:
- msw: ^2.4.9
- vite: ^6.0.0 || ^7.0.0 || ^8.0.0
- peerDependenciesMeta:
- msw:
- optional: true
- vite:
- optional: true
+ '@vitest/expect@4.1.7':
+ resolution: {integrity: sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-4.1.7.tgz}
'@vitest/mocker@4.1.7':
resolution: {integrity: sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==, tarball: https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.7.tgz}
@@ -2874,33 +2863,24 @@ packages:
'@vitest/pretty-format@3.2.4':
resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz}
- '@vitest/pretty-format@4.1.5':
- resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz}
-
'@vitest/pretty-format@4.1.7':
resolution: {integrity: sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.7.tgz}
- '@vitest/runner@4.1.5':
- resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==, tarball: https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz}
+ '@vitest/runner@4.1.7':
+ resolution: {integrity: sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==, tarball: https://registry.npmjs.org/@vitest/runner/-/runner-4.1.7.tgz}
- '@vitest/snapshot@4.1.5':
- resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==, tarball: https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz}
+ '@vitest/snapshot@4.1.7':
+ resolution: {integrity: sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==, tarball: https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.7.tgz}
'@vitest/spy@3.2.4':
resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz}
- '@vitest/spy@4.1.5':
- resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz}
-
'@vitest/spy@4.1.7':
resolution: {integrity: sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-4.1.7.tgz}
'@vitest/utils@3.2.4':
resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz}
- '@vitest/utils@4.1.5':
- resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz}
-
'@vitest/utils@4.1.7':
resolution: {integrity: sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-4.1.7.tgz}
@@ -5448,8 +5428,8 @@ packages:
robust-predicates@3.0.2:
resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==, tarball: https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz}
- rolldown@1.0.0-rc.17:
- resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==, tarball: https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz}
+ rolldown@1.0.2:
+ resolution: {integrity: sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==, tarball: https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
@@ -5781,14 +5761,18 @@ packages:
tinycolor2@1.6.0:
resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==, tarball: https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz}
- tinyexec@1.1.2:
- resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==, tarball: https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz}
+ tinyexec@1.2.4:
+ resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==, tarball: https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz}
engines: {node: '>=18'}
tinyglobby@0.2.16:
resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==, tarball: https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz}
engines: {node: '>=12.0.0'}
+ tinyglobby@0.2.17:
+ resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==, tarball: https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz}
+ engines: {node: '>=12.0.0'}
+
tinyrainbow@2.0.0:
resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, tarball: https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz}
engines: {node: '>=14.0.0'}
@@ -6107,13 +6091,13 @@ packages:
vue-tsc:
optional: true
- vite@8.0.10:
- resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==, tarball: https://registry.npmjs.org/vite/-/vite-8.0.10.tgz}
+ vite@8.0.14:
+ resolution: {integrity: sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==, tarball: https://registry.npmjs.org/vite/-/vite-8.0.14.tgz}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@types/node': ^20.19.0 || >=22.12.0
- '@vitejs/devtools': ^0.1.0
+ '@vitejs/devtools': ^0.1.18
esbuild: ^0.25.0
jiti: '>=1.21.0'
less: ^4.0.0
@@ -6150,20 +6134,20 @@ packages:
yaml:
optional: true
- vitest@4.1.5:
- resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==, tarball: https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz}
+ vitest@4.1.7:
+ resolution: {integrity: sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==, tarball: https://registry.npmjs.org/vitest/-/vitest-4.1.7.tgz}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@opentelemetry/api': ^1.9.0
'@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
- '@vitest/browser-playwright': 4.1.5
- '@vitest/browser-preview': 4.1.5
- '@vitest/browser-webdriverio': 4.1.5
- '@vitest/coverage-istanbul': 4.1.5
- '@vitest/coverage-v8': 4.1.5
- '@vitest/ui': 4.1.5
+ '@vitest/browser-playwright': 4.1.7
+ '@vitest/browser-preview': 4.1.7
+ '@vitest/browser-webdriverio': 4.1.7
+ '@vitest/coverage-istanbul': 4.1.7
+ '@vitest/coverage-v8': 4.1.7
+ '@vitest/ui': 4.1.7
happy-dom: '*'
jsdom: '*'
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -6398,7 +6382,7 @@ snapshots:
'@antfu/install-pkg@1.1.0':
dependencies:
package-manager-detector: 1.6.0
- tinyexec: 1.1.2
+ tinyexec: 1.2.4
'@asamuzakjp/css-color@4.1.0':
dependencies:
@@ -6967,11 +6951,11 @@ snapshots:
dependencies:
'@sinclair/typebox': 0.27.8
- '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@6.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
glob: 10.5.0
react-docgen-typescript: 2.4.0(typescript@6.0.2)
- vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
optionalDependencies:
typescript: 6.0.2
@@ -7278,7 +7262,7 @@ snapshots:
dependencies:
'@emnapi/core': 1.10.0
'@emnapi/runtime': 1.10.0
- '@tybys/wasm-util': 0.10.1
+ '@tybys/wasm-util': 0.10.2
optional: true
'@neoconfetti/react@1.0.0': {}
@@ -7312,7 +7296,7 @@ snapshots:
'@open-draft/until@2.1.0': {}
- '@oxc-project/types@0.127.0': {}
+ '@oxc-project/types@0.132.0': {}
'@oxc-resolver/binding-android-arm-eabi@11.14.0':
optional: true
@@ -8168,67 +8152,65 @@ snapshots:
'@radix-ui/rect@1.1.1': {}
- '@rolldown/binding-android-arm64@1.0.0-rc.17':
+ '@rolldown/binding-android-arm64@1.0.2':
optional: true
- '@rolldown/binding-darwin-arm64@1.0.0-rc.17':
+ '@rolldown/binding-darwin-arm64@1.0.2':
optional: true
- '@rolldown/binding-darwin-x64@1.0.0-rc.17':
+ '@rolldown/binding-darwin-x64@1.0.2':
optional: true
- '@rolldown/binding-freebsd-x64@1.0.0-rc.17':
+ '@rolldown/binding-freebsd-x64@1.0.2':
optional: true
- '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17':
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.2':
optional: true
- '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17':
+ '@rolldown/binding-linux-arm64-gnu@1.0.2':
optional: true
- '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17':
+ '@rolldown/binding-linux-arm64-musl@1.0.2':
optional: true
- '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17':
+ '@rolldown/binding-linux-ppc64-gnu@1.0.2':
optional: true
- '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17':
+ '@rolldown/binding-linux-s390x-gnu@1.0.2':
optional: true
- '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17':
+ '@rolldown/binding-linux-x64-gnu@1.0.2':
optional: true
- '@rolldown/binding-linux-x64-musl@1.0.0-rc.17':
+ '@rolldown/binding-linux-x64-musl@1.0.2':
optional: true
- '@rolldown/binding-openharmony-arm64@1.0.0-rc.17':
+ '@rolldown/binding-openharmony-arm64@1.0.2':
optional: true
- '@rolldown/binding-wasm32-wasi@1.0.0-rc.17':
+ '@rolldown/binding-wasm32-wasi@1.0.2':
dependencies:
'@emnapi/core': 1.10.0
'@emnapi/runtime': 1.10.0
'@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)
optional: true
- '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17':
+ '@rolldown/binding-win32-arm64-msvc@1.0.2':
optional: true
- '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17':
+ '@rolldown/binding-win32-x64-msvc@1.0.2':
optional: true
- '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
'@babel/core': 7.29.7
picomatch: 4.0.4
- rolldown: 1.0.0-rc.17
+ rolldown: 1.0.2
optionalDependencies:
'@babel/runtime': 7.26.10
- vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
-
- '@rolldown/pluginutils@1.0.0-rc.17': {}
+ vite: 8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
- '@rolldown/pluginutils@1.0.0-rc.7': {}
+ '@rolldown/pluginutils@1.0.1': {}
'@rollup/pluginutils@5.3.0':
dependencies:
@@ -8284,10 +8266,10 @@ snapshots:
axe-core: 4.11.1
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
- '@storybook/addon-docs@10.3.3(@types/react@19.2.15)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/addon-docs@10.3.3(@types/react@19.2.15)(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
'@mdx-js/react': 3.1.1(@types/react@19.2.15)(react@19.2.6)
- '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/icons': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@storybook/react-dom-shim': 10.3.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))
react: 19.2.6
@@ -8308,7 +8290,7 @@ snapshots:
optionalDependencies:
react: 19.2.6
- '@storybook/addon-mcp@0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)':
+ '@storybook/addon-mcp@0.6.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7))(@vitest/runner@4.1.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.7))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)':
dependencies:
'@storybook/mcp': 0.7.0(typescript@6.0.2)
'@tmcp/adapter-valibot': 0.1.5(tmcp@1.19.3(typescript@6.0.2))(valibot@1.2.0(typescript@6.0.2))
@@ -8318,7 +8300,7 @@ snapshots:
tmcp: 1.19.3(typescript@6.0.2)
valibot: 1.2.0(typescript@6.0.2)
optionalDependencies:
- '@storybook/addon-vitest': 10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)
+ '@storybook/addon-vitest': 10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7))(@vitest/runner@4.1.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.7)
transitivePeerDependencies:
- '@tmcp/auth'
- typescript
@@ -8328,38 +8310,38 @@ snapshots:
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
ts-dedent: 2.2.0
- '@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5))(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)':
+ '@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7))(@vitest/runner@4.1.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.7)':
dependencies:
'@storybook/global': 5.0.0
'@storybook/icons': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
optionalDependencies:
- '@vitest/browser': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
- '@vitest/browser-playwright': 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
- '@vitest/runner': 4.1.5
- vitest: 4.1.5(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@vitest/browser': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7)
+ '@vitest/browser-playwright': 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7)
+ '@vitest/runner': 4.1.7
+ vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
transitivePeerDependencies:
- react
- react-dom
- '@storybook/builder-vite@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/builder-vite@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@storybook/csf-plugin': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
ts-dedent: 2.2.0
- vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
transitivePeerDependencies:
- esbuild
- rollup
- webpack
- '@storybook/csf-plugin@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/csf-plugin@10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
unplugin: 2.3.11
optionalDependencies:
esbuild: 0.25.12
- vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
'@storybook/global@5.0.0': {}
@@ -8384,11 +8366,11 @@ snapshots:
react-dom: 19.2.6(react@19.2.6)
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
- '@storybook/react-vite@10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@storybook/react-vite@10.3.3(esbuild@0.25.12)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@6.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@rollup/pluginutils': 5.3.0
- '@storybook/builder-vite': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@storybook/builder-vite': 10.3.3(esbuild@0.25.12)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@storybook/react': 10.3.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@6.0.2)
empathic: 2.0.0
magic-string: 0.30.21
@@ -8398,7 +8380,7 @@ snapshots:
resolve: 1.22.11
storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
tsconfig-paths: 4.2.0
- vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
transitivePeerDependencies:
- esbuild
- rollup
@@ -8509,6 +8491,11 @@ snapshots:
tslib: 2.8.1
optional: true
+ '@tybys/wasm-util@0.10.2':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@types/aria-query@5.0.3': {}
'@types/aria-query@5.0.4': {}
@@ -8689,7 +8676,7 @@ snapshots:
'@types/estree-jsx@1.0.5':
dependencies:
- '@types/estree': 1.0.9
+ '@types/estree': 1.0.8
'@types/estree@1.0.8': {}
@@ -8856,37 +8843,37 @@ snapshots:
dependencies:
valibot: 1.2.0(typescript@6.0.2)
- '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@vitejs/plugin-react@6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
- '@rolldown/pluginutils': 1.0.0-rc.7
- vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ '@rolldown/pluginutils': 1.0.1
+ vite: 8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
optionalDependencies:
- '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.26.10)(rolldown@1.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
babel-plugin-react-compiler: 1.0.0
- '@vitest/browser-playwright@4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
+ '@vitest/browser-playwright@4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7)':
dependencies:
- '@vitest/browser': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
- '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@vitest/browser': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7)
+ '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
playwright: 1.55.1
tinyrainbow: 3.1.0
- vitest: 4.1.5(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
transitivePeerDependencies:
- bufferutil
- msw
- utf-8-validate
- vite
- '@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)':
+ '@vitest/browser@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7)':
dependencies:
'@blazediff/core': 1.9.1
- '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
'@vitest/utils': 4.1.7
magic-string: 0.30.21
pngjs: 7.0.0
sirv: 3.0.2
tinyrainbow: 3.1.0
- vitest: 4.1.5(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
ws: 8.21.0
transitivePeerDependencies:
- bufferutil
@@ -8902,54 +8889,41 @@ snapshots:
chai: 5.3.3
tinyrainbow: 2.0.0
- '@vitest/expect@4.1.5':
+ '@vitest/expect@4.1.7':
dependencies:
'@standard-schema/spec': 1.1.0
'@types/chai': 5.2.3
- '@vitest/spy': 4.1.5
- '@vitest/utils': 4.1.5
+ '@vitest/spy': 4.1.7
+ '@vitest/utils': 4.1.7
chai: 6.2.2
tinyrainbow: 3.1.0
- '@vitest/mocker@4.1.5(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
- dependencies:
- '@vitest/spy': 4.1.5
- estree-walker: 3.0.3
- magic-string: 0.30.21
- optionalDependencies:
- msw: 2.4.8(typescript@6.0.2)
- vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
-
- '@vitest/mocker@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
+ '@vitest/mocker@4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))':
dependencies:
'@vitest/spy': 4.1.7
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
msw: 2.4.8(typescript@6.0.2)
- vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
'@vitest/pretty-format@3.2.4':
dependencies:
tinyrainbow: 2.0.0
- '@vitest/pretty-format@4.1.5':
- dependencies:
- tinyrainbow: 3.1.0
-
'@vitest/pretty-format@4.1.7':
dependencies:
tinyrainbow: 3.1.0
- '@vitest/runner@4.1.5':
+ '@vitest/runner@4.1.7':
dependencies:
- '@vitest/utils': 4.1.5
+ '@vitest/utils': 4.1.7
pathe: 2.0.3
- '@vitest/snapshot@4.1.5':
+ '@vitest/snapshot@4.1.7':
dependencies:
- '@vitest/pretty-format': 4.1.5
- '@vitest/utils': 4.1.5
+ '@vitest/pretty-format': 4.1.7
+ '@vitest/utils': 4.1.7
magic-string: 0.30.21
pathe: 2.0.3
@@ -8957,8 +8931,6 @@ snapshots:
dependencies:
tinyspy: 4.0.4
- '@vitest/spy@4.1.5': {}
-
'@vitest/spy@4.1.7': {}
'@vitest/utils@3.2.4':
@@ -8967,12 +8939,6 @@ snapshots:
loupe: 3.2.1
tinyrainbow: 2.0.0
- '@vitest/utils@4.1.5':
- dependencies:
- '@vitest/pretty-format': 4.1.5
- convert-source-map: 2.0.0
- tinyrainbow: 3.1.0
-
'@vitest/utils@4.1.7':
dependencies:
'@vitest/pretty-format': 4.1.7
@@ -11930,35 +11896,35 @@ snapshots:
robust-predicates@3.0.2: {}
- rolldown@1.0.0-rc.17:
+ rolldown@1.0.2:
dependencies:
- '@oxc-project/types': 0.127.0
- '@rolldown/pluginutils': 1.0.0-rc.17
+ '@oxc-project/types': 0.132.0
+ '@rolldown/pluginutils': 1.0.1
optionalDependencies:
- '@rolldown/binding-android-arm64': 1.0.0-rc.17
- '@rolldown/binding-darwin-arm64': 1.0.0-rc.17
- '@rolldown/binding-darwin-x64': 1.0.0-rc.17
- '@rolldown/binding-freebsd-x64': 1.0.0-rc.17
- '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17
- '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17
- '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17
- '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17
- '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17
- '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17
- '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17
- '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17
- '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17
- '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17
- '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17
-
- rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-rc.17):
+ '@rolldown/binding-android-arm64': 1.0.2
+ '@rolldown/binding-darwin-arm64': 1.0.2
+ '@rolldown/binding-darwin-x64': 1.0.2
+ '@rolldown/binding-freebsd-x64': 1.0.2
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.2
+ '@rolldown/binding-linux-arm64-gnu': 1.0.2
+ '@rolldown/binding-linux-arm64-musl': 1.0.2
+ '@rolldown/binding-linux-ppc64-gnu': 1.0.2
+ '@rolldown/binding-linux-s390x-gnu': 1.0.2
+ '@rolldown/binding-linux-x64-gnu': 1.0.2
+ '@rolldown/binding-linux-x64-musl': 1.0.2
+ '@rolldown/binding-openharmony-arm64': 1.0.2
+ '@rolldown/binding-wasm32-wasi': 1.0.2
+ '@rolldown/binding-win32-arm64-msvc': 1.0.2
+ '@rolldown/binding-win32-x64-msvc': 1.0.2
+
+ rollup-plugin-visualizer@7.0.1(rolldown@1.0.2):
dependencies:
open: 11.0.0
picomatch: 4.0.4
source-map: 0.7.4
yargs: 18.0.0
optionalDependencies:
- rolldown: 1.0.0-rc.17
+ rolldown: 1.0.2
roughjs@4.6.6:
dependencies:
@@ -12341,13 +12307,18 @@ snapshots:
tinycolor2@1.6.0: {}
- tinyexec@1.1.2: {}
+ tinyexec@1.2.4: {}
tinyglobby@0.2.16:
dependencies:
fdir: 6.5.0(picomatch@4.0.4)
picomatch: 4.0.4
+ tinyglobby@0.2.17:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
+
tinyrainbow@2.0.0: {}
tinyrainbow@3.1.0: {}
@@ -12621,7 +12592,7 @@ snapshots:
d3-time: 3.1.0
d3-timer: 3.0.1
- vite-plugin-checker@0.13.0(@biomejs/biome@2.4.10)(optionator@0.9.3)(typescript@6.0.2)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)):
+ vite-plugin-checker@0.13.0(@biomejs/biome@2.4.10)(optionator@0.9.3)(typescript@6.0.2)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)):
dependencies:
'@babel/code-frame': 7.29.0
chokidar: 4.0.3
@@ -12631,20 +12602,20 @@ snapshots:
proper-lockfile: 4.1.2
tiny-invariant: 1.3.3
tinyglobby: 0.2.16
- vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
vscode-uri: 3.1.0
optionalDependencies:
'@biomejs/biome': 2.4.10
optionator: 0.9.3
typescript: 6.0.2
- vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3):
+ vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3):
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.4
postcss: 8.5.15
- rolldown: 1.0.0-rc.17
- tinyglobby: 0.2.16
+ rolldown: 1.0.2
+ tinyglobby: 0.2.17
optionalDependencies:
'@types/node': 20.19.41
esbuild: 0.25.12
@@ -12652,15 +12623,15 @@ snapshots:
jiti: 1.21.7
yaml: 2.8.3
- vitest@4.1.5(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)):
+ vitest@4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(jsdom@27.2.0)(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)):
dependencies:
- '@vitest/expect': 4.1.5
- '@vitest/mocker': 4.1.5(msw@2.4.8(typescript@6.0.2))(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
- '@vitest/pretty-format': 4.1.5
- '@vitest/runner': 4.1.5
- '@vitest/snapshot': 4.1.5
- '@vitest/spy': 4.1.5
- '@vitest/utils': 4.1.5
+ '@vitest/expect': 4.1.7
+ '@vitest/mocker': 4.1.7(msw@2.4.8(typescript@6.0.2))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))
+ '@vitest/pretty-format': 4.1.7
+ '@vitest/runner': 4.1.7
+ '@vitest/snapshot': 4.1.7
+ '@vitest/spy': 4.1.7
+ '@vitest/utils': 4.1.7
es-module-lexer: 2.1.0
expect-type: 1.3.0
magic-string: 0.30.21
@@ -12669,14 +12640,14 @@ snapshots:
picomatch: 4.0.4
std-env: 4.1.0
tinybench: 2.9.0
- tinyexec: 1.1.2
- tinyglobby: 0.2.16
+ tinyexec: 1.2.4
+ tinyglobby: 0.2.17
tinyrainbow: 3.1.0
- vite: 8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
+ vite: 8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 20.19.41
- '@vitest/browser-playwright': 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.10(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.5)
+ '@vitest/browser-playwright': 4.1.7(msw@2.4.8(typescript@6.0.2))(playwright@1.55.1)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.3))(vitest@4.1.7)
jsdom: 27.2.0
transitivePeerDependencies:
- msw
From d72dc5bb23419aa16a183594c15eea5fa950518c Mon Sep 17 00:00:00 2001
From: Susana Ferreira
Date: Tue, 2 Jun 2026 10:14:31 +0100
Subject: [PATCH 021/112] feat(aibridge): add interception_id to request log
context (#25926)
Attach `interception_id` to the request context with `slog.With`, the
same pattern already used for `request_id`, so every log emitted with
that context carries it automatically.
Remove the now-redundant explicit `interception_id` fields from the
interception logger and the recorder warnings to avoid duplicate fields
on those lines.
Related to https://github.com/coder/internal/issues/1447
Related to
https://linear.app/codercom/issue/AIGOV-198/aibridge-key-failover-observability
---
aibridge/bridge.go | 4 +++-
aibridge/recorder/recorder.go | 12 ++++++------
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/aibridge/bridge.go b/aibridge/bridge.go
index daf103fb1015e..65d822069bdc8 100644
--- a/aibridge/bridge.go
+++ b/aibridge/bridge.go
@@ -236,6 +236,9 @@ func newInterceptionProcessor(p provider.Provider, cbs *circuitbreaker.ProviderC
traceAttrs := interceptor.TraceAttributes(r)
span.SetAttributes(traceAttrs...)
ctx = tracing.WithInterceptionAttributesInContext(ctx, traceAttrs)
+ // Attach the interception ID to the context so every log line
+ // emitted with this context can be correlated to the interception.
+ ctx = slog.With(ctx, slog.F("interception_id", interceptor.ID()))
r = r.WithContext(ctx)
// Record usage in the background to not block request flow.
@@ -272,7 +275,6 @@ func newInterceptionProcessor(p provider.Provider, cbs *circuitbreaker.ProviderC
log := logger.With(
slog.F("route", route),
slog.F("provider", p.Name()),
- slog.F("interception_id", interceptor.ID()),
slog.F("user_agent", r.UserAgent()),
slog.F("streaming", interceptor.Streaming()),
slog.F("credential_kind", string(cred.Kind)),
diff --git a/aibridge/recorder/recorder.go b/aibridge/recorder/recorder.go
index 26a9f24b5d0b8..3f2435db35ef4 100644
--- a/aibridge/recorder/recorder.go
+++ b/aibridge/recorder/recorder.go
@@ -40,7 +40,7 @@ func (r *WrappedRecorder) RecordInterception(ctx context.Context, req *Intercept
return nil
}
- r.logger.Warn(ctx, "failed to record interception", slog.Error(err), slog.F("interception_id", req.ID))
+ r.logger.Warn(ctx, "failed to record interception", slog.Error(err))
return err
}
@@ -58,7 +58,7 @@ func (r *WrappedRecorder) RecordInterceptionEnded(ctx context.Context, req *Inte
return nil
}
- r.logger.Warn(ctx, "failed to record that interception ended", slog.Error(err), slog.F("interception_id", req.ID))
+ r.logger.Warn(ctx, "failed to record that interception ended", slog.Error(err))
return err
}
@@ -76,7 +76,7 @@ func (r *WrappedRecorder) RecordPromptUsage(ctx context.Context, req *PromptUsag
return nil
}
- r.logger.Warn(ctx, "failed to record prompt usage", slog.Error(err), slog.F("interception_id", req.InterceptionID))
+ r.logger.Warn(ctx, "failed to record prompt usage", slog.Error(err))
return err
}
@@ -94,7 +94,7 @@ func (r *WrappedRecorder) RecordTokenUsage(ctx context.Context, req *TokenUsageR
return nil
}
- r.logger.Warn(ctx, "failed to record token usage", slog.Error(err), slog.F("interception_id", req.InterceptionID))
+ r.logger.Warn(ctx, "failed to record token usage", slog.Error(err))
return err
}
@@ -112,7 +112,7 @@ func (r *WrappedRecorder) RecordToolUsage(ctx context.Context, req *ToolUsageRec
return nil
}
- r.logger.Warn(ctx, "failed to record tool usage", slog.Error(err), slog.F("interception_id", req.InterceptionID))
+ r.logger.Warn(ctx, "failed to record tool usage", slog.Error(err))
return err
}
@@ -130,7 +130,7 @@ func (r *WrappedRecorder) RecordModelThought(ctx context.Context, req *ModelThou
return nil
}
- r.logger.Warn(ctx, "failed to record model thought", slog.Error(err), slog.F("interception_id", req.InterceptionID))
+ r.logger.Warn(ctx, "failed to record model thought", slog.Error(err))
return err
}
From 2269cec830cf03141778f284afe76015fa98fc30 Mon Sep 17 00:00:00 2001
From: "blinkagent[bot]" <237617714+blinkagent[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 06:15:51 -0400
Subject: [PATCH 022/112] feat(site): populate Model name from Known Model
display name (#25862)
---
.../applyKnownModelDefaults.test.ts | 29 +++++++++++++++++++
.../knownModels/applyKnownModelDefaults.ts | 9 ++++++
2 files changed, 38 insertions(+)
diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/knownModels/applyKnownModelDefaults.test.ts b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/knownModels/applyKnownModelDefaults.test.ts
index d537aa726c440..4dbc1cc39b3ec 100644
--- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/knownModels/applyKnownModelDefaults.test.ts
+++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/knownModels/applyKnownModelDefaults.test.ts
@@ -106,6 +106,35 @@ describe("applyKnownModelDefaults", () => {
expect(result.appliedFields).toEqual([]);
});
+ it("populates display name with the Known Model display name", () => {
+ const result = applyDefaults({
+ values: buildInitialModelFormValues(),
+ initialValues: buildInitialModelFormValues(),
+ provider: "anthropic",
+ knownModel: requireKnownModel("anthropic", "claude-opus-4-8"),
+ });
+
+ expect(result.values.displayName).toBe("Claude Opus 4.8");
+ expect(result.appliedFields).toContain("displayName");
+ });
+
+ it("skips display name when current value differs from initial value", () => {
+ const values = setPath(
+ buildInitialModelFormValues(),
+ "displayName",
+ "My Custom Name",
+ );
+ const result = applyDefaults({
+ values,
+ initialValues: buildInitialModelFormValues(),
+ provider: "anthropic",
+ knownModel: requireKnownModel("anthropic", "claude-opus-4-8"),
+ });
+
+ expect(result.values.displayName).toBe("My Custom Name");
+ expect(result.appliedFields).not.toContain("displayName");
+ });
+
it("populates context limit when current value still equals initial value", () => {
const result = applyDefaults({
values: buildInitialModelFormValues(),
diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/knownModels/applyKnownModelDefaults.ts b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/knownModels/applyKnownModelDefaults.ts
index b490073fdc32c..550c9a0f5ed39 100644
--- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/knownModels/applyKnownModelDefaults.ts
+++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/knownModels/applyKnownModelDefaults.ts
@@ -83,6 +83,15 @@ export const applyKnownModelDefaults = ({
const nextValues = structuredClone(values);
const appliedFields: string[] = [];
+ maybeApplyDefault({
+ appliedFields,
+ initialValues,
+ nextValues,
+ path: "displayName",
+ value: knownModel.displayName,
+ values,
+ });
+
if (knownModel.contextLimit !== undefined) {
maybeApplyDefault({
appliedFields,
From dd22086734629ecbce1c3764ba7b70e45df84131 Mon Sep 17 00:00:00 2001
From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com>
Date: Tue, 2 Jun 2026 12:19:06 +0200
Subject: [PATCH 023/112] fix(coderd/x/chatd): preserve chat API key after
compaction (#25930)
> Mux updated this PR on behalf of Mike.
AI Gateway chat retries after context compaction could lose active turn
API key routing metadata because the prompt query keeps the compressed
model-only summary but omits the original visible user turn.
Persist the active API key ID onto compaction summaries explicitly.
Model construction now uses one active-turn lookup helper for visible
user turns and compressed summary boundaries, so prompt model
construction can recover the key when no later visible user turn exists.
Added unit and DB-backed coverage for the compacted prompt path.
---
coderd/x/chatd/chatd.go | 34 ++---
coderd/x/chatd/chatd_internal_test.go | 87 ++++++++-----
coderd/x/chatd/model_routing_internal_test.go | 118 ++++++++++++++++--
3 files changed, 184 insertions(+), 55 deletions(-)
diff --git a/coderd/x/chatd/chatd.go b/coderd/x/chatd/chatd.go
index 013567e3e0aa5..5a5ba7fb60a95 100644
--- a/coderd/x/chatd/chatd.go
+++ b/coderd/x/chatd/chatd.go
@@ -6468,22 +6468,14 @@ type runChatResult struct {
HistoryTipMessageID int64
}
-func contextWithActiveTurnAPIKeyID(ctx context.Context, messages []database.ChatMessage) context.Context {
- apiKeyID, ok := activeTurnAPIKeyIDFromMessages(messages)
- if !ok {
- return ctx
- }
- return aibridge.WithDelegatedAPIKeyID(ctx, apiKeyID)
-}
-
func activeTurnAPIKeyIDFromMessages(messages []database.ChatMessage) (string, bool) {
for i := len(messages) - 1; i >= 0; i-- {
message := messages[i]
if message.Role != database.ChatMessageRoleUser {
continue
}
- if message.Visibility != database.ChatMessageVisibilityBoth &&
- message.Visibility != database.ChatMessageVisibilityUser {
+ if !isUserVisibleChatMessage(message) &&
+ !(message.Visibility == database.ChatMessageVisibilityModel && message.Compressed) {
continue
}
if !message.APIKeyID.Valid || message.APIKeyID.String == "" {
@@ -6494,6 +6486,11 @@ func activeTurnAPIKeyIDFromMessages(messages []database.ChatMessage) (string, bo
return "", false
}
+func isUserVisibleChatMessage(message database.ChatMessage) bool {
+ return message.Visibility == database.ChatMessageVisibilityBoth ||
+ message.Visibility == database.ChatMessageVisibilityUser
+}
+
func allToolNames(allTools []fantasy.AgentTool) []string {
toolNames := make([]string, 0, len(allTools))
for _, tool := range allTools {
@@ -7124,7 +7121,9 @@ func (p *Server) runChat(
return result, xerrors.Errorf("get chat messages: %w", err)
}
modelOpts := modelBuildOptionsFromMessages(messages)
- ctx = contextWithActiveTurnAPIKeyID(ctx, messages)
+ if modelOpts.ActiveAPIKeyID != "" {
+ ctx = aibridge.WithDelegatedAPIKeyID(ctx, modelOpts.ActiveAPIKeyID)
+ }
// Load MCP server configs and user tokens in parallel with model
// resolution. These queries have no dependencies on each other and all
@@ -7831,6 +7830,7 @@ func (p *Server) runChat(
persistCtx,
chat.ID,
modelConfig.ID,
+ modelOpts.ActiveAPIKeyID,
compactionToolCallID,
result,
); err != nil {
@@ -8460,12 +8460,14 @@ func buildProviderTools(options *codersdk.ChatModelProviderOptions) []chatloop.P
return tools
}
-// persistChatContextSummary persists a chat context summary to the database.
-// This is invoked via the chat loop's compaction callback.
+// persistChatContextSummary is called from the chat loop's compaction
+// callback. activeAPIKeyID is stamped onto the summary user message. When
+// empty, it falls back to the delegated key in ctx.
func (p *Server) persistChatContextSummary(
ctx context.Context,
chatID uuid.UUID,
modelConfigID uuid.UUID,
+ activeAPIKeyID string,
toolCallID string,
result chatloop.CompactionResult,
) error {
@@ -8514,6 +8516,11 @@ func (p *Server) persistChatContextSummary(
return xerrors.Errorf("encode summary tool result: %w", err)
}
+ summaryAPIKeyID := activeAPIKeyID
+ if summaryAPIKeyID == "" {
+ summaryAPIKeyID, _ = aibridge.DelegatedAPIKeyIDFromContext(ctx)
+ }
+
var insertedMessages []database.ChatMessage
txErr := p.db.InTx(func(tx database.Store) error {
@@ -8522,7 +8529,6 @@ func (p *Server) persistChatContextSummary(
}
// Hidden summary user message (not published to subscribers).
- summaryAPIKeyID, _ := aibridge.DelegatedAPIKeyIDFromContext(ctx)
summaryUserMsg := newUserChatMessage(
summaryAPIKeyID,
systemContent,
diff --git a/coderd/x/chatd/chatd_internal_test.go b/coderd/x/chatd/chatd_internal_test.go
index 69aebbfe30ef6..965b6b474e9f7 100644
--- a/coderd/x/chatd/chatd_internal_test.go
+++ b/coderd/x/chatd/chatd_internal_test.go
@@ -6651,42 +6651,63 @@ func TestPersistChatContextSummarySetsAPIKeyID(t *testing.T) {
UserID: user.ID,
})
- ctx = aibridge.WithDelegatedAPIKeyID(ctx, apiKey.ID)
-
server := &Server{db: db}
+ persistAndAssertSummaryKey := func(
+ summaryCtx context.Context,
+ chatID uuid.UUID,
+ activeAPIKeyID string,
+ wantAPIKeyID string,
+ toolCallID string,
+ ) {
+ t.Helper()
+
+ err := server.persistChatContextSummary(
+ summaryCtx,
+ chatID,
+ modelConfig.ID,
+ activeAPIKeyID,
+ toolCallID,
+ chatloop.CompactionResult{
+ SystemSummary: "summarized context",
+ SummaryReport: "context was summarized",
+ ThresholdPercent: 70,
+ UsagePercent: 85.0,
+ ContextTokens: 8500,
+ ContextLimit: 10000,
+ },
+ )
+ require.NoError(t, err)
- err := server.persistChatContextSummary(
- ctx,
- chat.ID,
- modelConfig.ID,
- "tool-call-id-1",
- chatloop.CompactionResult{
- SystemSummary: "summarized context",
- SummaryReport: "context was summarized",
- ThresholdPercent: 70,
- UsagePercent: 85.0,
- ContextTokens: 8500,
- ContextLimit: 10000,
- },
- )
- require.NoError(t, err)
-
- msgs, err := db.GetChatMessagesForPromptByChatID(ctx, chat.ID)
- require.NoError(t, err)
+ msgs, err := db.GetChatMessagesForPromptByChatID(ctx, chatID)
+ require.NoError(t, err)
- // GetChatMessagesForPromptByChatID uses a compaction boundary CTE
- // that selects compressed=true, visibility='model'. Only the user
- // summary qualifies; the assistant (visibility=user) and tool
- // result (visibility=both) are excluded by the CTE filter.
- require.NotEmpty(t, msgs)
-
- var foundUserSummary bool
- for _, msg := range msgs {
- if msg.Role == database.ChatMessageRoleUser {
- foundUserSummary = true
- require.True(t, msg.APIKeyID.Valid, "summary user message must have APIKeyID set")
- require.Equal(t, apiKey.ID, msg.APIKeyID.String, "summary user message APIKeyID must match")
+ // GetChatMessagesForPromptByChatID uses a compaction boundary CTE
+ // that selects compressed=true, visibility='model'. Only the user
+ // summary qualifies; the assistant (visibility=user) and tool
+ // result (visibility=both) are excluded by the CTE filter.
+ require.NotEmpty(t, msgs)
+
+ var foundUserSummary bool
+ for _, msg := range msgs {
+ if msg.Role == database.ChatMessageRoleUser {
+ foundUserSummary = true
+ require.True(t, msg.APIKeyID.Valid, "summary user message must have APIKeyID set")
+ require.Equal(t, wantAPIKeyID, msg.APIKeyID.String, "summary user message APIKeyID must match")
+ }
}
+ require.True(t, foundUserSummary, "expected to find compressed user summary message")
}
- require.True(t, foundUserSummary, "expected to find compressed user summary message")
+
+ persistAndAssertSummaryKey(ctx, chat.ID, apiKey.ID, apiKey.ID, "tool-call-id-1")
+
+ fallbackChat := dbgen.Chat(t, db, database.Chat{
+ OwnerID: user.ID,
+ OrganizationID: org.ID,
+ LastModelConfigID: modelConfig.ID,
+ })
+ fallbackKey, _ := dbgen.APIKey(t, db, database.APIKey{
+ UserID: user.ID,
+ })
+ fallbackCtx := aibridge.WithDelegatedAPIKeyID(ctx, fallbackKey.ID)
+ persistAndAssertSummaryKey(fallbackCtx, fallbackChat.ID, "", fallbackKey.ID, "tool-call-id-2")
}
diff --git a/coderd/x/chatd/model_routing_internal_test.go b/coderd/x/chatd/model_routing_internal_test.go
index 0d2f31720431f..70e07978832db 100644
--- a/coderd/x/chatd/model_routing_internal_test.go
+++ b/coderd/x/chatd/model_routing_internal_test.go
@@ -405,7 +405,7 @@ func TestActiveTurnAPIKeyIDFromMessages(t *testing.T) {
},
},
{
- name: "SkipsModelOnlyUserMessages",
+ name: "SkipsUncompressedModelOnlyUserMessages",
messages: []database.ChatMessage{
{ID: 1, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityBoth, APIKeyID: sqlNullString(oldKeyID)},
{ID: 2, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityModel, APIKeyID: sqlNullString(currentKeyID)},
@@ -413,6 +413,54 @@ func TestActiveTurnAPIKeyIDFromMessages(t *testing.T) {
wantKey: oldKeyID,
wantOK: true,
},
+ {
+ name: "CompressedSummaryFallback",
+ messages: []database.ChatMessage{
+ {ID: 1, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityModel, Compressed: true, APIKeyID: sqlNullString(currentKeyID)},
+ {ID: 2, Role: database.ChatMessageRoleAssistant, Visibility: database.ChatMessageVisibilityBoth},
+ },
+ wantKey: currentKeyID,
+ wantOK: true,
+ },
+ {
+ name: "LatestCompressedSummaryWins",
+ messages: []database.ChatMessage{
+ {ID: 1, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityModel, Compressed: true, APIKeyID: sqlNullString(oldKeyID)},
+ {ID: 2, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityModel, Compressed: true, APIKeyID: sqlNullString(currentKeyID)},
+ {ID: 3, Role: database.ChatMessageRoleAssistant, Visibility: database.ChatMessageVisibilityBoth},
+ },
+ wantKey: currentKeyID,
+ wantOK: true,
+ },
+ {
+ name: "VisibleUserWinsOverCompressedSummary",
+ messages: []database.ChatMessage{
+ {ID: 1, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityModel, Compressed: true, APIKeyID: sqlNullString(oldKeyID)},
+ {ID: 2, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityBoth, APIKeyID: sqlNullString(currentKeyID)},
+ },
+ wantKey: currentKeyID,
+ wantOK: true,
+ },
+ {
+ name: "MissingVisibleUserKeyDoesNotFallBackToCompressedSummary",
+ messages: []database.ChatMessage{
+ {ID: 1, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityModel, Compressed: true, APIKeyID: sqlNullString(oldKeyID)},
+ {ID: 2, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityBoth},
+ },
+ },
+ {
+ name: "UncompressedModelOnlyUserIgnored",
+ messages: []database.ChatMessage{
+ {ID: 1, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityModel, APIKeyID: sqlNullString(currentKeyID)},
+ },
+ },
+ {
+ name: "CompressedSummaryMissingKeyDoesNotFallBack",
+ messages: []database.ChatMessage{
+ {ID: 1, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityBoth, APIKeyID: sqlNullString(oldKeyID)},
+ {ID: 2, Role: database.ChatMessageRoleUser, Visibility: database.ChatMessageVisibilityModel, Compressed: true},
+ },
+ },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
@@ -421,15 +469,11 @@ func TestActiveTurnAPIKeyIDFromMessages(t *testing.T) {
gotKey, gotOK := activeTurnAPIKeyIDFromMessages(tt.messages)
require.Equal(t, tt.wantOK, gotOK)
require.Equal(t, tt.wantKey, gotKey)
- ctx := contextWithActiveTurnAPIKeyID(t.Context(), tt.messages)
- ctxKey, ctxOK := aibridge.DelegatedAPIKeyIDFromContext(ctx)
- require.Equal(t, tt.wantOK, ctxOK)
- require.Equal(t, tt.wantKey, ctxKey)
})
}
}
-func TestActiveTurnContextUsesPromptMessages(t *testing.T) {
+func TestPromptMessagesForVisibleUserPreserveActiveAPIKeyID(t *testing.T) {
t.Parallel()
db, _ := dbtestutil.NewDB(t)
@@ -477,12 +521,70 @@ func TestActiveTurnContextUsesPromptMessages(t *testing.T) {
messages, err := db.GetChatMessagesForPromptByChatID(ctx, chat.ID)
require.NoError(t, err)
- ctx = contextWithActiveTurnAPIKeyID(ctx, messages)
- gotKey, ok := aibridge.DelegatedAPIKeyIDFromContext(ctx)
+ gotKey, ok := activeTurnAPIKeyIDFromMessages(messages)
require.True(t, ok)
require.Equal(t, currentKey.ID, gotKey)
}
+func TestPromptMessagesForCompactedChatPreserveActiveAPIKeyID(t *testing.T) {
+ t.Parallel()
+
+ db, _ := dbtestutil.NewDB(t)
+ ctx := t.Context()
+ user := dbgen.User(t, db, database.User{})
+ org := dbgen.Organization(t, db, database.Organization{})
+ model := dbgen.ChatModelConfig(t, db, database.ChatModelConfig{})
+ chat := dbgen.Chat(t, db, database.Chat{OrganizationID: org.ID, OwnerID: user.ID, LastModelConfigID: model.ID})
+ key, _ := dbgen.APIKey(t, db, database.APIKey{UserID: user.ID})
+
+ visibleUser := dbgen.ChatMessage(t, db, database.ChatMessage{
+ ChatID: chat.ID,
+ CreatedBy: uuid.NullUUID{UUID: user.ID, Valid: true},
+ ModelConfigID: uuid.NullUUID{UUID: model.ID, Valid: true},
+ Role: database.ChatMessageRoleUser,
+ Visibility: database.ChatMessageVisibilityBoth,
+ APIKeyID: sqlNullString(key.ID),
+ })
+ dbgen.ChatMessage(t, db, database.ChatMessage{
+ ChatID: chat.ID,
+ ModelConfigID: uuid.NullUUID{UUID: model.ID, Valid: true},
+ Role: database.ChatMessageRoleAssistant,
+ Visibility: database.ChatMessageVisibilityBoth,
+ })
+ compressedSummary := dbgen.ChatMessage(t, db, database.ChatMessage{
+ ChatID: chat.ID,
+ ModelConfigID: uuid.NullUUID{UUID: model.ID, Valid: true},
+ Role: database.ChatMessageRoleUser,
+ Visibility: database.ChatMessageVisibilityModel,
+ Compressed: true,
+ APIKeyID: sqlNullString(key.ID),
+ })
+ afterSummary := dbgen.ChatMessage(t, db, database.ChatMessage{
+ ChatID: chat.ID,
+ ModelConfigID: uuid.NullUUID{UUID: model.ID, Valid: true},
+ Role: database.ChatMessageRoleAssistant,
+ Visibility: database.ChatMessageVisibilityBoth,
+ })
+
+ messages, err := db.GetChatMessagesForPromptByChatID(ctx, chat.ID)
+ require.NoError(t, err)
+
+ ids := make(map[int64]struct{}, len(messages))
+ for _, message := range messages {
+ ids[message.ID] = struct{}{}
+ }
+ _, hasVisibleUser := ids[visibleUser.ID]
+ require.False(t, hasVisibleUser)
+ _, hasSummary := ids[compressedSummary.ID]
+ require.True(t, hasSummary)
+ _, hasAfterSummary := ids[afterSummary.ID]
+ require.True(t, hasAfterSummary)
+
+ gotKey, ok := activeTurnAPIKeyIDFromMessages(messages)
+ require.True(t, ok)
+ require.Equal(t, key.ID, gotKey)
+}
+
func sqlNullString(value string) sql.NullString {
return sql.NullString{String: value, Valid: value != ""}
}
From 4d3bfa5fab37327c8169de5612068019f4791bda Mon Sep 17 00:00:00 2001
From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com>
Date: Tue, 2 Jun 2026 12:44:45 +0200
Subject: [PATCH 024/112] fix(coderd/x/chatd): stabilize advisor stream test
(#25781)
`TestAdvisorHappyPath_RootChat` could subscribe after the active test
server had already processed the chat and published transient advisor
deltas, leaving the live delta collector empty.
Use a passive chatd test server until the live subscriber and collector
are registered, then start processing and wait for the expected advisor
deltas before canceling the stream.
Closes coder/internal#1548
Generated by Coder Agents.
Implementation notes
The failing assertion covered stream-only advisor `ResultDelta` events.
`CreateChat` signals the processor, so an already-started server can
publish those deltas before `Subscribe` registers its local stream
subscriber. The test now creates the chat on a passive server,
subscribes, starts the collector, then calls `Start()`.
---
coderd/x/chatd/chatd_test.go | 29 ++++++++++++-----------------
1 file changed, 12 insertions(+), 17 deletions(-)
diff --git a/coderd/x/chatd/chatd_test.go b/coderd/x/chatd/chatd_test.go
index 9e67c1023015b..353769dd02376 100644
--- a/coderd/x/chatd/chatd_test.go
+++ b/coderd/x/chatd/chatd_test.go
@@ -26,6 +26,7 @@ import (
mcpserver "github.com/mark3labs/mcp-go/server"
"github.com/prometheus/client_golang/prometheus"
"github.com/sqlc-dev/pqtype"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"golang.org/x/xerrors"
@@ -9914,7 +9915,7 @@ func TestAdvisorHappyPath_RootChat(t *testing.T) {
MaxUsesPerRun: 3,
MaxOutputTokens: 16384,
})
- server := newActiveTestServer(t, db, ps)
+ server := newTestServer(t, db, ps, uuid.New())
chat, err := server.CreateChat(ctx, chatd.CreateOptions{
OrganizationID: org.ID,
@@ -9927,13 +9928,7 @@ func TestAdvisorHappyPath_RootChat(t *testing.T) {
})
require.NoError(t, err)
- // Subscribe before the worker commits any durable messages so we
- // observe the advisor tool-result deltas live. Buffered parts are
- // claimed by their committed durable message ID at publishMessage
- // time and dropped from snapshots of late-connecting subscribers, so
- // a post-completion Subscribe() would no longer see streaming
- // deltas. Collecting events from the live channel covers the
- // streaming UX contract this test exists to verify.
+ // Advisor deltas are transient; a late subscriber misses them.
_, liveEvents, cancelLive, ok := server.Subscribe(ctx, chat.ID, nil, 0)
require.True(t, ok)
var (
@@ -9969,6 +9964,8 @@ func TestAdvisorHappyPath_RootChat(t *testing.T) {
}
}()
+ server.Start()
+
require.Eventually(t, func() bool {
got, getErr := db.GetChatByID(ctx, chat.ID)
if getErr != nil {
@@ -10023,17 +10020,15 @@ func TestAdvisorHappyPath_RootChat(t *testing.T) {
require.True(t, parentSawAdvisorResult,
"parent must see the advisor reply in its continuation call")
- // Stop the live collector and assert it captured the streaming
- // advisor deltas during processing. Late subscribers no longer
- // see committed parts because publishMessage claims them out of
- // new snapshots, so the assertion must use the live collector.
+ require.EventuallyWithT(t, func(c *assert.CollectT) {
+ livePartsMu.Lock()
+ defer livePartsMu.Unlock()
+ assert.Equal(c, advisorDeltas, liveAdvisorDeltas,
+ "advisor nested text deltas must stream into the parent tool card")
+ }, testutil.WaitLong, testutil.IntervalFast)
+
cancelLive()
<-liveCollectorDone
- livePartsMu.Lock()
- collectedAdvisorDeltas := append([]string(nil), liveAdvisorDeltas...)
- livePartsMu.Unlock()
- require.Equal(t, advisorDeltas, collectedAdvisorDeltas,
- "advisor nested text deltas must stream into the parent tool card")
persisted, err := db.GetChatMessagesByChatID(ctx, database.GetChatMessagesByChatIDParams{
ChatID: chat.ID,
From f6a4ed309f24ec500110dbd29608ed128afd01e2 Mon Sep 17 00:00:00 2001
From: Thomas Kosiewski
Date: Tue, 2 Jun 2026 12:46:40 +0200
Subject: [PATCH 025/112] ci: fix Windows runner PATH casing for mise, not in
cli (#25972)
Co-authored-by: Claude Opus 4.8 (1M context)
---
.github/actions/setup-mise/action.yml | 31 +++++++++-----------
cli/agent_test.go | 4 +--
cli/configssh_internal_test.go | 11 ++-----
cli/configssh_windows.go | 10 +------
cli/root.go | 41 ++-------------------------
cli/root_test.go | 6 ++--
enterprise/cli/proxyserver_test.go | 2 +-
7 files changed, 22 insertions(+), 83 deletions(-)
diff --git a/.github/actions/setup-mise/action.yml b/.github/actions/setup-mise/action.yml
index 39aa9ab27da1e..751124ed42ee3 100644
--- a/.github/actions/setup-mise/action.yml
+++ b/.github/actions/setup-mise/action.yml
@@ -166,23 +166,18 @@ runs:
mise_dir: ${{ steps.mise-data-dir.outputs.path }}
install_args: ${{ steps.cache-key.outputs.install-args }}
cache: "false"
+ # Do not export mise's resolved env (every tool install dir) into
+ # GITHUB_ENV. Tools resolve through the shims dir on GITHUB_PATH, so
+ # the export only bloats PATH. On Windows the mise go shim re-prepends
+ # those dirs at invocation, and the resulting PATH crosses cmd.exe's
+ # ~8191 character limit, which makes cmd.exe drop PATH entirely and
+ # fail to resolve native executables in subprocesses spawned by tests.
+ env: false
- - name: Ensure Git usr/bin is in PATH (Windows)
+ - name: Add Git usr/bin to PATH (Windows)
if: runner.os == 'Windows'
- shell: pwsh
- # jdx/mise-action exports "Path" via GITHUB_ENV which may
- # collide with bash's "PATH". Ensure Git usr/bin is present
- # and remove any duplicate Path/PATH entries from GITHUB_ENV
- # by writing both forms.
- run: | # zizmor: ignore[github-env]
- $gitdir = "C:\Program Files\Git\usr\bin"
- $current = $env:Path
- if ($current -notlike "*$gitdir*") {
- $current = "$gitdir;$current"
- }
- # Write both Path and PATH to GITHUB_ENV so that both
- # cmd.exe (uses Path) and bash/Go (uses PATH) see the
- # same value including Git usr/bin.
- "Path=$current" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
- "PATH=$current" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
-
+ shell: bash
+ # GITHUB_PATH is the casing-safe channel and keeps the entry short.
+ # cmd.exe subprocesses spawned by Go tests need MSYS coreutils such as
+ # printf, which live here.
+ run: echo "C:\Program Files\Git\usr\bin" >> "$GITHUB_PATH"
diff --git a/cli/agent_test.go b/cli/agent_test.go
index 9ea7afdcb168f..60e8f6864271a 100644
--- a/cli/agent_test.go
+++ b/cli/agent_test.go
@@ -146,10 +146,8 @@ func TestWorkspaceAgent(t *testing.T) {
}).WithAgent().Do()
coderURLEnv := "$CODER_URL"
- headerCmd := "printf X-Process-Testing=very-wow-" + coderURLEnv + "'\\r\\n'X-Process-Testing2=more-wow"
if runtime.GOOS == "windows" {
coderURLEnv = "%CODER_URL%"
- headerCmd = "echo X-Process-Testing=very-wow-" + coderURLEnv + "& echo X-Process-Testing2=more-wow"
}
logDir := t.TempDir()
@@ -161,7 +159,7 @@ func TestWorkspaceAgent(t *testing.T) {
"--log-dir", logDir,
"--agent-header", "X-Testing=agent",
"--agent-header", "Cool-Header=Ethan was Here!",
- "--agent-header-command", headerCmd,
+ "--agent-header-command", "printf X-Process-Testing=very-wow-"+coderURLEnv+"'\\r\\n'X-Process-Testing2=more-wow",
"--socket-path", testutil.AgentSocketPath(t),
)
clitest.Start(t, agentInv)
diff --git a/cli/configssh_internal_test.go b/cli/configssh_internal_test.go
index 59b57439af12a..0ea2ae6ea5f22 100644
--- a/cli/configssh_internal_test.go
+++ b/cli/configssh_internal_test.go
@@ -229,15 +229,8 @@ func Test_sshConfigMatchExecEscape(t *testing.T) {
// OpenSSH processes %% escape sequences into %
escaped = strings.ReplaceAll(escaped, "%%", "%")
- c := exec.Command(cmd, arg, escaped) //nolint:gosec
- if runtime.GOOS == "windows" {
- // Deduplicate Path/PATH env vars so cmd.exe
- // subprocesses (like powershell.exe used for
- // paths with spaces) resolve correctly.
- c.Env = appendAndDedupEnv(os.Environ())
- }
- b, err := c.CombinedOutput()
- require.NoError(t, err, "command output: %s", string(b))
+ b, err := exec.Command(cmd, arg, escaped).CombinedOutput() //nolint:gosec
+ require.NoError(t, err)
got := strings.TrimSpace(string(b))
require.Equal(t, "yay", got)
})
diff --git a/cli/configssh_windows.go b/cli/configssh_windows.go
index 53473c7aa4cba..db81bce1ffd6e 100644
--- a/cli/configssh_windows.go
+++ b/cli/configssh_windows.go
@@ -4,8 +4,6 @@ package cli
import (
"fmt"
- "os"
- "path/filepath"
"strings"
"golang.org/x/xerrors"
@@ -52,13 +50,7 @@ func sshConfigMatchExecEscape(path string) (string, error) {
if strings.ContainsAny(path, " ") {
// c.f. function comment for how this works.
- // Use absolute paths for powershell.exe and cmd.exe
- // to avoid PATH resolution issues when both Path and
- // PATH (MSYS-translated) exist in the environment.
- sysRoot := os.Getenv("SYSTEMROOT")
- pwsh := filepath.Join(sysRoot, "System32", "WindowsPowerShell", "v1.0", "powershell.exe")
- cmd := filepath.Join(sysRoot, "System32", "cmd.exe")
- path = fmt.Sprintf("for /f %%%%a in ('%s -Command [char]34') do @%s /c %%%%a%s%%%%a", pwsh, cmd, path) //nolint:gocritic // We don't want %q here.
+ path = fmt.Sprintf("for /f %%%%a in ('powershell.exe -Command [char]34') do @cmd.exe /c %%%%a%s%%%%a", path) //nolint:gocritic // We don't want %q here.
}
return path, nil
}
diff --git a/cli/root.go b/cli/root.go
index 2e4aa7dd17f06..a40ac7c3c23a4 100644
--- a/cli/root.go
+++ b/cli/root.go
@@ -1701,44 +1701,7 @@ func (r roundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
return r(req)
}
-// appendAndDedupEnv appends extra environment variables and
-// deduplicates entries with the same key (case-insensitive on
-// Windows). For the PATH variable specifically, it prefers the
-// value that contains native Windows paths (with backslashes)
-// over MSYS-translated paths (with forward slashes). For all
-// other variables, the last value wins.
-func appendAndDedupEnv(env []string, extra ...string) []string {
- env = append(env, extra...)
- if runtime.GOOS != "windows" {
- return env
- }
- seen := make(map[string]int, len(env))
- result := make([]string, 0, len(env))
- for _, e := range env {
- key, val, ok := strings.Cut(e, "=")
- if !ok {
- result = append(result, e)
- continue
- }
- upper := strings.ToUpper(key)
- if idx, exists := seen[upper]; exists {
- if upper == "PATH" {
- // Prefer the value with native Windows paths.
- existingVal := result[idx][len(key)+1:]
- if strings.Contains(existingVal, "\\") && !strings.Contains(val, "\\") {
- continue
- }
- }
- result[idx] = e
- continue
- }
- seen[upper] = len(result)
- result = append(result, e)
- }
- return result
-}
-
-// headerTransport creates a new transport that executes `--header-command`
+// HeaderTransport creates a new transport that executes `--header-command`
// if it is set to add headers for all outbound requests.
func headerTransport(ctx context.Context, serverURL *url.URL, header []string, headerCommand string) (*codersdk.HeaderTransport, error) {
transport := &codersdk.HeaderTransport{
@@ -1756,7 +1719,7 @@ func headerTransport(ctx context.Context, serverURL *url.URL, header []string, h
var outBuf bytes.Buffer
// #nosec
cmd := exec.CommandContext(ctx, shell, caller, headerCommand)
- cmd.Env = appendAndDedupEnv(os.Environ(), "CODER_URL="+serverURL.String())
+ cmd.Env = append(os.Environ(), "CODER_URL="+serverURL.String())
cmd.Stdout = &outBuf
cmd.Stderr = io.Discard
err := cmd.Run()
diff --git a/cli/root_test.go b/cli/root_test.go
index aaf81f574e57f..fefb87382c685 100644
--- a/cli/root_test.go
+++ b/cli/root_test.go
@@ -177,17 +177,15 @@ func TestRoot(t *testing.T) {
url = srv.URL
buf := new(bytes.Buffer)
coderURLEnv := "$CODER_URL"
- headerCmd := "printf X-Process-Testing=very-wow-" + coderURLEnv + "'\\r\\n'X-Process-Testing2=more-wow"
if runtime.GOOS == "windows" {
coderURLEnv = "%CODER_URL%"
- headerCmd = "echo X-Process-Testing=very-wow-" + coderURLEnv + "& echo X-Process-Testing2=more-wow"
}
inv, _ := clitest.New(t,
"--no-feature-warning",
"--no-version-warning",
"--header", "X-Testing=wow",
"--header", "Cool-Header=Dean was Here!",
- "--header-command", headerCmd,
+ "--header-command", "printf X-Process-Testing=very-wow-"+coderURLEnv+"'\\r\\n'X-Process-Testing2=more-wow",
"login", srv.URL,
)
inv.Stdout = buf
@@ -268,7 +266,7 @@ func TestDERPHeaders(t *testing.T) {
"--no-version-warning",
"ping", workspace.Name,
"-n", "1",
- "--header-command", "echo X-Process-Testing=very-wow",
+ "--header-command", "printf X-Process-Testing=very-wow",
}
for k, v := range expectedHeaders {
if k != "X-Process-Testing" {
diff --git a/enterprise/cli/proxyserver_test.go b/enterprise/cli/proxyserver_test.go
index 15f0003099b23..556597ab765d7 100644
--- a/enterprise/cli/proxyserver_test.go
+++ b/enterprise/cli/proxyserver_test.go
@@ -48,7 +48,7 @@ func Test_ProxyServer_Headers(t *testing.T) {
"--access-url", "http://localhost:8080",
"--http-address", ":0",
"--header", fmt.Sprintf("%s=%s", headerName1, headerVal1),
- "--header-command", fmt.Sprintf("echo %s=%s", headerName2, headerVal2),
+ "--header-command", fmt.Sprintf("printf %s=%s", headerName2, headerVal2),
)
pty := ptytest.New(t)
inv.Stdout = pty.Output()
From 7195be87b1fcf4946bad2ad308a029503a32b1a0 Mon Sep 17 00:00:00 2001
From: Cian Johnston
Date: Tue, 2 Jun 2026 11:55:34 +0100
Subject: [PATCH 026/112] fix(site): CredentialField: mask api key after submit
(#25848)
Fixes CODAGT-525
* Re-masks the field after submit
* Sets font to monospaced for legibility
* Extracts `createDeferred` to `testHelpers`
---
site/src/api/queries/aiProviders.ts | 2 +-
.../UpdateProviderPageView.tsx | 6 +
.../components/CredentialField.tsx | 8 +-
.../components/ProviderForm.stories.tsx | 292 +++++++++++++++++-
.../ProvidersPage/components/ProviderForm.tsx | 73 ++++-
.../pages/AgentsPage/AgentChatPage.test.ts | 17 +-
.../hooks/useChatDraftAttachments.test.ts | 17 +-
site/src/testHelpers/deferred.ts | 15 +
8 files changed, 379 insertions(+), 51 deletions(-)
create mode 100644 site/src/testHelpers/deferred.ts
diff --git a/site/src/api/queries/aiProviders.ts b/site/src/api/queries/aiProviders.ts
index ad8d722352c32..7a3f01cf53528 100644
--- a/site/src/api/queries/aiProviders.ts
+++ b/site/src/api/queries/aiProviders.ts
@@ -8,7 +8,7 @@ import type {
const aiProvidersListKey = ["ai", "providers"] as const;
-const aiProviderKeyFor = (idOrName: string) =>
+export const aiProviderKeyFor = (idOrName: string) =>
[...aiProvidersListKey, idOrName] as const;
export const aiProvidersList = () => ({
diff --git a/site/src/pages/AISettingsPage/ProvidersPage/UpdateProviderPage/UpdateProviderPageView.tsx b/site/src/pages/AISettingsPage/ProvidersPage/UpdateProviderPage/UpdateProviderPageView.tsx
index 9991c3b8f6759..005ece6744fee 100644
--- a/site/src/pages/AISettingsPage/ProvidersPage/UpdateProviderPage/UpdateProviderPageView.tsx
+++ b/site/src/pages/AISettingsPage/ProvidersPage/UpdateProviderPage/UpdateProviderPageView.tsx
@@ -7,6 +7,7 @@ import { toast } from "sonner";
import { getErrorMessage } from "#/api/errors";
import {
aiProvider,
+ aiProviderKeyFor,
deleteAIProviderMutation,
updateAIProviderMutation,
} from "#/api/queries/aiProviders";
@@ -171,6 +172,10 @@ const UpdateProviderPageView: React.FC = () => {
{ enabled: checked },
{
onSuccess: (updated) => {
+ queryClient.setQueryData(
+ aiProviderKeyFor(providerId),
+ updated,
+ );
toast.success(
`Provider "${updated.display_name || updated.name}" ${checked ? "enabled" : "disabled"}.`,
);
@@ -200,6 +205,7 @@ const UpdateProviderPageView: React.FC = () => {
const request = providerFormValuesToUpdate(values, provider);
try {
const updated = await updateMutation.mutateAsync(request);
+ queryClient.setQueryData(aiProviderKeyFor(providerId), updated);
toast.success(
`Provider "${updated.display_name || updated.name}" updated.`,
);
diff --git a/site/src/pages/AISettingsPage/ProvidersPage/components/CredentialField.tsx b/site/src/pages/AISettingsPage/ProvidersPage/components/CredentialField.tsx
index 888818f859602..b584d326cd067 100644
--- a/site/src/pages/AISettingsPage/ProvidersPage/components/CredentialField.tsx
+++ b/site/src/pages/AISettingsPage/ProvidersPage/components/CredentialField.tsx
@@ -10,6 +10,7 @@ type CredentialFieldProps = {
placeholder?: string;
description?: React.ReactNode;
required?: boolean;
+ onBlur?: () => void;
onFocus?: () => void;
};
@@ -20,6 +21,7 @@ export const CredentialField: React.FC = ({
placeholder,
description,
required = false,
+ onBlur,
onFocus,
}) => {
const inputId = useId();
@@ -62,9 +64,13 @@ export const CredentialField: React.FC = ({
{
+ helpers.onBlur(event);
+ onBlur?.();
+ }}
onFocus={onFocus}
autoComplete={autoComplete}
placeholder={placeholder}
diff --git a/site/src/pages/AISettingsPage/ProvidersPage/components/ProviderForm.stories.tsx b/site/src/pages/AISettingsPage/ProvidersPage/components/ProviderForm.stories.tsx
index 181a786a328de..49c1e0c866cab 100644
--- a/site/src/pages/AISettingsPage/ProvidersPage/components/ProviderForm.stories.tsx
+++ b/site/src/pages/AISettingsPage/ProvidersPage/components/ProviderForm.stories.tsx
@@ -1,6 +1,8 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
+import { type ComponentProps, useState } from "react";
import { expect, fn, screen, userEvent, waitFor, within } from "storybook/test";
-import { ProviderForm } from "./ProviderForm";
+import { createDeferred, type Deferred } from "#/testHelpers/deferred";
+import { ProviderForm, SAVED_CREDENTIAL_MASK } from "./ProviderForm";
const meta: Meta = {
title: "pages/AISettingsPage/ProviderForm",
@@ -15,6 +17,88 @@ const meta: Meta = {
export default meta;
type Story = StoryObj;
+const SuccessfulSubmitProviderForm = ({
+ args,
+ deferred,
+}: {
+ args: ComponentProps;
+ deferred: Deferred;
+}) => {
+ const [isLoading, setIsLoading] = useState(false);
+
+ return (
+ {
+ args.onSubmit?.(values);
+ setIsLoading(true);
+ await deferred.promise;
+ setIsLoading(false);
+ }}
+ />
+ );
+};
+
+const FailedSubmitProviderForm = ({
+ args,
+ deferred,
+}: {
+ args: ComponentProps;
+ deferred: Deferred;
+}) => {
+ const [isLoading, setIsLoading] = useState(false);
+ const [submitError, setSubmitError] = useState();
+
+ return (
+ {
+ args.onSubmit?.(values);
+ setIsLoading(true);
+ await deferred.promise;
+ setSubmitError(new Error(errorSubmitMessage));
+ setIsLoading(false);
+ }}
+ />
+ );
+};
+
+const ExternalLoadingProviderForm = ({
+ args,
+ deferred,
+}: {
+ args: ComponentProps;
+ deferred: Deferred;
+}) => {
+ const [isLoading, setIsLoading] = useState(false);
+
+ return (
+ <>
+
+ {
+ setIsLoading(true);
+ await deferred.promise;
+ setIsLoading(false);
+ }}
+ >
+ Simulate external save
+
+ >
+ );
+};
+
+const errorSubmitMessage = "Failed to update provider.";
+
+let bedrockSubmitDeferred = createDeferred();
+let apiKeySubmitDeferred = createDeferred();
+let failedSubmitDeferred = createDeferred();
+let externalSaveDeferred = createDeferred();
+
export const AddAnthropicDefault: Story = {};
export const AddOpenAI: Story = {
@@ -47,6 +131,15 @@ export const AddBedrock: Story = {
};
export const EditBedrockKeepCredentials: Story = {
+ render: (args) => {
+ bedrockSubmitDeferred = createDeferred();
+ return (
+
+ );
+ },
args: {
editing: true,
bedrockSavedAccessCredentials: true,
@@ -62,6 +155,59 @@ export const EditBedrockKeepCredentials: Story = {
enabled: true,
},
},
+ play: async ({ canvasElement, args }) => {
+ const canvas = within(canvasElement);
+ const accessKeyInput = await canvas.findByLabelText(/^access key\s*\*?$/i);
+ const accessKeySecretInput =
+ await canvas.findByLabelText(/access key secret/i);
+
+ expect(accessKeyInput).toHaveProperty("type", "text");
+ expect(accessKeySecretInput).toHaveProperty("type", "text");
+ expect(accessKeyInput).toHaveValue(SAVED_CREDENTIAL_MASK);
+ expect(accessKeySecretInput).toHaveValue(SAVED_CREDENTIAL_MASK);
+
+ await userEvent.click(accessKeyInput);
+ await waitFor(() => expect(accessKeyInput).toHaveValue(""));
+ await userEvent.click(accessKeySecretInput);
+ await waitFor(() =>
+ expect(accessKeyInput).toHaveValue(SAVED_CREDENTIAL_MASK),
+ );
+
+ await userEvent.click(accessKeyInput);
+ await waitFor(() => expect(accessKeyInput).toHaveValue(""));
+ await userEvent.type(accessKeyInput, "AKIAI1lO0EXAMPLE");
+ expect(accessKeyInput).toHaveValue("AKIAI1lO0EXAMPLE");
+
+ await userEvent.click(accessKeySecretInput);
+ await waitFor(() => expect(accessKeySecretInput).toHaveValue(""));
+ await userEvent.type(accessKeySecretInput, "wJalrI1lO0Secret");
+ expect(accessKeySecretInput).toHaveValue("wJalrI1lO0Secret");
+
+ const displayName = canvas.getByLabelText(/display name/i);
+ await userEvent.clear(displayName);
+ await userEvent.type(displayName, "Updated Bedrock");
+
+ const submitButton = canvas.getByRole("button", {
+ name: /update provider/i,
+ });
+ await waitFor(() => expect(submitButton).toBeEnabled());
+ await userEvent.click(submitButton);
+
+ await waitFor(() =>
+ expect(args.onSubmit).toHaveBeenCalledWith(
+ expect.objectContaining({
+ accessKey: "AKIAI1lO0EXAMPLE",
+ accessKeySecret: "wJalrI1lO0Secret",
+ }),
+ ),
+ );
+ await waitFor(() => expect(submitButton).toBeDisabled());
+ bedrockSubmitDeferred.resolve();
+ await waitFor(() => {
+ expect(accessKeyInput).toHaveValue(SAVED_CREDENTIAL_MASK);
+ expect(accessKeySecretInput).toHaveValue(SAVED_CREDENTIAL_MASK);
+ });
+ },
};
export const AddCopilot: Story = {
@@ -141,6 +287,15 @@ export const Submitting: Story = {
};
export const CredentialFocusClear: Story = {
+ render: (args) => {
+ apiKeySubmitDeferred = createDeferred();
+ return (
+
+ );
+ },
args: {
editing: true,
openAiAnthropicSavedApiKey: true,
@@ -154,14 +309,147 @@ export const CredentialFocusClear: Story = {
enabled: true,
},
},
- play: async ({ canvasElement }) => {
+ play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
const apiKeyInput = await canvas.findByLabelText(/api key/i);
+
+ expect(apiKeyInput).toHaveProperty("type", "text");
expect(apiKeyInput).toHaveValue("sk-ant-***\u2026***ABCD");
+
+ await userEvent.click(apiKeyInput);
+ await waitFor(() => expect(apiKeyInput).toHaveValue(""));
+
+ const displayName = canvas.getByLabelText(/display name/i);
+ await userEvent.click(displayName);
+ await waitFor(() =>
+ expect(apiKeyInput).toHaveValue("sk-ant-***\u2026***ABCD"),
+ );
+
await userEvent.click(apiKeyInput);
await waitFor(() => expect(apiKeyInput).toHaveValue(""));
+ await userEvent.type(apiKeyInput, "sk-ant-I1lO0-new-secret");
+ expect(apiKeyInput).toHaveValue("sk-ant-I1lO0-new-secret");
+
+ await userEvent.clear(displayName);
+ await userEvent.type(displayName, "Updated Anthropic");
+
+ const submitButton = canvas.getByRole("button", {
+ name: /update provider/i,
+ });
+ await waitFor(() => expect(submitButton).toBeEnabled());
+ await userEvent.click(submitButton);
+
+ await waitFor(() =>
+ expect(args.onSubmit).toHaveBeenCalledWith(
+ expect.objectContaining({
+ apiKey: "sk-ant-I1lO0-new-secret",
+ }),
+ ),
+ );
+ await waitFor(() => expect(submitButton).toBeDisabled());
+ apiKeySubmitDeferred.resolve();
+ await waitFor(() =>
+ expect(apiKeyInput).toHaveValue("sk-ant-***\u2026***ABCD"),
+ );
},
};
+export const FailedSubmitKeepsCredential: Story = {
+ render: (args) => {
+ failedSubmitDeferred = createDeferred();
+ return (
+
+ );
+ },
+ args: {
+ editing: true,
+ openAiAnthropicSavedApiKey: true,
+ openAiAnthropicMaskedApiKey: "sk-ant-***\u2026***ABCD",
+ initialValues: {
+ type: "anthropic",
+ name: "production-anthropic",
+ displayName: "Production Anthropic",
+ baseUrl: "https://api.anthropic.com",
+ apiKey: "",
+ enabled: true,
+ },
+ },
+ play: async ({ canvasElement, args }) => {
+ const canvas = within(canvasElement);
+ const apiKeyInput = await canvas.findByLabelText(/api key/i);
+
+ await userEvent.click(apiKeyInput);
+ await waitFor(() => expect(apiKeyInput).toHaveValue(""));
+ await userEvent.type(apiKeyInput, "sk-ant-I1lO0-new-secret");
+
+ const displayName = canvas.getByLabelText(/display name/i);
+ await userEvent.clear(displayName);
+ await userEvent.type(displayName, "Failed Anthropic");
+
+ const submitButton = canvas.getByRole("button", {
+ name: /update provider/i,
+ });
+ await waitFor(() => expect(submitButton).toBeEnabled());
+ await userEvent.click(submitButton);
+
+ await waitFor(() =>
+ expect(args.onSubmit).toHaveBeenCalledWith(
+ expect.objectContaining({
+ apiKey: "sk-ant-I1lO0-new-secret",
+ }),
+ ),
+ );
+ await waitFor(() => expect(submitButton).toBeDisabled());
+ failedSubmitDeferred.resolve();
+ await expect(await canvas.findByText(errorSubmitMessage)).toBeVisible();
+ expect(apiKeyInput).toHaveValue("sk-ant-I1lO0-new-secret");
+ },
+};
+
+export const ExternalLoadingKeepsCredential: Story = {
+ render: (args) => {
+ externalSaveDeferred = createDeferred();
+ return (
+
+ );
+ },
+ args: {
+ editing: true,
+ openAiAnthropicSavedApiKey: true,
+ openAiAnthropicMaskedApiKey: "sk-ant-***\u2026***ABCD",
+ initialValues: {
+ type: "anthropic",
+ name: "production-anthropic",
+ displayName: "Production Anthropic",
+ baseUrl: "https://api.anthropic.com",
+ apiKey: "",
+ enabled: true,
+ },
+ },
+ play: async ({ canvasElement }) => {
+ const canvas = within(canvasElement);
+ const apiKeyInput = await canvas.findByLabelText(/api key/i);
+ const submitButton = canvas.getByRole("button", {
+ name: /update provider/i,
+ });
+
+ await userEvent.click(apiKeyInput);
+ await waitFor(() => expect(apiKeyInput).toHaveValue(""));
+ await userEvent.type(apiKeyInput, "sk-ant-I1lO0-new-secret");
+ await waitFor(() => expect(submitButton).toBeEnabled());
+
+ await userEvent.click(
+ canvas.getByRole("button", { name: /simulate external save/i }),
+ );
+ await waitFor(() => expect(submitButton).toBeDisabled());
+ externalSaveDeferred.resolve();
+ await waitFor(() => expect(submitButton).toBeEnabled());
+ expect(apiKeyInput).toHaveValue("sk-ant-I1lO0-new-secret");
+ },
+};
+
export const UnsavedChangesPrompt: Story = {
args: {
editing: true,
diff --git a/site/src/pages/AISettingsPage/ProvidersPage/components/ProviderForm.tsx b/site/src/pages/AISettingsPage/ProvidersPage/components/ProviderForm.tsx
index 7468d39b861d2..e2e46f7e20684 100644
--- a/site/src/pages/AISettingsPage/ProvidersPage/components/ProviderForm.tsx
+++ b/site/src/pages/AISettingsPage/ProvidersPage/components/ProviderForm.tsx
@@ -259,6 +259,21 @@ export const ProviderForm: FC = ({
const typeDefaults =
providerDefaults[resolvedType as keyof typeof providerDefaults];
+ // Seed Bedrock credentials with the mask when on file; focus clears it,
+ // and a re-submitted "" tells the API mapping to keep the value.
+ const maskedAccessKey = bedrockSavedAccessCredentials
+ ? SAVED_CREDENTIAL_MASK
+ : "";
+ const maskedAccessKeySecret = bedrockSavedAccessCredentials
+ ? SAVED_CREDENTIAL_MASK
+ : "";
+ // Same pattern for openai/anthropic. Prefer the API-supplied masked
+ // rendering so the user sees the key's identifying suffix.
+ const maskedApiKey = openAiAnthropicSavedApiKey
+ ? (openAiAnthropicMaskedApiKey ?? SAVED_CREDENTIAL_MASK)
+ : "";
+
+ const didSubmit = useRef(false);
const form = useFormik({
initialValues: {
...defaultInitialValues,
@@ -266,21 +281,16 @@ export const ProviderForm: FC = ({
// Edit overrides prefills with server values; create gets them as-is.
...(typeDefaults ?? {}),
...initialValues,
- // Seed Bedrock credentials with the mask when on file; focus clears it,
- // and a re-submitted "" tells the API mapping to keep the value.
- accessKey: bedrockSavedAccessCredentials ? SAVED_CREDENTIAL_MASK : "",
- accessKeySecret: bedrockSavedAccessCredentials
- ? SAVED_CREDENTIAL_MASK
- : "",
- // Same pattern for openai/anthropic. Prefer the API-supplied masked
- // rendering so the user sees the key's identifying suffix.
- apiKey: openAiAnthropicSavedApiKey
- ? (openAiAnthropicMaskedApiKey ?? SAVED_CREDENTIAL_MASK)
- : "",
+ accessKey: maskedAccessKey,
+ accessKeySecret: maskedAccessKeySecret,
+ apiKey: maskedApiKey,
},
validationSchema: getProviderFormSchema(editing),
validateOnMount: true,
- onSubmit: onSubmit ?? (() => {}),
+ onSubmit: (values) => {
+ didSubmit.current = true;
+ return onSubmit?.(values);
+ },
});
const getFieldHelpers = getFormHelpers(form, submitError);
@@ -297,17 +307,46 @@ export const ProviderForm: FC = ({
}
};
+ // Restores the mask when the user leaves the field without entering
+ // a new value, keeping the saved-credential appearance.
+ const handleCredentialBlur = (
+ field: "apiKey" | "accessKey" | "accessKeySecret",
+ ) => {
+ const initial = form.initialValues[field];
+ if (form.values[field] === "" && initial !== "") {
+ void form.setFieldValue(field, initial);
+ }
+ };
+
// When the parent's mutation finishes without an error, treat the just-
// submitted values as the new baseline so the unsaved-changes prompt does
// not fire on subsequent navigations. React Query reports a missing error
// as `null`, so a truthy check covers both null and undefined.
const previousIsLoading = useRef(isLoading);
useEffect(() => {
- if (previousIsLoading.current && !isLoading && !submitError) {
- form.resetForm({ values: form.values });
+ if (previousIsLoading.current && !isLoading) {
+ if (didSubmit.current && !submitError) {
+ // Restore credential fields to their initial masked sentinels so
+ // the raw key is never left visible after a successful save.
+ const remaskedValues = {
+ ...form.values,
+ apiKey: maskedApiKey,
+ accessKey: maskedAccessKey,
+ accessKeySecret: maskedAccessKeySecret,
+ };
+ form.resetForm({ values: remaskedValues });
+ }
+ didSubmit.current = false;
}
previousIsLoading.current = isLoading;
- }, [isLoading, submitError, form]);
+ }, [
+ isLoading,
+ submitError,
+ form,
+ maskedApiKey,
+ maskedAccessKey,
+ maskedAccessKeySecret,
+ ]);
const unsavedChanges = useUnsavedChangesPrompt(
form.dirty && !form.isSubmitting,
@@ -367,6 +406,7 @@ export const ProviderForm: FC = ({
required
label="API key"
helpers={getFieldHelpers("apiKey")}
+ onBlur={() => handleCredentialBlur("apiKey")}
onFocus={() => handleCredentialFocus("apiKey")}
autoComplete="new-password"
placeholder={apiKeyPlaceholder(form.values.type)}
@@ -430,12 +470,15 @@ export const ProviderForm: FC = ({
required
label="Access key"
helpers={getFieldHelpers("accessKey")}
+ onBlur={() => handleCredentialBlur("accessKey")}
onFocus={() => handleCredentialFocus("accessKey")}
+ autoComplete="new-password"
/>
handleCredentialBlur("accessKeySecret")}
onFocus={() => handleCredentialFocus("accessKeySecret")}
autoComplete="new-password"
/>
diff --git a/site/src/pages/AgentsPage/AgentChatPage.test.ts b/site/src/pages/AgentsPage/AgentChatPage.test.ts
index 9a20437dfe8bb..b0acb53af13eb 100644
--- a/site/src/pages/AgentsPage/AgentChatPage.test.ts
+++ b/site/src/pages/AgentsPage/AgentChatPage.test.ts
@@ -2,6 +2,7 @@ import { act, renderHook } from "@testing-library/react";
import { createRef } from "react";
import { beforeEach, describe, expect, it, vi } from "vitest";
import type { ChatQueuedMessage } from "#/api/typesGenerated";
+import { createDeferred } from "#/testHelpers/deferred";
import { MockUserOwner, MockWorkspace } from "#/testHelpers/entities";
import {
draftInputStorageKeyPrefix,
@@ -79,22 +80,6 @@ const setMobileViewport = (isMobile: boolean) => {
});
};
-type Deferred = {
- promise: Promise;
- resolve: (value: T | PromiseLike) => void;
- reject: (reason?: unknown) => void;
-};
-
-const createDeferred = (): Deferred => {
- let resolve!: (value: T | PromiseLike) => void;
- let reject!: (reason?: unknown) => void;
- const promise = new Promise((res, rej) => {
- resolve = res;
- reject = rej;
- });
- return { promise, resolve, reject };
-};
-
describe("getWorkspaceOptionsWithLinkedWorkspace", () => {
it("includes a missing linked workspace only when the current user owns it", () => {
const existingWorkspace = {
diff --git a/site/src/pages/AgentsPage/hooks/useChatDraftAttachments.test.ts b/site/src/pages/AgentsPage/hooks/useChatDraftAttachments.test.ts
index 72ba18c0d5f59..ec94f93ab0e61 100644
--- a/site/src/pages/AgentsPage/hooks/useChatDraftAttachments.test.ts
+++ b/site/src/pages/AgentsPage/hooks/useChatDraftAttachments.test.ts
@@ -1,28 +1,13 @@
import { act, renderHook } from "@testing-library/react";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { API } from "#/api/api";
+import { createDeferred } from "#/testHelpers/deferred";
import { chatDraftAttachmentStorageKey } from "../utils/chatDraftAttachmentStorage";
import {
resetChatDraftAttachmentRegistryForTest,
useChatDraftAttachments,
} from "./useChatDraftAttachments";
-type Deferred = {
- promise: Promise;
- resolve: (value: T | PromiseLike) => void;
- reject: (reason?: unknown) => void;
-};
-
-const createDeferred = (): Deferred => {
- let resolve!: (value: T | PromiseLike) => void;
- let reject!: (reason?: unknown) => void;
- const promise = new Promise((res, rej) => {
- resolve = res;
- reject = rej;
- });
- return { promise, resolve, reject };
-};
-
const orgID = "org-1";
const chatID = "chat-a";
const storageKey = chatDraftAttachmentStorageKey(orgID, chatID);
diff --git a/site/src/testHelpers/deferred.ts b/site/src/testHelpers/deferred.ts
new file mode 100644
index 0000000000000..2ae217ece5a4f
--- /dev/null
+++ b/site/src/testHelpers/deferred.ts
@@ -0,0 +1,15 @@
+export type Deferred = {
+ promise: Promise;
+ resolve: (value: T | PromiseLike) => void;
+ reject: (reason?: unknown) => void;
+};
+
+export const createDeferred = (): Deferred => {
+ let resolve!: (value: T | PromiseLike) => void;
+ let reject!: (reason?: unknown) => void;
+ const promise = new Promise((res, rej) => {
+ resolve = res;
+ reject = rej;
+ });
+ return { promise, resolve, reject };
+};
From 32aee9ea4c9120323bbaa697d59ada5241983e9f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pawe=C5=82=20Banaszewski?=
Date: Tue, 2 Jun 2026 13:25:44 +0200
Subject: [PATCH 027/112] feat: add DB queries for ai_gateway_coderd_keys
(#25564)
Adds Insert, List and Delete queries for `ai_gateway_coderd_keys `
table.
---
coderd/database/dbauthz/dbauthz.go | 21 +++
coderd/database/dbauthz/dbauthz_test.go | 17 ++
coderd/database/dbmetrics/querymetrics.go | 24 +++
coderd/database/dbmock/dbmock.go | 45 +++++
coderd/database/querier.go | 3 +
coderd/database/querier_test.go | 186 ++++++++++++++++++++
coderd/database/queries.sql.go | 106 +++++++++++
coderd/database/queries/ai_gateway_keys.sql | 13 ++
8 files changed, 415 insertions(+)
create mode 100644 coderd/database/queries/ai_gateway_keys.sql
diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go
index a1a74971536cf..d084514dd8bfc 100644
--- a/coderd/database/dbauthz/dbauthz.go
+++ b/coderd/database/dbauthz/dbauthz.go
@@ -1907,6 +1907,13 @@ func (q *querier) CustomRoles(ctx context.Context, arg database.CustomRolesParam
return q.db.CustomRoles(ctx, arg)
}
+func (q *querier) DeleteAIGatewayKey(ctx context.Context, id uuid.UUID) (database.DeleteAIGatewayKeyRow, error) {
+ if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceAIGatewayKey); err != nil {
+ return database.DeleteAIGatewayKeyRow{}, err
+ }
+ return q.db.DeleteAIGatewayKey(ctx, id)
+}
+
func (q *querier) DeleteAIProviderByID(ctx context.Context, id uuid.UUID) error {
if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceAIProvider); err != nil {
return err
@@ -5463,6 +5470,13 @@ func (q *querier) InsertAIBridgeUserPrompt(ctx context.Context, arg database.Ins
return q.db.InsertAIBridgeUserPrompt(ctx, arg)
}
+func (q *querier) InsertAIGatewayKey(ctx context.Context, arg database.InsertAIGatewayKeyParams) (database.InsertAIGatewayKeyRow, error) {
+ if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceAIGatewayKey); err != nil {
+ return database.InsertAIGatewayKeyRow{}, err
+ }
+ return q.db.InsertAIGatewayKey(ctx, arg)
+}
+
func (q *querier) InsertAIProvider(ctx context.Context, arg database.InsertAIProviderParams) (database.AIProvider, error) {
if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceAIProvider); err != nil {
return database.AIProvider{}, err
@@ -6238,6 +6252,13 @@ func (q *querier) ListAIBridgeUserPromptsByInterceptionIDs(ctx context.Context,
return q.db.ListAIBridgeUserPromptsByInterceptionIDs(ctx, interceptionIDs)
}
+func (q *querier) ListAIGatewayKeys(ctx context.Context) ([]database.ListAIGatewayKeysRow, error) {
+ if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceAIGatewayKey); err != nil {
+ return nil, err
+ }
+ return q.db.ListAIGatewayKeys(ctx)
+}
+
func (q *querier) ListBoundaryLogsBySessionID(ctx context.Context, arg database.ListBoundaryLogsBySessionIDParams) ([]database.BoundaryLog, error) {
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceBoundaryLog); err != nil {
return nil, err
diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go
index f788fa71e2ed6..1d7f7a62c3a74 100644
--- a/coderd/database/dbauthz/dbauthz_test.go
+++ b/coderd/database/dbauthz/dbauthz_test.go
@@ -6638,6 +6638,23 @@ func (s *MethodTestSuite) TestAIBridge() {
dbm.EXPECT().UpdateEncryptedUserAIProviderKey(gomock.Any(), arg).Return(key, nil).AnyTimes()
check.Args(arg).Asserts(rbac.ResourceAIProvider, policy.ActionUpdate).Returns(key)
}))
+
+ s.Run("InsertAIGatewayKey", s.Mocked(func(dbm *dbmock.MockStore, _ *gofakeit.Faker, check *expects) {
+ params := database.InsertAIGatewayKeyParams{}
+ row := database.InsertAIGatewayKeyRow{}
+ dbm.EXPECT().InsertAIGatewayKey(gomock.Any(), params).Return(row, nil).AnyTimes()
+ check.Args(params).Asserts(rbac.ResourceAIGatewayKey, policy.ActionCreate).Returns(row)
+ }))
+ s.Run("ListAIGatewayKeys", s.Mocked(func(dbm *dbmock.MockStore, _ *gofakeit.Faker, check *expects) {
+ rows := []database.ListAIGatewayKeysRow{}
+ dbm.EXPECT().ListAIGatewayKeys(gomock.Any()).Return(rows, nil).AnyTimes()
+ check.Args().Asserts(rbac.ResourceAIGatewayKey, policy.ActionRead).Returns(rows)
+ }))
+ s.Run("DeleteAIGatewayKey", s.Mocked(func(dbm *dbmock.MockStore, _ *gofakeit.Faker, check *expects) {
+ id := uuid.New()
+ dbm.EXPECT().DeleteAIGatewayKey(gomock.Any(), id).Return(database.DeleteAIGatewayKeyRow{}, nil).AnyTimes()
+ check.Args(id).Asserts(rbac.ResourceAIGatewayKey, policy.ActionDelete).Returns(database.DeleteAIGatewayKeyRow{})
+ }))
}
func (s *MethodTestSuite) TestTelemetry() {
diff --git a/coderd/database/dbmetrics/querymetrics.go b/coderd/database/dbmetrics/querymetrics.go
index e7120ec588595..7f68852bafa3a 100644
--- a/coderd/database/dbmetrics/querymetrics.go
+++ b/coderd/database/dbmetrics/querymetrics.go
@@ -377,6 +377,14 @@ func (m queryMetricsStore) CustomRoles(ctx context.Context, arg database.CustomR
return r0, r1
}
+func (m queryMetricsStore) DeleteAIGatewayKey(ctx context.Context, id uuid.UUID) (database.DeleteAIGatewayKeyRow, error) {
+ start := time.Now()
+ r0, r1 := m.s.DeleteAIGatewayKey(ctx, id)
+ m.queryLatencies.WithLabelValues("DeleteAIGatewayKey").Observe(time.Since(start).Seconds())
+ m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "DeleteAIGatewayKey").Inc()
+ return r0, r1
+}
+
func (m queryMetricsStore) DeleteAIProviderByID(ctx context.Context, id uuid.UUID) error {
start := time.Now()
r0 := m.s.DeleteAIProviderByID(ctx, id)
@@ -3721,6 +3729,14 @@ func (m queryMetricsStore) InsertAIBridgeUserPrompt(ctx context.Context, arg dat
return r0, r1
}
+func (m queryMetricsStore) InsertAIGatewayKey(ctx context.Context, arg database.InsertAIGatewayKeyParams) (database.InsertAIGatewayKeyRow, error) {
+ start := time.Now()
+ r0, r1 := m.s.InsertAIGatewayKey(ctx, arg)
+ m.queryLatencies.WithLabelValues("InsertAIGatewayKey").Observe(time.Since(start).Seconds())
+ m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "InsertAIGatewayKey").Inc()
+ return r0, r1
+}
+
func (m queryMetricsStore) InsertAIProvider(ctx context.Context, arg database.InsertAIProviderParams) (database.AIProvider, error) {
start := time.Now()
r0, r1 := m.s.InsertAIProvider(ctx, arg)
@@ -4417,6 +4433,14 @@ func (m queryMetricsStore) ListAIBridgeUserPromptsByInterceptionIDs(ctx context.
return r0, r1
}
+func (m queryMetricsStore) ListAIGatewayKeys(ctx context.Context) ([]database.ListAIGatewayKeysRow, error) {
+ start := time.Now()
+ r0, r1 := m.s.ListAIGatewayKeys(ctx)
+ m.queryLatencies.WithLabelValues("ListAIGatewayKeys").Observe(time.Since(start).Seconds())
+ m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "ListAIGatewayKeys").Inc()
+ return r0, r1
+}
+
func (m queryMetricsStore) ListBoundaryLogsBySessionID(ctx context.Context, arg database.ListBoundaryLogsBySessionIDParams) ([]database.BoundaryLog, error) {
start := time.Now()
r0, r1 := m.s.ListBoundaryLogsBySessionID(ctx, arg)
diff --git a/coderd/database/dbmock/dbmock.go b/coderd/database/dbmock/dbmock.go
index 0f6799e6385b8..8321983028008 100644
--- a/coderd/database/dbmock/dbmock.go
+++ b/coderd/database/dbmock/dbmock.go
@@ -603,6 +603,21 @@ func (mr *MockStoreMockRecorder) CustomRoles(ctx, arg any) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CustomRoles", reflect.TypeOf((*MockStore)(nil).CustomRoles), ctx, arg)
}
+// DeleteAIGatewayKey mocks base method.
+func (m *MockStore) DeleteAIGatewayKey(ctx context.Context, id uuid.UUID) (database.DeleteAIGatewayKeyRow, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "DeleteAIGatewayKey", ctx, id)
+ ret0, _ := ret[0].(database.DeleteAIGatewayKeyRow)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// DeleteAIGatewayKey indicates an expected call of DeleteAIGatewayKey.
+func (mr *MockStoreMockRecorder) DeleteAIGatewayKey(ctx, id any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAIGatewayKey", reflect.TypeOf((*MockStore)(nil).DeleteAIGatewayKey), ctx, id)
+}
+
// DeleteAIProviderByID mocks base method.
func (m *MockStore) DeleteAIProviderByID(ctx context.Context, id uuid.UUID) error {
m.ctrl.T.Helper()
@@ -6989,6 +7004,21 @@ func (mr *MockStoreMockRecorder) InsertAIBridgeUserPrompt(ctx, arg any) *gomock.
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertAIBridgeUserPrompt", reflect.TypeOf((*MockStore)(nil).InsertAIBridgeUserPrompt), ctx, arg)
}
+// InsertAIGatewayKey mocks base method.
+func (m *MockStore) InsertAIGatewayKey(ctx context.Context, arg database.InsertAIGatewayKeyParams) (database.InsertAIGatewayKeyRow, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "InsertAIGatewayKey", ctx, arg)
+ ret0, _ := ret[0].(database.InsertAIGatewayKeyRow)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// InsertAIGatewayKey indicates an expected call of InsertAIGatewayKey.
+func (mr *MockStoreMockRecorder) InsertAIGatewayKey(ctx, arg any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertAIGatewayKey", reflect.TypeOf((*MockStore)(nil).InsertAIGatewayKey), ctx, arg)
+}
+
// InsertAIProvider mocks base method.
func (m *MockStore) InsertAIProvider(ctx context.Context, arg database.InsertAIProviderParams) (database.AIProvider, error) {
m.ctrl.T.Helper()
@@ -8279,6 +8309,21 @@ func (mr *MockStoreMockRecorder) ListAIBridgeUserPromptsByInterceptionIDs(ctx, i
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAIBridgeUserPromptsByInterceptionIDs", reflect.TypeOf((*MockStore)(nil).ListAIBridgeUserPromptsByInterceptionIDs), ctx, interceptionIds)
}
+// ListAIGatewayKeys mocks base method.
+func (m *MockStore) ListAIGatewayKeys(ctx context.Context) ([]database.ListAIGatewayKeysRow, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "ListAIGatewayKeys", ctx)
+ ret0, _ := ret[0].([]database.ListAIGatewayKeysRow)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// ListAIGatewayKeys indicates an expected call of ListAIGatewayKeys.
+func (mr *MockStoreMockRecorder) ListAIGatewayKeys(ctx any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAIGatewayKeys", reflect.TypeOf((*MockStore)(nil).ListAIGatewayKeys), ctx)
+}
+
// ListAuthorizedAIBridgeClients mocks base method.
func (m *MockStore) ListAuthorizedAIBridgeClients(ctx context.Context, arg database.ListAIBridgeClientsParams, prepared rbac.PreparedAuthorized) ([]string, error) {
m.ctrl.T.Helper()
diff --git a/coderd/database/querier.go b/coderd/database/querier.go
index a6c8f3e7db512..4b9fa58e019ea 100644
--- a/coderd/database/querier.go
+++ b/coderd/database/querier.go
@@ -101,6 +101,7 @@ type sqlcQuerier interface {
CountUnreadInboxNotificationsByUserID(ctx context.Context, userID uuid.UUID) (int64, error)
CreateUserSecret(ctx context.Context, arg CreateUserSecretParams) (UserSecret, error)
CustomRoles(ctx context.Context, arg CustomRolesParams) ([]CustomRole, error)
+ DeleteAIGatewayKey(ctx context.Context, id uuid.UUID) (DeleteAIGatewayKeyRow, error)
DeleteAIProviderByID(ctx context.Context, id uuid.UUID) error
DeleteAIProviderKey(ctx context.Context, id uuid.UUID) error
DeleteAPIKeyByID(ctx context.Context, id string) error
@@ -914,6 +915,7 @@ type sqlcQuerier interface {
InsertAIBridgeTokenUsage(ctx context.Context, arg InsertAIBridgeTokenUsageParams) (AIBridgeTokenUsage, error)
InsertAIBridgeToolUsage(ctx context.Context, arg InsertAIBridgeToolUsageParams) (AIBridgeToolUsage, error)
InsertAIBridgeUserPrompt(ctx context.Context, arg InsertAIBridgeUserPromptParams) (AIBridgeUserPrompt, error)
+ InsertAIGatewayKey(ctx context.Context, arg InsertAIGatewayKeyParams) (InsertAIGatewayKeyRow, error)
InsertAIProvider(ctx context.Context, arg InsertAIProviderParams) (AIProvider, error)
InsertAIProviderKey(ctx context.Context, arg InsertAIProviderKeyParams) (AIProviderKey, error)
InsertAPIKey(ctx context.Context, arg InsertAPIKeyParams) (APIKey, error)
@@ -1048,6 +1050,7 @@ type sqlcQuerier interface {
ListAIBridgeTokenUsagesByInterceptionIDs(ctx context.Context, interceptionIds []uuid.UUID) ([]AIBridgeTokenUsage, error)
ListAIBridgeToolUsagesByInterceptionIDs(ctx context.Context, interceptionIds []uuid.UUID) ([]AIBridgeToolUsage, error)
ListAIBridgeUserPromptsByInterceptionIDs(ctx context.Context, interceptionIds []uuid.UUID) ([]AIBridgeUserPrompt, error)
+ ListAIGatewayKeys(ctx context.Context) ([]ListAIGatewayKeysRow, error)
// Lists boundary logs for a session, sorted by sequence number ascending.
// Supports optional exclusive sequence number bounds (seq_after, seq_before)
// for fetching events between two known interceptions.
diff --git a/coderd/database/querier_test.go b/coderd/database/querier_test.go
index cefe6a866e241..984dd8a79ab89 100644
--- a/coderd/database/querier_test.go
+++ b/coderd/database/querier_test.go
@@ -14733,3 +14733,189 @@ func TestSoftDeleteWorkspaceAgentsByWorkspaceID(t *testing.T) {
err = db.SoftDeleteWorkspaceAgentsByWorkspaceID(ctx, wsEmpty)
require.NoError(t, err)
}
+
+func TestAIGatewayKeysTableConstraints(t *testing.T) {
+ t.Parallel()
+
+ db, _ := dbtestutil.NewDB(t)
+ ctx := testutil.Context(t, testutil.WaitMedium)
+
+ preExsiting := database.InsertAIGatewayKeyParams{
+ ID: uuid.New(),
+ Name: "name",
+ SecretPrefix: "cgw_test__1",
+ HashedSecret: []byte("first-secret"),
+ }
+ _, err := db.InsertAIGatewayKey(ctx, preExsiting)
+ require.NoError(t, err)
+
+ tests := []struct {
+ name string
+ params database.InsertAIGatewayKeyParams
+ expectUniqueErr database.UniqueConstraint
+ expectCheckErr database.CheckConstraint
+ }{
+ {
+ name: "duplicate name",
+ params: aiGatewayKeyParams(preExsiting.Name, "cgw_test002"),
+ expectUniqueErr: database.UniqueAiGatewayKeysNameIndex,
+ },
+ {
+ name: "duplicate secret prefix",
+ params: aiGatewayKeyParams("different-key", preExsiting.SecretPrefix),
+ expectUniqueErr: database.UniqueAiGatewayKeysSecretPrefixIndex,
+ },
+ {
+ name: "duplicate hashed secret",
+ params: database.InsertAIGatewayKeyParams{ID: uuid.New(), Name: "other-name", SecretPrefix: "cgw_1234567", HashedSecret: preExsiting.HashedSecret},
+ expectUniqueErr: database.UniqueAiGatewayKeysHashedSecretIndex,
+ },
+ {
+ name: "empty name",
+ params: aiGatewayKeyParams("", "cgw_1234567"),
+ expectCheckErr: database.CheckAiGatewayKeysNameCheck,
+ },
+ {
+ name: "name with trailing dash",
+ params: aiGatewayKeyParams("other-name-", "cgw_1234567"),
+ expectCheckErr: database.CheckAiGatewayKeysNameCheck,
+ },
+ {
+ name: "name with consecutive dashes",
+ params: aiGatewayKeyParams("other--name", "cgw_1234567"),
+ expectCheckErr: database.CheckAiGatewayKeysNameCheck,
+ },
+ {
+ name: "name with underscore",
+ params: aiGatewayKeyParams("other_name", "cgw_1234567"),
+ expectCheckErr: database.CheckAiGatewayKeysNameCheck,
+ },
+ {
+ name: "name with space",
+ params: aiGatewayKeyParams("other name", "cgw_1234567"),
+ expectCheckErr: database.CheckAiGatewayKeysNameCheck,
+ },
+ {
+ name: "name with leading dash",
+ params: aiGatewayKeyParams("-other-name", "cgw_1234567"),
+ expectCheckErr: database.CheckAiGatewayKeysNameCheck,
+ },
+ {
+ name: "name longer than 64 characters",
+ params: aiGatewayKeyParams(strings.Repeat("a", 65), "cgw_1234567"),
+ expectCheckErr: database.CheckAiGatewayKeysNameCheck,
+ },
+ {
+ name: "empty secret prefix",
+ params: aiGatewayKeyParams("other-name", ""),
+ expectCheckErr: database.CheckAiGatewayKeysSecretPrefixCheck,
+ },
+ {
+ name: "invalid secret prefix length",
+ params: aiGatewayKeyParams("other-name", "cgw_short"),
+ expectCheckErr: database.CheckAiGatewayKeysSecretPrefixCheck,
+ },
+ {
+ name: "empty hashed secret",
+ params: database.InsertAIGatewayKeyParams{ID: uuid.New(), Name: "other-name", SecretPrefix: "cgw_1234567"},
+ expectCheckErr: database.CheckAiGatewayKeysHashedSecretCheck,
+ },
+ }
+
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ t.Parallel()
+
+ ctx := testutil.Context(t, testutil.WaitShort)
+
+ _, err = db.InsertAIGatewayKey(ctx, tc.params)
+ require.Error(t, err)
+ requireAIGatewayKeysViolation(t, err, tc.expectUniqueErr, tc.expectCheckErr)
+ })
+ }
+}
+
+func TestAIGatewayKeysQueries(t *testing.T) {
+ t.Parallel()
+
+ db, _ := dbtestutil.NewDB(t)
+ ctx := testutil.Context(t, testutil.WaitLong)
+
+ first := aiGatewayKeyParams("first-key", "cgw_first__")
+ second := aiGatewayKeyParams("second-key", "cgw_second_")
+ second.HashedSecret = []byte("second-secret")
+
+ firstRow, err := db.InsertAIGatewayKey(ctx, first)
+ require.NoError(t, err)
+ require.Equal(t, first.ID, firstRow.ID)
+
+ require.Equal(t, "first-key", firstRow.Name)
+ require.Equal(t, first.SecretPrefix, firstRow.SecretPrefix)
+
+ secondRow, err := db.InsertAIGatewayKey(ctx, second)
+ require.NoError(t, err)
+ require.Equal(t, second.ID, secondRow.ID)
+
+ require.Equal(t, "second-key", secondRow.Name)
+ require.Equal(t, second.SecretPrefix, secondRow.SecretPrefix)
+
+ keys, err := db.ListAIGatewayKeys(ctx)
+ require.NoError(t, err)
+ require.Len(t, keys, 2)
+
+ requireAIGatewayKeysRow(t, keys[0], first, firstRow.CreatedAt)
+ require.False(t, keys[0].LastUsedAt.Valid)
+ requireAIGatewayKeysRow(t, keys[1], second, secondRow.CreatedAt)
+ require.False(t, keys[1].LastUsedAt.Valid)
+
+ deleted, err := db.DeleteAIGatewayKey(ctx, first.ID)
+ require.NoError(t, err)
+ require.Equal(t, first.ID, deleted.ID)
+ require.Equal(t, first.Name, deleted.Name)
+ require.Equal(t, first.SecretPrefix, deleted.SecretPrefix)
+ require.Equal(t, firstRow.CreatedAt, deleted.CreatedAt)
+
+ _, err = db.DeleteAIGatewayKey(ctx, first.ID)
+ require.ErrorIs(t, err, sql.ErrNoRows)
+
+ keys, err = db.ListAIGatewayKeys(ctx)
+ require.NoError(t, err)
+ require.Len(t, keys, 1)
+ requireAIGatewayKeysRow(t, keys[0], second, secondRow.CreatedAt)
+}
+
+func aiGatewayKeyParams(name string, secretPrefix string) database.InsertAIGatewayKeyParams {
+ return database.InsertAIGatewayKeyParams{
+ ID: uuid.New(),
+ Name: name,
+ SecretPrefix: secretPrefix,
+ HashedSecret: []byte("secret"),
+ }
+}
+
+func requireAIGatewayKeysRow(t *testing.T, listRow database.ListAIGatewayKeysRow, insertParams database.InsertAIGatewayKeyParams, insertCreatedAt time.Time) {
+ t.Helper()
+
+ require.Equal(t, insertParams.ID, listRow.ID)
+ require.Equal(t, insertParams.Name, listRow.Name)
+ require.Equal(t, insertParams.SecretPrefix, listRow.SecretPrefix)
+ require.Equal(t, insertCreatedAt, listRow.CreatedAt)
+}
+
+func requireAIGatewayKeysViolation(
+ t *testing.T,
+ err error,
+ uniqueConstraint database.UniqueConstraint,
+ checkConstraint database.CheckConstraint,
+) {
+ t.Helper()
+
+ switch {
+ case uniqueConstraint != "":
+ require.True(t, database.IsUniqueViolation(err, uniqueConstraint), "expected %q unique violation, got %v", uniqueConstraint, err)
+ case checkConstraint != "":
+ require.True(t, database.IsCheckViolation(err, checkConstraint), "expected %q check violation, got %v", checkConstraint, err)
+ default:
+ require.FailNow(t, "test case must expect a constraint error")
+ }
+}
diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go
index dc646121dc938..28b11009a3d0d 100644
--- a/coderd/database/queries.sql.go
+++ b/coderd/database/queries.sql.go
@@ -111,6 +111,112 @@ func (q *sqlQuerier) ActivityBumpWorkspace(ctx context.Context, arg ActivityBump
return err
}
+const deleteAIGatewayKey = `-- name: DeleteAIGatewayKey :one
+DELETE FROM ai_gateway_keys WHERE id = $1
+RETURNING id, name, secret_prefix, created_at, last_used_at
+`
+
+type DeleteAIGatewayKeyRow struct {
+ ID uuid.UUID `db:"id" json:"id"`
+ Name string `db:"name" json:"name"`
+ SecretPrefix string `db:"secret_prefix" json:"secret_prefix"`
+ CreatedAt time.Time `db:"created_at" json:"created_at"`
+ LastUsedAt sql.NullTime `db:"last_used_at" json:"last_used_at"`
+}
+
+func (q *sqlQuerier) DeleteAIGatewayKey(ctx context.Context, id uuid.UUID) (DeleteAIGatewayKeyRow, error) {
+ row := q.db.QueryRowContext(ctx, deleteAIGatewayKey, id)
+ var i DeleteAIGatewayKeyRow
+ err := row.Scan(
+ &i.ID,
+ &i.Name,
+ &i.SecretPrefix,
+ &i.CreatedAt,
+ &i.LastUsedAt,
+ )
+ return i, err
+}
+
+const insertAIGatewayKey = `-- name: InsertAIGatewayKey :one
+INSERT INTO ai_gateway_keys (id, name, secret_prefix, hashed_secret, created_at)
+VALUES ($1, $4, $2, $3, NOW())
+RETURNING id, name, secret_prefix, created_at
+`
+
+type InsertAIGatewayKeyParams struct {
+ ID uuid.UUID `db:"id" json:"id"`
+ SecretPrefix string `db:"secret_prefix" json:"secret_prefix"`
+ HashedSecret []byte `db:"hashed_secret" json:"hashed_secret"`
+ Name string `db:"name" json:"name"`
+}
+
+type InsertAIGatewayKeyRow struct {
+ ID uuid.UUID `db:"id" json:"id"`
+ Name string `db:"name" json:"name"`
+ SecretPrefix string `db:"secret_prefix" json:"secret_prefix"`
+ CreatedAt time.Time `db:"created_at" json:"created_at"`
+}
+
+func (q *sqlQuerier) InsertAIGatewayKey(ctx context.Context, arg InsertAIGatewayKeyParams) (InsertAIGatewayKeyRow, error) {
+ row := q.db.QueryRowContext(ctx, insertAIGatewayKey,
+ arg.ID,
+ arg.SecretPrefix,
+ arg.HashedSecret,
+ arg.Name,
+ )
+ var i InsertAIGatewayKeyRow
+ err := row.Scan(
+ &i.ID,
+ &i.Name,
+ &i.SecretPrefix,
+ &i.CreatedAt,
+ )
+ return i, err
+}
+
+const listAIGatewayKeys = `-- name: ListAIGatewayKeys :many
+SELECT id, name, secret_prefix, created_at, last_used_at
+FROM ai_gateway_keys
+ORDER BY created_at ASC
+`
+
+type ListAIGatewayKeysRow struct {
+ ID uuid.UUID `db:"id" json:"id"`
+ Name string `db:"name" json:"name"`
+ SecretPrefix string `db:"secret_prefix" json:"secret_prefix"`
+ CreatedAt time.Time `db:"created_at" json:"created_at"`
+ LastUsedAt sql.NullTime `db:"last_used_at" json:"last_used_at"`
+}
+
+func (q *sqlQuerier) ListAIGatewayKeys(ctx context.Context) ([]ListAIGatewayKeysRow, error) {
+ rows, err := q.db.QueryContext(ctx, listAIGatewayKeys)
+ if err != nil {
+ return nil, err
+ }
+ defer rows.Close()
+ var items []ListAIGatewayKeysRow
+ for rows.Next() {
+ var i ListAIGatewayKeysRow
+ if err := rows.Scan(
+ &i.ID,
+ &i.Name,
+ &i.SecretPrefix,
+ &i.CreatedAt,
+ &i.LastUsedAt,
+ ); err != nil {
+ return nil, err
+ }
+ items = append(items, i)
+ }
+ if err := rows.Close(); err != nil {
+ return nil, err
+ }
+ if err := rows.Err(); err != nil {
+ return nil, err
+ }
+ return items, nil
+}
+
const deleteAIProviderKey = `-- name: DeleteAIProviderKey :exec
DELETE FROM
ai_provider_keys
diff --git a/coderd/database/queries/ai_gateway_keys.sql b/coderd/database/queries/ai_gateway_keys.sql
new file mode 100644
index 0000000000000..308d0cb89d1aa
--- /dev/null
+++ b/coderd/database/queries/ai_gateway_keys.sql
@@ -0,0 +1,13 @@
+-- name: InsertAIGatewayKey :one
+INSERT INTO ai_gateway_keys (id, name, secret_prefix, hashed_secret, created_at)
+VALUES ($1, @name, $2, $3, NOW())
+RETURNING id, name, secret_prefix, created_at;
+
+-- name: ListAIGatewayKeys :many
+SELECT id, name, secret_prefix, created_at, last_used_at
+FROM ai_gateway_keys
+ORDER BY created_at ASC;
+
+-- name: DeleteAIGatewayKey :one
+DELETE FROM ai_gateway_keys WHERE id = $1
+RETURNING id, name, secret_prefix, created_at, last_used_at;
From bfa6ce32a6a379dcaaeaffd28afa47c4f4c2d98a Mon Sep 17 00:00:00 2001
From: Spike Curtis
Date: Tue, 2 Jun 2026 07:53:24 -0400
Subject: [PATCH 028/112] test: batch 02 of refactoring CLI tests not to use
PTY (#25931)
Part of [coder/internal#1400](https://github.com/coder/internal/issues/1400)
Batch of refactored CLI tests to avoid creating PTYs.
---
cli/show_test.go | 18 ++--
cli/ssh_test.go | 204 +++++++++++++++++++++-------------------
cli/start_test.go | 82 ++++++++--------
cli/task_delete_test.go | 12 ++-
cli/task_list_test.go | 18 ++--
cli/task_pause_test.go | 20 ++--
cli/task_resume_test.go | 20 ++--
cli/task_send_test.go | 14 +--
8 files changed, 207 insertions(+), 181 deletions(-)
diff --git a/cli/show_test.go b/cli/show_test.go
index f07827340308e..cb4ab0293cb2e 100644
--- a/cli/show_test.go
+++ b/cli/show_test.go
@@ -15,14 +15,15 @@ import (
"github.com/coder/coder/v2/cli/cliui"
"github.com/coder/coder/v2/coderd/coderdtest"
"github.com/coder/coder/v2/codersdk"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
func TestShow(t *testing.T) {
t.Parallel()
t.Run("Exists", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
@@ -39,7 +40,8 @@ func TestShow(t *testing.T) {
inv, root := clitest.New(t, args...)
clitest.SetupConfig(t, member, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitShort)
go func() {
defer close(doneChan)
@@ -58,9 +60,9 @@ func TestShow(t *testing.T) {
{match: "coder ssh " + workspace.Name},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
+ stdout.ExpectMatchContext(ctx, m.match)
if len(m.write) > 0 {
- pty.WriteLine(m.write)
+ stdin.WriteLine(m.write)
}
}
_ = testutil.TryReceive(ctx, t, doneChan)
@@ -71,6 +73,7 @@ func TestShow(t *testing.T) {
// UUID and fetched by ID (which 404s).
t.Run("WorkspaceWithUUIDLikeName", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
@@ -92,7 +95,8 @@ func TestShow(t *testing.T) {
inv, root := clitest.New(t, args...)
clitest.SetupConfig(t, member, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitShort)
go func() {
defer close(doneChan)
@@ -111,9 +115,9 @@ func TestShow(t *testing.T) {
{match: "coder ssh " + workspace.Name},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
+ stdout.ExpectMatchContext(ctx, m.match)
if len(m.write) > 0 {
- pty.WriteLine(m.write)
+ stdin.WriteLine(m.write)
}
}
_ = testutil.TryReceive(ctx, t, doneChan)
diff --git a/cli/ssh_test.go b/cli/ssh_test.go
index 6b8392060c721..0cf5a83665e61 100644
--- a/cli/ssh_test.go
+++ b/cli/ssh_test.go
@@ -55,8 +55,8 @@ import (
"github.com/coder/coder/v2/provisioner/echo"
"github.com/coder/coder/v2/provisionersdk/proto"
"github.com/coder/coder/v2/pty"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
func setupWorkspaceForAgent(t *testing.T, mutations ...func([]*proto.Agent) []*proto.Agent) (*codersdk.Client, database.WorkspaceTable, string) {
@@ -82,10 +82,12 @@ func TestSSH(t *testing.T) {
t.Run("ImmediateExit", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client, workspace, agentToken := setupWorkspaceForAgent(t)
inv, root := clitest.New(t, "ssh", workspace.Name)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancel()
@@ -94,13 +96,13 @@ func TestSSH(t *testing.T) {
err := inv.WithContext(ctx).Run()
assert.NoError(t, err)
})
- pty.ExpectMatch("Waiting")
+ stdout.ExpectMatchContext(ctx, "Waiting")
_ = agenttest.New(t, client.URL, agentToken)
coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
// Shells on Mac, Windows, and Linux all exit shells with the "exit" command.
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
<-cmdDone
})
t.Run("WorkspaceNameInput", func(t *testing.T) {
@@ -121,6 +123,7 @@ func TestSSH(t *testing.T) {
for _, tc := range cases {
t.Run(tc, func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancel()
@@ -128,19 +131,20 @@ func TestSSH(t *testing.T) {
inv, root := clitest.New(t, "ssh", tc)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
cmdDone := tGo(t, func() {
err := inv.WithContext(ctx).Run()
assert.NoError(t, err)
})
- pty.ExpectMatch("Waiting")
+ stdout.ExpectMatchContext(ctx, "Waiting")
_ = agenttest.New(t, client.URL, agentToken)
coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
// Shells on Mac, Windows, and Linux all exit shells with the "exit" command.
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
<-cmdDone
})
}
@@ -148,6 +152,7 @@ func TestSSH(t *testing.T) {
t.Run("StartStoppedWorkspace", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
authToken := uuid.NewString()
ownerClient := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, ownerClient)
@@ -168,7 +173,7 @@ func TestSSH(t *testing.T) {
// SSH to the workspace which should autostart it
inv, root := clitest.New(t, "ssh", workspace.Name)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitSuperLong)
defer cancel()
@@ -192,7 +197,7 @@ func TestSSH(t *testing.T) {
coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
// Shells on Mac, Windows, and Linux all exit shells with the "exit" command.
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
<-cmdDone
})
t.Run("StartStoppedWorkspaceConflict", func(t *testing.T) {
@@ -253,21 +258,20 @@ func TestSSH(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitMedium)
defer cancel()
- var ptys []*ptytest.PTY
+ var stdouts []*expecter.Expecter
for i := 0; i < 3; i++ {
// SSH to the workspace which should autostart it
inv, root := clitest.New(t, "ssh", workspace.Name)
- pty := ptytest.New(t).Attach(inv)
- ptys = append(ptys, pty)
+ stdouts = append(stdouts, expecter.NewAttachedToInvocation(t, inv))
clitest.SetupConfig(t, client, root)
testutil.Go(t, func() {
_ = inv.WithContext(ctx).Run()
})
}
- for _, pty := range ptys {
- pty.ExpectMatchContext(ctx, "Workspace was stopped, starting workspace to allow connecting to")
+ for _, stdout := range stdouts {
+ stdout.ExpectMatchContext(ctx, "Workspace was stopped, starting workspace to allow connecting to")
}
// Allow one build to complete.
@@ -275,15 +279,15 @@ func TestSSH(t *testing.T) {
testutil.TryReceive(ctx, t, buildDone)
// Allow the remaining builds to continue.
- for i := 0; i < len(ptys)-1; i++ {
+ for i := 0; i < len(stdouts)-1; i++ {
testutil.RequireSend(ctx, t, buildPause, false)
}
var foundConflict int
- for _, pty := range ptys {
+ for _, stdout := range stdouts {
// Either allow the command to start the workspace or fail
// due to conflict (race), in which case it retries.
- match := pty.ExpectRegexMatchContext(ctx, "Waiting for the workspace agent to connect")
+ match := stdout.ExpectRegexMatchContext(ctx, "Waiting for the workspace agent to connect")
if strings.Contains(match, "Unable to start the workspace due to conflict, the workspace may be starting, retrying without autostart...") {
foundConflict++
}
@@ -293,6 +297,7 @@ func TestSSH(t *testing.T) {
t.Run("RequireActiveVersion", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
authToken := uuid.NewString()
ownerClient := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, ownerClient)
@@ -334,7 +339,7 @@ func TestSSH(t *testing.T) {
// SSH to the workspace which should auto-update and autostart it
inv, root := clitest.New(t, "ssh", workspace.Name)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancel()
@@ -350,7 +355,7 @@ func TestSSH(t *testing.T) {
coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
// Shells on Mac, Windows, and Linux all exit shells with the "exit" command.
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
<-cmdDone
// Double-check if workspace's template version is up-to-date
@@ -374,10 +379,7 @@ func TestSSH(t *testing.T) {
})
inv, root := clitest.New(t, "ssh", workspace.Name)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t)
- inv.Stdin = pty.Input()
- inv.Stderr = pty.Output()
- inv.Stdout = pty.Output()
+ stdout := expecter.NewAttachedToInvocation(t, inv)
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancel()
@@ -386,7 +388,7 @@ func TestSSH(t *testing.T) {
err := inv.WithContext(ctx).Run()
assert.ErrorIs(t, err, cliui.ErrCanceled)
})
- pty.ExpectMatch(wantURL)
+ stdout.ExpectMatchContext(ctx, wantURL)
cancel()
<-cmdDone
})
@@ -397,6 +399,7 @@ func TestSSH(t *testing.T) {
t.Skip("Windows doesn't seem to clean up the process, maybe #7100 will fix it")
}
+ logger := testutil.Logger(t)
store, ps := dbtestutil.NewDB(t)
client := coderdtest.New(t, &coderdtest.Options{Pubsub: ps, Database: store})
client.SetLogger(testutil.Logger(t).Named("client"))
@@ -408,7 +411,8 @@ func TestSSH(t *testing.T) {
}).WithAgent().Do()
inv, root := clitest.New(t, "ssh", r.Workspace.Name)
clitest.SetupConfig(t, userClient, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancel()
@@ -417,14 +421,14 @@ func TestSSH(t *testing.T) {
err := inv.WithContext(ctx).Run()
assert.Error(t, err)
})
- pty.ExpectMatch("Waiting")
+ stdout.ExpectMatchContext(ctx, "Waiting")
_ = agenttest.New(t, client.URL, r.AgentToken)
coderdtest.AwaitWorkspaceAgents(t, client, r.Workspace.ID)
// Ensure the agent is connected.
- pty.WriteLine("echo hell'o'")
- pty.ExpectMatchContext(ctx, "hello")
+ stdin.WriteLine("echo hell'o'")
+ stdout.ExpectMatchContext(ctx, "hello")
_ = dbfake.WorkspaceBuild(t, store, r.Workspace).
Seed(database.WorkspaceBuild{
@@ -1121,6 +1125,7 @@ func TestSSH(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client, workspace, agentToken := setupWorkspaceForAgent(t)
_ = agenttest.New(t, client.URL, agentToken)
@@ -1168,8 +1173,8 @@ func TestSSH(t *testing.T) {
"--identity-agent", agentSock, // Overrides $SSH_AUTH_SOCK.
)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
- inv.Stderr = pty.Output()
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
cmdDone := tGo(t, func() {
err := inv.WithContext(ctx).Run()
assert.NoError(t, err, "ssh command failed")
@@ -1177,21 +1182,21 @@ func TestSSH(t *testing.T) {
// Wait for the prompt or any output really to indicate the command has
// started and accepting input on stdin.
- _ = pty.Peek(ctx, 1)
+ _ = stdout.Peek(ctx, 1)
// Ensure that SSH_AUTH_SOCK is set.
// Linux: /tmp/auth-agent3167016167/listener.sock
// macOS: /var/folders/ng/m1q0wft14hj0t3rtjxrdnzsr0000gn/T/auth-agent3245553419/listener.sock
- pty.WriteLine(`env | grep SSH_AUTH_SOCK=`)
- pty.ExpectMatch("SSH_AUTH_SOCK=")
+ stdin.WriteLine(`env | grep SSH_AUTH_SOCK=`)
+ stdout.ExpectMatchContext(ctx, "SSH_AUTH_SOCK=")
// Ensure that ssh-add lists our key.
- pty.WriteLine("ssh-add -L")
+ stdin.WriteLine("ssh-add -L")
keys, err := kr.List()
require.NoError(t, err, "list keys failed")
- pty.ExpectMatch(keys[0].String())
+ stdout.ExpectMatchContext(ctx, keys[0].String())
// And we're done.
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
<-cmdDone
})
@@ -1259,6 +1264,7 @@ func TestSSH(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client, workspace, agentToken := setupWorkspaceForAgent(t)
_ = agenttest.New(t, client.URL, agentToken)
coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
@@ -1271,8 +1277,8 @@ func TestSSH(t *testing.T) {
)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
- inv.Stderr = pty.Output()
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
// Wait super long so this doesn't flake on -race test.
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitSuperLong)
@@ -1284,15 +1290,15 @@ func TestSSH(t *testing.T) {
// Since something was output, it should be safe to write input.
// This could show a prompt or "running startup scripts", so it's
// not indicative of the SSH connection being ready.
- _ = pty.Peek(ctx, 1)
+ _ = stdout.Peek(ctx, 1)
// Ensure the SSH connection is ready by testing the shell
// input/output.
- pty.WriteLine("echo $foo $baz")
- pty.ExpectMatchContext(ctx, "bar qux")
+ stdin.WriteLine("echo $foo $baz")
+ stdout.ExpectMatchContext(ctx, "bar qux")
// And we're done.
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
})
t.Run("RemoteForwardUnixSocket", func(t *testing.T) {
@@ -1302,6 +1308,7 @@ func TestSSH(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client, workspace, agentToken := setupWorkspaceForAgent(t)
_ = agenttest.New(t, client.URL, agentToken)
@@ -1321,8 +1328,8 @@ func TestSSH(t *testing.T) {
fmt.Sprintf("%s:%s", remoteSock, localSock),
)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
- inv.Stderr = pty.Output()
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
w := clitest.StartWithWaiter(t, inv.WithContext(ctx))
defer w.Wait() // We don't care about any exit error (exit code 255: SSH connection ended unexpectedly).
@@ -1330,12 +1337,12 @@ func TestSSH(t *testing.T) {
// Since something was output, it should be safe to write input.
// This could show a prompt or "running startup scripts", so it's
// not indicative of the SSH connection being ready.
- _ = pty.Peek(ctx, 1)
+ _ = stdout.Peek(ctx, 1)
// Ensure the SSH connection is ready by testing the shell
// input/output.
- pty.WriteLine("echo ping' 'pong")
- pty.ExpectMatchContext(ctx, "ping pong")
+ stdin.WriteLine("echo ping' 'pong")
+ stdout.ExpectMatchContext(ctx, "ping pong")
// Start the listener on the "local machine".
l, err := net.Listen("unix", localSock)
@@ -1378,7 +1385,7 @@ func TestSSH(t *testing.T) {
require.Equal(t, "hello world", string(buf))
// And we're done.
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
})
// Test that we can forward a local unix socket to a remote unix socket and
@@ -1391,6 +1398,7 @@ func TestSSH(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client, workspace, agentToken := setupWorkspaceForAgent(t)
_ = agenttest.New(t, client.URL, agentToken)
@@ -1440,8 +1448,8 @@ func TestSSH(t *testing.T) {
)
inv.Logger = inv.Logger.Named(id)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
- inv.Stderr = pty.Output()
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
cmdDone := tGo(t, func() {
err := inv.WithContext(ctx).Run()
assert.NoError(t, err, "ssh command failed: %s", id)
@@ -1450,12 +1458,12 @@ func TestSSH(t *testing.T) {
// Since something was output, it should be safe to write input.
// This could show a prompt or "running startup scripts", so it's
// not indicative of the SSH connection being ready.
- _ = pty.Peek(ctx, 1)
+ _ = stdout.Peek(ctx, 1)
// Ensure the SSH connection is ready by testing the shell
// input/output.
- pty.WriteLine("echo ping' 'pong")
- pty.ExpectMatchContext(ctx, "ping pong")
+ stdin.WriteLine("echo ping' 'pong")
+ stdout.ExpectMatchContext(ctx, "ping pong")
d := &net.Dialer{}
fd, err := d.DialContext(ctx, "unix", remoteSock)
@@ -1481,7 +1489,7 @@ func TestSSH(t *testing.T) {
assert.NoError(t, err, id)
assert.Equal(t, "hello world", string(buf), id)
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
<-cmdDone
return nil
})
@@ -1504,6 +1512,7 @@ func TestSSH(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client, workspace, agentToken := setupWorkspaceForAgent(t)
_ = agenttest.New(t, client.URL, agentToken)
@@ -1534,8 +1543,8 @@ func TestSSH(t *testing.T) {
inv, root := clitest.New(t, args...)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
- inv.Stderr = pty.Output()
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
w := clitest.StartWithWaiter(t, inv.WithContext(ctx))
defer w.Wait() // We don't care about any exit error (exit code 255: SSH connection ended unexpectedly).
@@ -1543,12 +1552,12 @@ func TestSSH(t *testing.T) {
// Since something was output, it should be safe to write input.
// This could show a prompt or "running startup scripts", so it's
// not indicative of the SSH connection being ready.
- _ = pty.Peek(ctx, 1)
+ _ = stdout.Peek(ctx, 1)
// Ensure the SSH connection is ready by testing the shell
// input/output.
- pty.WriteLine("echo ping' 'pong")
- pty.ExpectMatchContext(ctx, "ping pong")
+ stdin.WriteLine("echo ping' 'pong")
+ stdout.ExpectMatchContext(ctx, "ping pong")
for i, sock := range sockets {
// Start the listener on the "local machine".
@@ -1593,27 +1602,30 @@ func TestSSH(t *testing.T) {
}
// And we're done.
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
})
t.Run("FileLogging", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
logDir := t.TempDir()
client, workspace, agentToken := setupWorkspaceForAgent(t)
inv, root := clitest.New(t, "ssh", "-l", logDir, workspace.Name)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ ctx := testutil.Context(t, testutil.WaitMedium)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
w := clitest.StartWithWaiter(t, inv)
- pty.ExpectMatch("Waiting")
+ stdout.ExpectMatchContext(ctx, "Waiting")
agenttest.New(t, client.URL, agentToken)
coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
// Shells on Mac, Windows, and Linux all exit shells with the "exit" command.
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
w.RequireSuccess()
ents, err := os.ReadDir(logDir)
@@ -1681,6 +1693,7 @@ func TestSSH(t *testing.T) {
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
dv := coderdtest.DeploymentValues(t)
if tc.experiment {
dv.Experiments = []string{string(codersdk.ExperimentWorkspaceUsage)}
@@ -1703,7 +1716,8 @@ func TestSSH(t *testing.T) {
agentToken := r.AgentToken
inv, root := clitest.New(t, "ssh", workspace.Name, fmt.Sprintf("--usage-app=%s", tc.usageAppName))
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancel()
@@ -1712,13 +1726,13 @@ func TestSSH(t *testing.T) {
err := inv.WithContext(ctx).Run()
assert.NoError(t, err)
})
- pty.ExpectMatch("Waiting")
+ stdout.ExpectMatchContext(ctx, "Waiting")
_ = agenttest.New(t, client.URL, agentToken)
coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
// Shells on Mac, Windows, and Linux all exit shells with the "exit" command.
- pty.WriteLine("exit")
+ stdin.WriteLine("exit")
<-cmdDone
require.EqualValues(t, tc.expectedCalls, batcher.Called)
@@ -1974,16 +1988,15 @@ Expire-Date: 0
})
coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
+ logger := testutil.Logger(t)
inv, root := clitest.New(t,
"ssh",
workspace.Name,
"--forward-gpg",
)
clitest.SetupConfig(t, client, root)
- tpty := ptytest.New(t)
- inv.Stdin = tpty.Input()
- inv.Stdout = tpty.Output()
- inv.Stderr = tpty.Output()
+ invOut := expecter.NewAttachedToInvocation(t, inv)
+ invIn := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
cmdDone := tGo(t, func() {
err := inv.WithContext(ctx).Run()
assert.NoError(t, err, "ssh command failed")
@@ -1997,24 +2010,24 @@ Expire-Date: 0
// Wait for the prompt or any output really to indicate the command has
// started and accepting input on stdin.
- _ = tpty.Peek(ctx, 1)
+ _ = invOut.Peek(ctx, 1)
- tpty.WriteLine("echo hello 'world'")
- tpty.ExpectMatch("hello world")
+ invIn.WriteLine("echo hello 'world'")
+ invOut.ExpectMatchContext(ctx, "hello world")
// Check the GNUPGHOME was correctly inherited via shell.
- tpty.WriteLine("env && echo env-''-command-done")
- match := tpty.ExpectMatch("env--command-done")
+ invIn.WriteLine("env && echo env-''-command-done")
+ match := invOut.ExpectMatchContext(ctx, "env--command-done")
require.Contains(t, match, "GNUPGHOME="+gnupgHomeWorkspace, match)
// Get the agent extra socket path in the "workspace" via shell.
- tpty.WriteLine("gpgconf --list-dir agent-socket && echo gpgconf-''-agentsocket-command-done")
- tpty.ExpectMatch(workspaceAgentSocketPath)
- tpty.ExpectMatch("gpgconf--agentsocket-command-done")
+ invIn.WriteLine("gpgconf --list-dir agent-socket && echo gpgconf-''-agentsocket-command-done")
+ invOut.ExpectMatchContext(ctx, workspaceAgentSocketPath)
+ invOut.ExpectMatchContext(ctx, "gpgconf--agentsocket-command-done")
// List the keys in the "workspace".
- tpty.WriteLine("gpg --list-keys && echo gpg-''-listkeys-command-done")
- listKeysOutput := tpty.ExpectMatch("gpg--listkeys-command-done")
+ invIn.WriteLine("gpg --list-keys && echo gpg-''-listkeys-command-done")
+ listKeysOutput := invOut.ExpectMatchContext(ctx, "gpg--listkeys-command-done")
require.Contains(t, listKeysOutput, "[ultimate] Coder Test ")
// It's fine that this key is expired. We're just testing that the key trust
// gets synced properly.
@@ -2023,14 +2036,14 @@ Expire-Date: 0
// Try to sign something. This demonstrates that the forwarding is
// working as expected, since the workspace doesn't have access to the
// private key directly and must use the forwarded agent.
- tpty.WriteLine("echo 'hello world' | gpg --clearsign && echo gpg-''-sign-command-done")
- tpty.ExpectMatch("BEGIN PGP SIGNED MESSAGE")
- tpty.ExpectMatch("Hash:")
- tpty.ExpectMatch("hello world")
- tpty.ExpectMatch("gpg--sign-command-done")
+ invIn.WriteLine("echo 'hello world' | gpg --clearsign && echo gpg-''-sign-command-done")
+ invOut.ExpectMatchContext(ctx, "BEGIN PGP SIGNED MESSAGE")
+ invOut.ExpectMatchContext(ctx, "Hash:")
+ invOut.ExpectMatchContext(ctx, "hello world")
+ invOut.ExpectMatchContext(ctx, "gpg--sign-command-done")
// And we're done.
- tpty.WriteLine("exit")
+ invIn.WriteLine("exit")
<-cmdDone
}
@@ -2043,6 +2056,7 @@ func TestSSH_Container(t *testing.T) {
t.Run("OK", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client, workspace, agentToken := setupWorkspaceForAgent(t)
pool, err := dockertest.NewPool("")
require.NoError(t, err, "Could not connect to docker")
@@ -2076,7 +2090,8 @@ func TestSSH_Container(t *testing.T) {
inv, root := clitest.New(t, "ssh", workspace.Name, "-c", ct.Container.ID)
clitest.SetupConfig(t, client, root)
- ptty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitLong)
cmdDone := tGo(t, func() {
@@ -2084,10 +2099,10 @@ func TestSSH_Container(t *testing.T) {
assert.NoError(t, err)
})
- ptty.ExpectMatchContext(ctx, " #")
- ptty.WriteLine("hostname")
- ptty.ExpectMatchContext(ctx, ct.Container.Config.Hostname)
- ptty.WriteLine("exit")
+ stdout.ExpectMatchContext(ctx, " #")
+ stdin.WriteLine("hostname")
+ stdout.ExpectMatchContext(ctx, ct.Container.Config.Hostname)
+ stdin.WriteLine("exit")
<-cmdDone
})
@@ -2120,15 +2135,15 @@ func TestSSH_Container(t *testing.T) {
cID := uuid.NewString()
inv, root := clitest.New(t, "ssh", workspace.Name, "-c", cID)
clitest.SetupConfig(t, client, root)
- ptty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
cmdDone := tGo(t, func() {
err := inv.WithContext(ctx).Run()
assert.NoError(t, err)
})
- ptty.ExpectMatch(fmt.Sprintf("Container not found: %q", cID))
- ptty.ExpectMatch("Available containers: [something_completely_different]")
+ stdout.ExpectMatchContext(ctx, fmt.Sprintf("Container not found: %q", cID))
+ stdout.ExpectMatchContext(ctx, "Available containers: [something_completely_different]")
<-cmdDone
})
@@ -2163,7 +2178,6 @@ func TestSSH_CoderConnect(t *testing.T) {
client, workspace, agentToken := setupWorkspaceForAgent(t)
inv, root := clitest.New(t, "ssh", workspace.Name, "--network-info-dir", "/net", "--stdio")
clitest.SetupConfig(t, client, root)
- _ = ptytest.New(t).Attach(inv)
ctx = cli.WithTestOnlyCoderConnectDialer(ctx, &fakeCoderConnectDialer{})
ctx = withCoderConnectRunning(ctx)
diff --git a/cli/start_test.go b/cli/start_test.go
index 4a682a4309261..8e8ac70c0cfff 100644
--- a/cli/start_test.go
+++ b/cli/start_test.go
@@ -6,7 +6,6 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
- "golang.org/x/net/context"
"github.com/coder/coder/v2/cli/clitest"
"github.com/coder/coder/v2/coderd/coderdtest"
@@ -16,8 +15,8 @@ import (
"github.com/coder/coder/v2/codersdk"
"github.com/coder/coder/v2/provisioner/echo"
"github.com/coder/coder/v2/provisionersdk/proto"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
const (
@@ -109,6 +108,7 @@ func TestStart(t *testing.T) {
t.Run("BuildOptions", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
@@ -132,7 +132,9 @@ func TestStart(t *testing.T) {
inv, root := clitest.New(t, "start", workspace.Name, "--prompt-ephemeral-parameters")
clitest.SetupConfig(t, member, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
+ ctx := testutil.Context(t, testutil.WaitMedium)
go func() {
defer close(doneChan)
err := inv.Run()
@@ -146,18 +148,15 @@ func TestStart(t *testing.T) {
for i := 0; i < len(matches); i += 2 {
match := matches[i]
value := matches[i+1]
- pty.ExpectMatch(match)
+ stdout.ExpectMatchContext(ctx, match)
if value != "" {
- pty.WriteLine(value)
+ stdin.WriteLine(value)
}
}
<-doneChan
// Verify if ephemeral parameter is set
- ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
- defer cancel()
-
workspace, err := client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{})
require.NoError(t, err)
actualParameters, err := client.WorkspaceBuildParameters(ctx, workspace.LatestBuild.ID)
@@ -195,20 +194,18 @@ func TestStart(t *testing.T) {
"--ephemeral-parameter", fmt.Sprintf("%s=%s", ephemeralParameterName, ephemeralParameterValue))
clitest.SetupConfig(t, member, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ ctx := testutil.Context(t, testutil.WaitMedium)
go func() {
defer close(doneChan)
err := inv.Run()
assert.NoError(t, err)
}()
- pty.ExpectMatch("workspace has been started")
+ stdout.ExpectMatchContext(ctx, "workspace has been started")
<-doneChan
// Verify if ephemeral parameter is set
- ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
- defer cancel()
-
workspace, err := client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{})
require.NoError(t, err)
actualParameters, err := client.WorkspaceBuildParameters(ctx, workspace.LatestBuild.ID)
@@ -251,20 +248,18 @@ func TestStartWithParameters(t *testing.T) {
inv, root := clitest.New(t, "start", workspace.Name)
clitest.SetupConfig(t, member, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ ctx := testutil.Context(t, testutil.WaitMedium)
go func() {
defer close(doneChan)
err := inv.Run()
assert.NoError(t, err)
}()
- pty.ExpectMatch("workspace has been started")
+ stdout.ExpectMatchContext(ctx, "workspace has been started")
<-doneChan
// Verify if immutable parameter is set
- ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
- defer cancel()
-
workspace, err := client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{})
require.NoError(t, err)
actualParameters, err := client.WorkspaceBuildParameters(ctx, workspace.LatestBuild.ID)
@@ -278,6 +273,7 @@ func TestStartWithParameters(t *testing.T) {
t.Run("AlwaysPrompt", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
// Create the workspace
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
@@ -303,7 +299,9 @@ func TestStartWithParameters(t *testing.T) {
inv, root := clitest.New(t, "start", workspace.Name, "--always-prompt")
clitest.SetupConfig(t, member, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
+ ctx := testutil.Context(t, testutil.WaitMedium)
go func() {
defer close(doneChan)
err := inv.Run()
@@ -311,15 +309,12 @@ func TestStartWithParameters(t *testing.T) {
}()
newValue := "xyz"
- pty.ExpectMatch(mutableParameterName)
- pty.WriteLine(newValue)
- pty.ExpectMatch("workspace has been started")
+ stdout.ExpectMatchContext(ctx, mutableParameterName)
+ stdin.WriteLine(newValue)
+ stdout.ExpectMatchContext(ctx, "workspace has been started")
<-doneChan
// Verify that the updated values are persisted.
- ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
- defer cancel()
-
workspace, err := client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{})
require.NoError(t, err)
actualParameters, err := client.WorkspaceBuildParameters(ctx, workspace.LatestBuild.ID)
@@ -368,7 +363,7 @@ func TestStartUseParameterDefaults(t *testing.T) {
// The new parameter should be auto-accepted.
inv, root := clitest.New(t, "start", workspace.Name, "--use-parameter-defaults")
clitest.SetupConfig(t, member, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
doneChan := make(chan struct{})
go func() {
defer close(doneChan)
@@ -376,7 +371,7 @@ func TestStartUseParameterDefaults(t *testing.T) {
assert.NoError(t, err)
}()
- pty.ExpectMatchContext(ctx, "workspace has been started")
+ stdout.ExpectMatchContext(ctx, "workspace has been started")
_ = testutil.TryReceive(ctx, t, doneChan)
// Verify the new parameter was resolved to its default.
@@ -420,6 +415,7 @@ func TestStartAutoUpdate(t *testing.T) {
t.Run(c.Name, func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
@@ -446,15 +442,17 @@ func TestStartAutoUpdate(t *testing.T) {
inv, root := clitest.New(t, c.Cmd, "-y", workspace.Name)
clitest.SetupConfig(t, member, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
+ ctx := testutil.Context(t, testutil.WaitMedium)
go func() {
defer close(doneChan)
err := inv.Run()
assert.NoError(t, err)
}()
- pty.ExpectMatch(stringParameterName)
- pty.WriteLine(stringParameterValue)
+ stdout.ExpectMatchContext(ctx, stringParameterName)
+ stdin.WriteLine(stringParameterValue)
<-doneChan
workspace = coderdtest.MustWorkspace(t, member, workspace.ID)
@@ -478,14 +476,14 @@ func TestStart_AlreadyRunning(t *testing.T) {
inv, root := clitest.New(t, "start", r.Workspace.Name)
clitest.SetupConfig(t, memberClient, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
go func() {
defer close(doneChan)
err := inv.Run()
assert.NoError(t, err)
}()
- pty.ExpectMatch("workspace is already running")
+ stdout.ExpectMatchContext(ctx, "workspace is already running")
_ = testutil.TryReceive(ctx, t, doneChan)
}
@@ -507,17 +505,17 @@ func TestStart_Starting(t *testing.T) {
inv, root := clitest.New(t, "start", r.Workspace.Name)
clitest.SetupConfig(t, memberClient, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
go func() {
defer close(doneChan)
err := inv.Run()
assert.NoError(t, err)
}()
- pty.ExpectMatch("workspace is already starting")
+ stdout.ExpectMatchContext(ctx, "workspace is already starting")
_ = dbfake.JobComplete(t, store, r.Build.JobID).Pubsub(ps).Do()
- pty.ExpectMatch("workspace has been started")
+ stdout.ExpectMatchContext(ctx, "workspace has been started")
_ = testutil.TryReceive(ctx, t, doneChan)
}
@@ -544,14 +542,14 @@ func TestStart_NoWait(t *testing.T) {
inv, root := clitest.New(t, "start", workspace.Name, "--no-wait")
clitest.SetupConfig(t, member, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
go func() {
defer close(doneChan)
err := inv.Run()
assert.NoError(t, err)
}()
- pty.ExpectMatch("workspace has been started in no-wait mode")
+ stdout.ExpectMatchContext(ctx, "workspace has been started in no-wait mode")
_ = testutil.TryReceive(ctx, t, doneChan)
}
@@ -577,14 +575,14 @@ func TestStart_WithReason(t *testing.T) {
inv, root := clitest.New(t, "start", workspace.Name, "--reason", "cli")
clitest.SetupConfig(t, member, root)
doneChan := make(chan struct{})
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
go func() {
defer close(doneChan)
err := inv.Run()
assert.NoError(t, err)
}()
- pty.ExpectMatch("workspace has been started")
+ stdout.ExpectMatchContext(ctx, "workspace has been started")
_ = testutil.TryReceive(ctx, t, doneChan)
workspace = coderdtest.MustWorkspace(t, member, workspace.ID)
@@ -628,7 +626,7 @@ func TestStart_FailedStartCleansUp(t *testing.T) {
inv, root := clitest.New(t, "start", workspace.Name)
clitest.SetupConfig(t, memberClient, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
doneChan := make(chan struct{})
go func() {
defer close(doneChan)
@@ -637,8 +635,8 @@ func TestStart_FailedStartCleansUp(t *testing.T) {
}()
// The CLI should detect the failed start and clean up first.
- pty.ExpectMatch("Cleaning up before retrying")
- pty.ExpectMatch("workspace has been started")
+ stdout.ExpectMatchContext(ctx, "Cleaning up before retrying")
+ stdout.ExpectMatchContext(ctx, "workspace has been started")
_ = testutil.TryReceive(ctx, t, doneChan)
}
diff --git a/cli/task_delete_test.go b/cli/task_delete_test.go
index 2d28845c73d3d..c105f9f0fa0b5 100644
--- a/cli/task_delete_test.go
+++ b/cli/task_delete_test.go
@@ -15,8 +15,8 @@ import (
"github.com/coder/coder/v2/cli/clitest"
"github.com/coder/coder/v2/coderd/httpapi"
"github.com/coder/coder/v2/codersdk"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
func TestExpTaskDelete(t *testing.T) {
@@ -186,6 +186,7 @@ func TestExpTaskDelete(t *testing.T) {
t.Parallel()
ctx := testutil.Context(t, testutil.WaitMedium)
+ logger := testutil.Logger(t)
var counters testCounters
srv := httptest.NewServer(tc.buildHandler(&counters))
@@ -201,12 +202,13 @@ func TestExpTaskDelete(t *testing.T) {
var runErr error
var outBuf bytes.Buffer
if tc.promptYes {
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
w := clitest.StartWithWaiter(t, inv)
- pty.ExpectMatch("Delete these tasks:")
- pty.WriteLine("yes")
+ stdout.ExpectMatchContext(ctx, "Delete these tasks:")
+ stdin.WriteLine("yes")
runErr = w.Wait()
- outBuf.Write(pty.ReadAll())
+ outBuf.Write(stdout.ReadAll())
} else {
inv.Stdout = &outBuf
inv.Stderr = &outBuf
diff --git a/cli/task_list_test.go b/cli/task_list_test.go
index 4a055efeb054e..6e2b984dd9426 100644
--- a/cli/task_list_test.go
+++ b/cli/task_list_test.go
@@ -20,8 +20,8 @@ import (
"github.com/coder/coder/v2/coderd/database/dbfake"
"github.com/coder/coder/v2/coderd/util/slice"
"github.com/coder/coder/v2/codersdk"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
// makeAITask creates an AI-task workspace.
@@ -71,13 +71,13 @@ func TestExpTaskList(t *testing.T) {
inv, root := clitest.New(t, "task", "list")
clitest.SetupConfig(t, memberClient, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
ctx := testutil.Context(t, testutil.WaitShort)
err := inv.WithContext(ctx).Run()
require.NoError(t, err)
- pty.ExpectMatch("No tasks found.")
+ stdout.ExpectMatchContext(ctx, "No tasks found.")
})
t.Run("Single_Table", func(t *testing.T) {
@@ -95,16 +95,16 @@ func TestExpTaskList(t *testing.T) {
inv, root := clitest.New(t, "task", "list", "--column", "id,name,status,initial prompt")
clitest.SetupConfig(t, memberClient, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
ctx := testutil.Context(t, testutil.WaitShort)
err := inv.WithContext(ctx).Run()
require.NoError(t, err)
// Validate the table includes the task and status.
- pty.ExpectMatch(task.Name)
- pty.ExpectMatch("initializing")
- pty.ExpectMatch(wantPrompt)
+ stdout.ExpectMatchContext(ctx, task.Name)
+ stdout.ExpectMatchContext(ctx, "initializing")
+ stdout.ExpectMatchContext(ctx, wantPrompt)
})
t.Run("StatusFilter_JSON", func(t *testing.T) {
@@ -156,13 +156,13 @@ func TestExpTaskList(t *testing.T) {
//nolint:gocritic // Owner client is intended here smoke test the member task not showing up.
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
ctx := testutil.Context(t, testutil.WaitShort)
err := inv.WithContext(ctx).Run()
require.NoError(t, err)
- pty.ExpectMatch(task.Name)
+ stdout.ExpectMatchContext(ctx, task.Name)
})
t.Run("Quiet", func(t *testing.T) {
diff --git a/cli/task_pause_test.go b/cli/task_pause_test.go
index 83151a8457069..a8e24d130f24d 100644
--- a/cli/task_pause_test.go
+++ b/cli/task_pause_test.go
@@ -8,8 +8,8 @@ import (
"github.com/coder/coder/v2/cli/clitest"
"github.com/coder/coder/v2/codersdk"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
func TestExpTaskPause(t *testing.T) {
@@ -67,6 +67,7 @@ func TestExpTaskPause(t *testing.T) {
t.Run("PromptConfirm", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
// Given: A running task
setupCtx := testutil.Context(t, testutil.WaitLong)
setup := setupCLITaskTest(setupCtx, t, nil)
@@ -78,13 +79,14 @@ func TestExpTaskPause(t *testing.T) {
// And: We confirm we want to pause the task
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
w := clitest.StartWithWaiter(t, inv)
- pty.ExpectMatchContext(ctx, "Pause task")
- pty.WriteLine("yes")
+ stdout.ExpectMatchContext(ctx, "Pause task")
+ stdin.WriteLine("yes")
// Then: We expect the task to be paused
- pty.ExpectMatchContext(ctx, "has been paused")
+ stdout.ExpectMatchContext(ctx, "has been paused")
require.NoError(t, w.Wait())
updated, err := setup.userClient.TaskByIdentifier(ctx, setup.task.Name)
@@ -95,6 +97,7 @@ func TestExpTaskPause(t *testing.T) {
t.Run("PromptDecline", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
// Given: A running task
setupCtx := testutil.Context(t, testutil.WaitLong)
setup := setupCLITaskTest(setupCtx, t, nil)
@@ -106,10 +109,11 @@ func TestExpTaskPause(t *testing.T) {
// But: We say no at the confirmation screen
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
w := clitest.StartWithWaiter(t, inv)
- pty.ExpectMatchContext(ctx, "Pause task")
- pty.WriteLine("no")
+ stdout.ExpectMatchContext(ctx, "Pause task")
+ stdin.WriteLine("no")
require.Error(t, w.Wait())
// Then: We expect the task to not be paused
diff --git a/cli/task_resume_test.go b/cli/task_resume_test.go
index 8ed8c42ecec51..94ebd0fa9748a 100644
--- a/cli/task_resume_test.go
+++ b/cli/task_resume_test.go
@@ -9,8 +9,8 @@ import (
"github.com/coder/coder/v2/cli/clitest"
"github.com/coder/coder/v2/coderd/coderdtest"
"github.com/coder/coder/v2/codersdk"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
func TestExpTaskResume(t *testing.T) {
@@ -99,6 +99,7 @@ func TestExpTaskResume(t *testing.T) {
t.Run("PromptConfirm", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
// Given: A paused task
setupCtx := testutil.Context(t, testutil.WaitLong)
setup := setupCLITaskTest(setupCtx, t, nil)
@@ -111,13 +112,14 @@ func TestExpTaskResume(t *testing.T) {
// And: We confirm we want to resume the task
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
w := clitest.StartWithWaiter(t, inv)
- pty.ExpectMatchContext(ctx, "Resume task")
- pty.WriteLine("yes")
+ stdout.ExpectMatchContext(ctx, "Resume task")
+ stdin.WriteLine("yes")
// Then: We expect the task to be resumed
- pty.ExpectMatchContext(ctx, "has been resumed")
+ stdout.ExpectMatchContext(ctx, "has been resumed")
require.NoError(t, w.Wait())
updated, err := setup.userClient.TaskByIdentifier(ctx, setup.task.Name)
@@ -128,6 +130,7 @@ func TestExpTaskResume(t *testing.T) {
t.Run("PromptDecline", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
// Given: A paused task
setupCtx := testutil.Context(t, testutil.WaitLong)
setup := setupCLITaskTest(setupCtx, t, nil)
@@ -140,10 +143,11 @@ func TestExpTaskResume(t *testing.T) {
// But: Say no at the confirmation screen
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
w := clitest.StartWithWaiter(t, inv)
- pty.ExpectMatchContext(ctx, "Resume task")
- pty.WriteLine("no")
+ stdout.ExpectMatchContext(ctx, "Resume task")
+ stdin.WriteLine("no")
require.Error(t, w.Wait())
// Then: We expect the task to still be paused
diff --git a/cli/task_send_test.go b/cli/task_send_test.go
index 1590bcab292e2..e32f43524299d 100644
--- a/cli/task_send_test.go
+++ b/cli/task_send_test.go
@@ -19,8 +19,8 @@ import (
"github.com/coder/coder/v2/coderd/httpapi"
"github.com/coder/coder/v2/codersdk"
"github.com/coder/coder/v2/codersdk/agentsdk"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
"github.com/coder/quartz"
)
@@ -151,13 +151,13 @@ func Test_TaskSend(t *testing.T) {
// Use a pty so we can wait for the command to produce build
// output, confirming it has entered the initializing code
// path before we connect the agent.
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
w := clitest.StartWithWaiter(t, inv)
// Wait for the command to observe the initializing state and
// start watching the workspace build. This ensures the command
// has entered the waiting code path.
- pty.ExpectMatchContext(ctx, "Queued")
+ stdout.ExpectMatchContext(ctx, "Queued")
// Connect a new agent so the task can transition to active.
agentClient := agentsdk.New(setup.userClient.URL, agentsdk.WithFixedToken(setup.agentToken))
@@ -203,12 +203,12 @@ func Test_TaskSend(t *testing.T) {
// Use a pty so we can wait for the command to produce build
// output, confirming it has entered the paused code path and
// triggered a resume before we connect the agent.
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
w := clitest.StartWithWaiter(t, inv)
// Wait for the command to observe the paused state, trigger
// a resume, and start watching the workspace build.
- pty.ExpectMatchContext(ctx, "Queued")
+ stdout.ExpectMatchContext(ctx, "Queued")
// Connect a new agent so the task can transition to active.
agentClient := agentsdk.New(setup.userClient.URL, agentsdk.WithFixedToken(setup.agentToken))
@@ -260,12 +260,12 @@ func Test_TaskSend(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitLong)
inv = inv.WithContext(ctx)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
w := clitest.StartWithWaiter(t, inv)
// Wait for the command to enter the build-watching phase
// of waitForTaskIdle.
- pty.ExpectMatchContext(ctx, "Waiting for task to become idle")
+ stdout.ExpectMatchContext(ctx, "Waiting for task to become idle")
// Wait for ticker creation and release it.
tickCall := tickTrap.MustWait(ctx)
From 93b067f5f21b3c2fd366a3919bb69700ed3b6684 Mon Sep 17 00:00:00 2001
From: Spike Curtis
Date: Tue, 2 Jun 2026 08:05:26 -0400
Subject: [PATCH 029/112] test: batch 03 of refactoring CLI tests not to use
PTY (#25935)
Part of [coder/internal#1400](https://github.com/coder/internal/issues/1400)
Batch of refactored CLI tests to avoid creating PTYs.
---
cli/templatecreate_test.go | 48 +++++----
cli/templatedelete_test.go | 28 ++++--
cli/templateinit_test.go | 4 -
cli/templatelist_test.go | 14 ++-
cli/templatepresets_test.go | 28 +++---
cli/templatepull_test.go | 14 +--
cli/templatepush_test.go | 189 ++++++++++++++++++++----------------
7 files changed, 184 insertions(+), 141 deletions(-)
diff --git a/cli/templatecreate_test.go b/cli/templatecreate_test.go
index 093ca6e0cc037..bd0f9db0bf496 100644
--- a/cli/templatecreate_test.go
+++ b/cli/templatecreate_test.go
@@ -14,14 +14,16 @@ import (
"github.com/coder/coder/v2/coderd/database"
"github.com/coder/coder/v2/provisioner/echo"
"github.com/coder/coder/v2/provisionersdk/proto"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
func TestCliTemplateCreate(t *testing.T) {
t.Parallel()
t.Run("Create", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
+ ctx := testutil.Context(t, testutil.WaitMedium)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
coderdtest.CreateFirstUser(t, client)
source := clitest.CreateTemplateVersionSource(t, completeWithAgent())
@@ -35,7 +37,8 @@ func TestCliTemplateCreate(t *testing.T) {
}
inv, root := clitest.New(t, args...)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
clitest.Start(t, inv)
@@ -49,14 +52,16 @@ func TestCliTemplateCreate(t *testing.T) {
{match: "Confirm create?", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatch(m.match)
+ stdout.ExpectMatchContext(ctx, m.match)
if len(m.write) > 0 {
- pty.WriteLine(m.write)
+ stdin.WriteLine(m.write)
}
}
})
t.Run("CreateNoLockfile", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
+ ctx := testutil.Context(t, testutil.WaitMedium)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
coderdtest.CreateFirstUser(t, client)
source := clitest.CreateTemplateVersionSource(t, completeWithAgent())
@@ -71,7 +76,8 @@ func TestCliTemplateCreate(t *testing.T) {
}
inv, root := clitest.New(t, args...)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
execDone := make(chan error)
go func() {
@@ -86,9 +92,9 @@ func TestCliTemplateCreate(t *testing.T) {
{match: "Upload", write: "no"},
}
for _, m := range matches {
- pty.ExpectMatch(m.match)
+ stdout.ExpectMatchContext(ctx, m.match)
if len(m.write) > 0 {
- pty.WriteLine(m.write)
+ stdin.WriteLine(m.write)
}
}
@@ -97,6 +103,7 @@ func TestCliTemplateCreate(t *testing.T) {
})
t.Run("CreateNoLockfileIgnored", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
coderdtest.CreateFirstUser(t, client)
source := clitest.CreateTemplateVersionSource(t, completeWithAgent())
@@ -112,7 +119,8 @@ func TestCliTemplateCreate(t *testing.T) {
}
inv, root := clitest.New(t, args...)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
execDone := make(chan error)
go func() {
@@ -123,8 +131,8 @@ func TestCliTemplateCreate(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitMedium)
defer cancel()
- pty.ExpectNoMatchBefore(ctx, "No .terraform.lock.hcl file found", "Upload")
- pty.WriteLine("no")
+ stdout.ExpectNoMatchBefore(ctx, "No .terraform.lock.hcl file found", "Upload")
+ stdin.WriteLine("no")
}
// cmd should error once we say no.
@@ -148,9 +156,7 @@ func TestCliTemplateCreate(t *testing.T) {
}
inv, root := clitest.New(t, args...)
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t)
inv.Stdin = bytes.NewReader(source)
- inv.Stdout = pty.Output()
require.NoError(t, inv.Run())
})
@@ -199,6 +205,8 @@ func TestCliTemplateCreate(t *testing.T) {
t.Run("WithVariablesFileWithTheRequiredValue", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
+ ctx := testutil.Context(t, testutil.WaitMedium)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
coderdtest.CreateFirstUser(t, client)
@@ -227,7 +235,8 @@ func TestCliTemplateCreate(t *testing.T) {
_, _ = variablesFile.WriteString(`first_variable: foobar`)
inv, root := clitest.New(t, "templates", "create", "my-template", "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--variables-file", variablesFile.Name())
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
clitest.Start(t, inv)
@@ -239,15 +248,17 @@ func TestCliTemplateCreate(t *testing.T) {
{match: "Confirm create?", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatch(m.match)
+ stdout.ExpectMatchContext(ctx, m.match)
if len(m.write) > 0 {
- pty.WriteLine(m.write)
+ stdin.WriteLine(m.write)
}
}
})
t.Run("WithVariableOption", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
+ ctx := testutil.Context(t, testutil.WaitMedium)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
coderdtest.CreateFirstUser(t, client)
@@ -264,7 +275,8 @@ func TestCliTemplateCreate(t *testing.T) {
createEchoResponsesWithTemplateVariables(templateVariables))
inv, root := clitest.New(t, "templates", "create", "my-template", "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--variable", "first_variable=foobar")
clitest.SetupConfig(t, client, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
clitest.Start(t, inv)
@@ -276,9 +288,9 @@ func TestCliTemplateCreate(t *testing.T) {
{match: "Confirm create?", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatch(m.match)
+ stdout.ExpectMatchContext(ctx, m.match)
if len(m.write) > 0 {
- pty.WriteLine(m.write)
+ stdin.WriteLine(m.write)
}
}
})
diff --git a/cli/templatedelete_test.go b/cli/templatedelete_test.go
index 1472fc5331435..a98be32e29200 100644
--- a/cli/templatedelete_test.go
+++ b/cli/templatedelete_test.go
@@ -13,7 +13,8 @@ import (
"github.com/coder/coder/v2/coderd/coderdtest"
"github.com/coder/coder/v2/coderd/rbac"
"github.com/coder/coder/v2/codersdk"
- "github.com/coder/coder/v2/pty/ptytest"
+ "github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
"github.com/coder/pretty"
)
@@ -23,6 +24,8 @@ func TestTemplateDelete(t *testing.T) {
t.Run("Ok", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
+ ctx := testutil.Context(t, testutil.WaitMedium)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -33,15 +36,16 @@ func TestTemplateDelete(t *testing.T) {
inv, root := clitest.New(t, "templates", "delete", template.Name)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
execDone := make(chan error)
go func() {
execDone <- inv.Run()
}()
- pty.ExpectMatch(fmt.Sprintf("Delete these templates: %s?", pretty.Sprint(cliui.DefaultStyles.Code, template.Name)))
- pty.WriteLine("yes")
+ stdout.ExpectMatchContext(ctx, fmt.Sprintf("Delete these templates: %s?", pretty.Sprint(cliui.DefaultStyles.Code, template.Name)))
+ stdin.WriteLine("yes")
require.NoError(t, <-execDone)
@@ -78,6 +82,8 @@ func TestTemplateDelete(t *testing.T) {
t.Run("Multiple prompted", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
+ ctx := testutil.Context(t, testutil.WaitMedium)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -93,15 +99,18 @@ func TestTemplateDelete(t *testing.T) {
inv, root := clitest.New(t, append([]string{"templates", "delete"}, templateNames...)...)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
execDone := make(chan error)
go func() {
execDone <- inv.Run()
}()
- pty.ExpectMatch(fmt.Sprintf("Delete these templates: %s?", pretty.Sprint(cliui.DefaultStyles.Code, strings.Join(templateNames, ", "))))
- pty.WriteLine("yes")
+ stdout.ExpectMatchContext(ctx,
+ fmt.Sprintf("Delete these templates: %s?",
+ pretty.Sprint(cliui.DefaultStyles.Code, strings.Join(templateNames, ", "))))
+ stdin.WriteLine("yes")
require.NoError(t, <-execDone)
@@ -114,6 +123,7 @@ func TestTemplateDelete(t *testing.T) {
t.Run("Selector", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -124,14 +134,14 @@ func TestTemplateDelete(t *testing.T) {
inv, root := clitest.New(t, "templates", "delete")
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
execDone := make(chan error)
go func() {
execDone <- inv.Run()
}()
- pty.WriteLine("yes")
+ stdin.WriteLine("yes")
require.NoError(t, <-execDone)
_, err := client.Template(context.Background(), template.ID)
diff --git a/cli/templateinit_test.go b/cli/templateinit_test.go
index f8172df25f560..b878ef7813e9d 100644
--- a/cli/templateinit_test.go
+++ b/cli/templateinit_test.go
@@ -7,7 +7,6 @@ import (
"github.com/stretchr/testify/require"
"github.com/coder/coder/v2/cli/clitest"
- "github.com/coder/coder/v2/pty/ptytest"
)
func TestTemplateInit(t *testing.T) {
@@ -16,7 +15,6 @@ func TestTemplateInit(t *testing.T) {
t.Parallel()
tempDir := t.TempDir()
inv, _ := clitest.New(t, "templates", "init", tempDir)
- ptytest.New(t).Attach(inv)
clitest.Run(t, inv)
files, err := os.ReadDir(tempDir)
require.NoError(t, err)
@@ -27,7 +25,6 @@ func TestTemplateInit(t *testing.T) {
t.Parallel()
tempDir := t.TempDir()
inv, _ := clitest.New(t, "templates", "init", "--id", "docker", tempDir)
- ptytest.New(t).Attach(inv)
clitest.Run(t, inv)
files, err := os.ReadDir(tempDir)
require.NoError(t, err)
@@ -38,7 +35,6 @@ func TestTemplateInit(t *testing.T) {
t.Parallel()
tempDir := t.TempDir()
inv, _ := clitest.New(t, "templates", "init", "--id", "thistemplatedoesnotexist", tempDir)
- ptytest.New(t).Attach(inv)
err := inv.Run()
require.ErrorContains(t, err, "invalid choice: thistemplatedoesnotexist, should be one of")
files, err := os.ReadDir(tempDir)
diff --git a/cli/templatelist_test.go b/cli/templatelist_test.go
index 6818b81ca974b..60e6c7a3462c4 100644
--- a/cli/templatelist_test.go
+++ b/cli/templatelist_test.go
@@ -13,8 +13,8 @@ import (
"github.com/coder/coder/v2/coderd/coderdtest"
"github.com/coder/coder/v2/coderd/rbac"
"github.com/coder/coder/v2/codersdk"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
func TestTemplateList(t *testing.T) {
@@ -35,7 +35,7 @@ func TestTemplateList(t *testing.T) {
inv, root := clitest.New(t, "templates", "list")
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
ctx, cancelFunc := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancelFunc()
@@ -52,7 +52,7 @@ func TestTemplateList(t *testing.T) {
require.NoError(t, <-errC)
for _, name := range templatesList {
- pty.ExpectMatch(name)
+ stdout.ExpectMatchContext(ctx, name)
}
})
t.Run("ListTemplatesJSON", func(t *testing.T) {
@@ -93,9 +93,7 @@ func TestTemplateList(t *testing.T) {
inv, root := clitest.New(t, "templates", "list")
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t)
- inv.Stdin = pty.Input()
- inv.Stderr = pty.Output()
+ stdout := expecter.NewAttachedToInvocation(t, inv)
ctx, cancelFunc := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancelFunc()
@@ -107,7 +105,7 @@ func TestTemplateList(t *testing.T) {
require.NoError(t, <-errC)
- pty.ExpectMatch("No templates found")
- pty.ExpectMatch("Create one:")
+ stdout.ExpectMatchContext(ctx, "No templates found")
+ stdout.ExpectMatchContext(ctx, "Create one:")
})
}
diff --git a/cli/templatepresets_test.go b/cli/templatepresets_test.go
index 4b324692b8c00..893c37b0ea4f9 100644
--- a/cli/templatepresets_test.go
+++ b/cli/templatepresets_test.go
@@ -14,8 +14,8 @@ import (
"github.com/coder/coder/v2/codersdk"
"github.com/coder/coder/v2/provisioner/echo"
"github.com/coder/coder/v2/provisionersdk/proto"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
func TestTemplatePresets(t *testing.T) {
@@ -24,6 +24,7 @@ func TestTemplatePresets(t *testing.T) {
t.Run("NoPresets", func(t *testing.T) {
t.Parallel()
+ ctx := testutil.Context(t, testutil.WaitMedium)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
@@ -37,7 +38,7 @@ func TestTemplatePresets(t *testing.T) {
inv, root := clitest.New(t, "templates", "presets", "list", template.Name)
clitest.SetupConfig(t, member, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
doneChan := make(chan struct{})
var runErr error
go func() {
@@ -49,12 +50,13 @@ func TestTemplatePresets(t *testing.T) {
// Should return a message when no presets are found for the given template and version.
notFoundMessage := fmt.Sprintf("No presets found for template %q and template-version %q.", template.Name, version.Name)
- pty.ExpectRegexMatch(notFoundMessage)
+ stdout.ExpectRegexMatchContext(ctx, notFoundMessage)
})
t.Run("ListsPresetsForDefaultTemplateVersion", func(t *testing.T) {
t.Parallel()
+ ctx := testutil.Context(t, testutil.WaitMedium)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
@@ -104,7 +106,7 @@ func TestTemplatePresets(t *testing.T) {
inv, root := clitest.New(t, "templates", "presets", "list", template.Name)
clitest.SetupConfig(t, member, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
doneChan := make(chan struct{})
var runErr error
go func() {
@@ -117,11 +119,11 @@ func TestTemplatePresets(t *testing.T) {
// Should: return the active version's presets sorted by name
message := fmt.Sprintf("Showing presets for template %q and template version %q.", template.Name, version.Name)
- pty.ExpectMatch(message)
- pty.ExpectRegexMatch(`preset-default\s+k1=v2\s+true\s+0`)
+ stdout.ExpectMatchContext(ctx, message)
+ stdout.ExpectRegexMatchContext(ctx, `preset-default\s+k1=v2\s+true\s+0`)
// The parameter order is not guaranteed in the output, so we match both possible orders
- pty.ExpectRegexMatch(`preset-multiple-params\s+(k1=v1,k2=v2)|(k2=v2,k1=v1)\s+false\s+-`)
- pty.ExpectRegexMatch(`preset-prebuilds\s+Preset without parameters and 2 prebuild instances.\s+\s+false\s+2`)
+ stdout.ExpectRegexMatchContext(ctx, `preset-multiple-params\s+(k1=v1,k2=v2)|(k2=v2,k1=v1)\s+false\s+-`)
+ stdout.ExpectRegexMatchContext(ctx, `preset-prebuilds\s+Preset without parameters and 2 prebuild instances.\s+\s+false\s+2`)
})
t.Run("ListsPresetsForSpecifiedTemplateVersion", func(t *testing.T) {
@@ -196,7 +198,7 @@ func TestTemplatePresets(t *testing.T) {
inv, root := clitest.New(t, "templates", "presets", "list", updatedTemplate.Name, "--template-version", version.Name)
clitest.SetupConfig(t, member, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
doneChan := make(chan struct{})
var runErr error
go func() {
@@ -209,11 +211,11 @@ func TestTemplatePresets(t *testing.T) {
// Should: return the specified version's presets sorted by name
message := fmt.Sprintf("Showing presets for template %q and template version %q.", template.Name, version.Name)
- pty.ExpectMatch(message)
- pty.ExpectRegexMatch(`preset-default\s+k1=v2\s+true\s+0`)
+ stdout.ExpectMatchContext(ctx, message)
+ stdout.ExpectRegexMatchContext(ctx, `preset-default\s+k1=v2\s+true\s+0`)
// The parameter order is not guaranteed in the output, so we match both possible orders
- pty.ExpectRegexMatch(`preset-multiple-params\s+(k1=v1,k2=v2)|(k2=v2,k1=v1)\s+false\s+-`)
- pty.ExpectRegexMatch(`preset-prebuilds\s+Preset without parameters and 2 prebuild instances.\s+\s+false\s+2`)
+ stdout.ExpectRegexMatchContext(ctx, `preset-multiple-params\s+(k1=v1,k2=v2)|(k2=v2,k1=v1)\s+false\s+-`)
+ stdout.ExpectRegexMatchContext(ctx, `preset-prebuilds\s+Preset without parameters and 2 prebuild instances.\s+\s+false\s+2`)
})
t.Run("ListsPresetsJSON", func(t *testing.T) {
diff --git a/cli/templatepull_test.go b/cli/templatepull_test.go
index 5d999de15ed02..5495bf0637618 100644
--- a/cli/templatepull_test.go
+++ b/cli/templatepull_test.go
@@ -21,7 +21,8 @@ import (
"github.com/coder/coder/v2/provisioner/echo"
"github.com/coder/coder/v2/provisionersdk"
"github.com/coder/coder/v2/provisionersdk/proto"
- "github.com/coder/coder/v2/pty/ptytest"
+ "github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
// dirSum calculates a checksum of the files in a directory.
@@ -320,8 +321,6 @@ func TestTemplatePull_ToDir(t *testing.T) {
inv, root := clitest.New(t, "templates", "pull", template.Name, actualDest)
clitest.SetupConfig(t, templateAdmin, root)
- ptytest.New(t).Attach(inv)
-
require.NoError(t, inv.Run())
// Validate behavior of choosing template name in the absence of an output path argument.
@@ -343,6 +342,8 @@ func TestTemplatePull_ToDir(t *testing.T) {
func TestTemplatePull_FolderConflict(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
+ ctx := testutil.Context(t, testutil.WaitMedium)
client := coderdtest.New(t, &coderdtest.Options{
IncludeProvisionerDaemon: true,
})
@@ -389,12 +390,13 @@ func TestTemplatePull_FolderConflict(t *testing.T) {
inv, root := clitest.New(t, "templates", "pull", template.Name, conflictDest)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
waiter := clitest.StartWithWaiter(t, inv)
- pty.ExpectMatch("not empty")
- pty.WriteLine("no")
+ stdout.ExpectMatchContext(ctx, "not empty")
+ stdin.WriteLine("no")
waiter.RequireError()
diff --git a/cli/templatepush_test.go b/cli/templatepush_test.go
index 55123f8890174..d93dc1d7cedc3 100644
--- a/cli/templatepush_test.go
+++ b/cli/templatepush_test.go
@@ -26,8 +26,8 @@ import (
"github.com/coder/coder/v2/provisioner/terraform/tfparse"
"github.com/coder/coder/v2/provisionersdk"
"github.com/coder/coder/v2/provisionersdk/proto"
- "github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
+ "github.com/coder/coder/v2/testutil/expecter"
)
func TestTemplatePush(t *testing.T) {
@@ -35,6 +35,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("OK", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -50,7 +51,8 @@ func TestTemplatePush(t *testing.T) {
})
inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", "example")
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -63,8 +65,8 @@ func TestTemplatePush(t *testing.T) {
{match: "Upload", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
- pty.WriteLine(m.write)
+ stdout.ExpectMatchContext(ctx, m.match)
+ stdin.WriteLine(m.write)
}
w.RequireSuccess()
@@ -97,13 +99,13 @@ func TestTemplatePush(t *testing.T) {
inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", "example", "--message", wantMessage, "--yes")
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
w := clitest.StartWithWaiter(t, inv)
- pty.ExpectNoMatchBefore(ctx, "Template message is longer than 72 characters", "Updated version at")
+ stdout.ExpectNoMatchBefore(ctx, "Template message is longer than 72 characters", "Updated version at")
w.RequireSuccess()
@@ -146,13 +148,13 @@ func TestTemplatePush(t *testing.T) {
"--yes",
)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
w := clitest.StartWithWaiter(t, inv)
- pty.ExpectMatchContext(ctx, tt.wantMatch)
+ stdout.ExpectMatchContext(ctx, tt.wantMatch)
w.RequireSuccess()
@@ -170,6 +172,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("NoLockfile", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -191,7 +194,8 @@ func TestTemplatePush(t *testing.T) {
"--name", "example",
)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -205,9 +209,9 @@ func TestTemplatePush(t *testing.T) {
{match: "Upload", write: "no"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
+ stdout.ExpectMatchContext(ctx, m.match)
if m.write != "" {
- pty.WriteLine(m.write)
+ stdin.WriteLine(m.write)
}
}
@@ -217,6 +221,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("NoLockfileIgnored", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -239,7 +244,8 @@ func TestTemplatePush(t *testing.T) {
"--ignore-lockfile",
)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -248,8 +254,8 @@ func TestTemplatePush(t *testing.T) {
{
ctx := testutil.Context(t, testutil.WaitMedium)
- pty.ExpectNoMatchBefore(ctx, "No .terraform.lock.hcl file found", "Upload")
- pty.WriteLine("no")
+ stdout.ExpectNoMatchBefore(ctx, "No .terraform.lock.hcl file found", "Upload")
+ stdin.WriteLine("no")
}
// cmd should error once we say no.
@@ -258,6 +264,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("PushInactiveTemplateVersion", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -278,7 +285,8 @@ func TestTemplatePush(t *testing.T) {
"--name", "example",
)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
w := clitest.StartWithWaiter(t, inv)
@@ -290,8 +298,8 @@ func TestTemplatePush(t *testing.T) {
{match: "Upload", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
- pty.WriteLine(m.write)
+ stdout.ExpectMatchContext(ctx, m.match)
+ stdin.WriteLine(m.write)
}
w.RequireSuccess()
@@ -309,11 +317,11 @@ func TestTemplatePush(t *testing.T) {
t.Run("UseWorkingDir", func(t *testing.T) {
t.Parallel()
-
if runtime.GOOS == "windows" {
t.Skip(`On Windows this test flakes with: "The process cannot access the file because it is being used by another process"`)
}
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -339,7 +347,8 @@ func TestTemplatePush(t *testing.T) {
"--force-tty",
)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -352,8 +361,8 @@ func TestTemplatePush(t *testing.T) {
{match: "Upload", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
- pty.WriteLine(m.write)
+ stdout.ExpectMatchContext(ctx, m.match)
+ stdin.WriteLine(m.write)
}
w.RequireSuccess()
@@ -390,9 +399,7 @@ func TestTemplatePush(t *testing.T) {
template.Name,
)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t)
inv.Stdin = bytes.NewReader(source)
- inv.Stdout = pty.Output()
execDone := make(chan error)
go func() {
@@ -539,7 +546,7 @@ func TestTemplatePush(t *testing.T) {
inv, root := clitest.New(t, "templates", "push", templateName, "-d", tempDir, "--yes")
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
setupCtx := testutil.Context(t, testutil.WaitMedium)
now := dbtime.Now()
@@ -561,7 +568,7 @@ func TestTemplatePush(t *testing.T) {
}, testutil.WaitShort, testutil.IntervalFast)
if tt.expectOutput != "" {
- pty.ExpectMatchContext(ctx, tt.expectOutput)
+ stdout.ExpectMatchContext(ctx, tt.expectOutput)
}
})
}
@@ -570,6 +577,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("ChangeTags", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
// Start the first provisioner
client, provisionerDocker, api := coderdtest.NewWithAPI(t, &coderdtest.Options{
IncludeProvisionerDaemon: true,
@@ -605,7 +613,8 @@ func TestTemplatePush(t *testing.T) {
inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", template.Name,
"--provisioner-tag", "foobar=foobaz")
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -618,8 +627,8 @@ func TestTemplatePush(t *testing.T) {
{match: "Upload", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
- pty.WriteLine(m.write)
+ stdout.ExpectMatchContext(ctx, m.match)
+ stdin.WriteLine(m.write)
}
w.RequireSuccess()
@@ -636,6 +645,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("DeleteTags", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
// Start the first provisioner with no tags.
client, provisionerDocker, api := coderdtest.NewWithAPI(t, &coderdtest.Options{
IncludeProvisionerDaemon: true,
@@ -671,7 +681,8 @@ func TestTemplatePush(t *testing.T) {
})
inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", template.Name, "--provisioner-tag=\"-\"")
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -684,8 +695,8 @@ func TestTemplatePush(t *testing.T) {
{match: "Upload", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
- pty.WriteLine(m.write)
+ stdout.ExpectMatchContext(ctx, m.match)
+ stdin.WriteLine(m.write)
}
w.RequireSuccess()
@@ -702,6 +713,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("DoNotChangeTags", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
// Start the tagged provisioner
client := coderdtest.New(t, &coderdtest.Options{
IncludeProvisionerDaemon: true,
@@ -728,7 +740,8 @@ func TestTemplatePush(t *testing.T) {
})
inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", template.Name)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -741,8 +754,8 @@ func TestTemplatePush(t *testing.T) {
{match: "Upload", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
- pty.WriteLine(m.write)
+ stdout.ExpectMatchContext(ctx, m.match)
+ stdin.WriteLine(m.write)
}
w.RequireSuccess()
@@ -773,6 +786,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("VariableIsRequired", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -803,9 +817,8 @@ func TestTemplatePush(t *testing.T) {
"--variables-file", variablesFile.Name(),
)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t)
- inv.Stdin = pty.Input()
- inv.Stdout = pty.Output()
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -818,8 +831,8 @@ func TestTemplatePush(t *testing.T) {
{match: "Upload", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
- pty.WriteLine(m.write)
+ stdout.ExpectMatchContext(ctx, m.match)
+ stdin.WriteLine(m.write)
}
w.RequireSuccess()
@@ -842,6 +855,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("VariableIsOptionalButNotProvided", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -868,9 +882,8 @@ func TestTemplatePush(t *testing.T) {
"--name", "example",
)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t)
- inv.Stdin = pty.Input()
- inv.Stdout = pty.Output()
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -883,8 +896,8 @@ func TestTemplatePush(t *testing.T) {
{match: "Upload", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
- pty.WriteLine(m.write)
+ stdout.ExpectMatchContext(ctx, m.match)
+ stdin.WriteLine(m.write)
}
w.RequireSuccess()
@@ -908,6 +921,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("WithVariableOption", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -935,9 +949,8 @@ func TestTemplatePush(t *testing.T) {
"--variable", "second_variable=foobar",
)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t)
- inv.Stdin = pty.Input()
- inv.Stdout = pty.Output()
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -950,8 +963,8 @@ func TestTemplatePush(t *testing.T) {
{match: "Upload", write: "yes"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
- pty.WriteLine(m.write)
+ stdout.ExpectMatchContext(ctx, m.match)
+ stdin.WriteLine(m.write)
}
w.RequireSuccess()
@@ -974,6 +987,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("CreateTemplate", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -989,7 +1003,8 @@ func TestTemplatePush(t *testing.T) {
}
inv, root := clitest.New(t, args...)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
@@ -1003,9 +1018,9 @@ func TestTemplatePush(t *testing.T) {
{match: "template has been created"},
}
for _, m := range matches {
- pty.ExpectMatchContext(ctx, m.match)
+ stdout.ExpectMatchContext(ctx, m.match)
if m.write != "" {
- pty.WriteLine(m.write)
+ stdin.WriteLine(m.write)
}
}
@@ -1056,6 +1071,7 @@ func TestTemplatePush(t *testing.T) {
t.Run("PromptForDifferentRequiredTypes", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -1091,37 +1107,39 @@ func TestTemplatePush(t *testing.T) {
source := clitest.CreateTemplateVersionSource(t, createEchoResponsesWithTemplateVariables(templateVariables))
inv, root := clitest.New(t, "templates", "push", "test-template", "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho))
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
w := clitest.StartWithWaiter(t, inv)
// Select "Yes" for the "Upload " prompt
- pty.ExpectMatchContext(ctx, "Upload")
- pty.WriteLine("yes")
+ stdout.ExpectMatchContext(ctx, "Upload")
+ stdin.WriteLine("yes")
// Variables are prompted in alphabetical order.
// Boolean variable automatically selects the first option ("true")
- pty.ExpectMatchContext(ctx, "var.bool_var")
+ stdout.ExpectMatchContext(ctx, "var.bool_var")
- pty.ExpectMatchContext(ctx, "var.number_var")
- pty.ExpectMatchContext(ctx, "Enter value:")
- pty.WriteLine("42")
+ stdout.ExpectMatchContext(ctx, "var.number_var")
+ stdout.ExpectMatchContext(ctx, "Enter value:")
+ stdin.WriteLine("42")
- pty.ExpectMatchContext(ctx, "var.sensitive_var")
- pty.ExpectMatchContext(ctx, "Enter value:")
- pty.WriteLine("secret-value")
+ stdout.ExpectMatchContext(ctx, "var.sensitive_var")
+ stdout.ExpectMatchContext(ctx, "Enter value:")
+ stdin.WriteLine("secret-value")
- pty.ExpectMatchContext(ctx, "var.string_var")
- pty.ExpectMatchContext(ctx, "Enter value:")
- pty.WriteLine("test-string")
+ stdout.ExpectMatchContext(ctx, "var.string_var")
+ stdout.ExpectMatchContext(ctx, "Enter value:")
+ stdin.WriteLine("test-string")
w.RequireSuccess()
})
t.Run("ValidateNumberInput", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -1138,28 +1156,30 @@ func TestTemplatePush(t *testing.T) {
source := clitest.CreateTemplateVersionSource(t, createEchoResponsesWithTemplateVariables(templateVariables))
inv, root := clitest.New(t, "templates", "push", "test-template", "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho))
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
w := clitest.StartWithWaiter(t, inv)
// Select "Yes" for the "Upload " prompt
- pty.ExpectMatchContext(ctx, "Upload")
- pty.WriteLine("yes")
+ stdout.ExpectMatchContext(ctx, "Upload")
+ stdin.WriteLine("yes")
- pty.ExpectMatchContext(ctx, "var.number_var")
+ stdout.ExpectMatchContext(ctx, "var.number_var")
- pty.WriteLine("not-a-number")
- pty.ExpectMatchContext(ctx, "must be a valid number")
+ stdin.WriteLine("not-a-number")
+ stdout.ExpectMatchContext(ctx, "must be a valid number")
- pty.WriteLine("123.45")
+ stdin.WriteLine("123.45")
w.RequireSuccess()
})
t.Run("DontPromptForDefaultValues", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -1181,24 +1201,26 @@ func TestTemplatePush(t *testing.T) {
source := clitest.CreateTemplateVersionSource(t, createEchoResponsesWithTemplateVariables(templateVariables))
inv, root := clitest.New(t, "templates", "push", "test-template", "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho))
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
w := clitest.StartWithWaiter(t, inv)
// Select "Yes" for the "Upload " prompt
- pty.ExpectMatchContext(ctx, "Upload")
- pty.WriteLine("yes")
+ stdout.ExpectMatchContext(ctx, "Upload")
+ stdin.WriteLine("yes")
- pty.ExpectMatchContext(ctx, "var.without_default")
- pty.WriteLine("test-value")
+ stdout.ExpectMatchContext(ctx, "var.without_default")
+ stdin.WriteLine("test-value")
w.RequireSuccess()
})
t.Run("VariableSourcesPriority", func(t *testing.T) {
t.Parallel()
+ logger := testutil.Logger(t)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
owner := coderdtest.CreateFirstUser(t, client)
templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
@@ -1250,20 +1272,21 @@ cli_overrides_file_var: from-file`)
"--variable", "cli_overrides_file_var=from-cli-override",
)
clitest.SetupConfig(t, templateAdmin, root)
- pty := ptytest.New(t).Attach(inv)
+ stdout := expecter.NewAttachedToInvocation(t, inv)
+ stdin := testutil.NewWriterAttachedToInvocation(t, logger.Named("stdin"), inv)
ctx := testutil.Context(t, testutil.WaitMedium)
inv = inv.WithContext(ctx)
w := clitest.StartWithWaiter(t, inv)
// Select "Yes" for the "Upload " prompt
- pty.ExpectMatchContext(ctx, "Upload")
- pty.WriteLine("yes")
+ stdout.ExpectMatchContext(ctx, "Upload")
+ stdin.WriteLine("yes")
// Only check for prompt_var, other variables should not prompt
- pty.ExpectMatchContext(ctx, "var.prompt_var")
- pty.ExpectMatchContext(ctx, "Enter value:")
- pty.WriteLine("from-prompt")
+ stdout.ExpectMatchContext(ctx, "var.prompt_var")
+ stdout.ExpectMatchContext(ctx, "Enter value:")
+ stdin.WriteLine("from-prompt")
w.RequireSuccess()
From eea427f28890237580cdf37a3cfeb69e60134c6e Mon Sep 17 00:00:00 2001
From: Jaayden Halko
Date: Tue, 2 Jun 2026 21:22:15 +0800
Subject: [PATCH 030/112] fix: inline ports panel in workspace pill on mobile
(#25042)
closes CODAGT-326
On viewports below the `md` Tailwind breakpoint, the agents-chat
workspace pill becomes full width via the existing
`mobile-full-width-dropdown` CSS hook. The `Ports (X)` item used a Radix
`DropdownMenuSub` which opened a flyout sub-content to the right of the
parent menu, so on mobile the sub-content had nowhere to render and
clipped off the right edge.
Mirror the inline sub-panel pattern already used by the agent chat input
plus menu: lift a `view: "main" | "ports"` state into `WorkspacePill`,
and on mobile swap the same dropdown's contents to a `Back` + ports list
panel instead of opening a flyout. Desktop keeps the existing flyout
sub-menu unchanged.
Closes
[CODAGT-326](https://linear.app/codercom/issue/CODAGT-326/port-forward-menu-is-cut-off-on-mobile-viewports).
Visual coverage is added via two new Storybook stories at the `mobile1`
(375 px) viewport: `MobilePortsInlinePanel` (full interaction +
assertions) and `MobilePortsInlinePanelOpen` (visual / Chromatic capture
stop point).
Implementation plan
### Why
The dropdown content already gets full viewport width on `< 768 px` via
the `mobile-full-width-dropdown` CSS hook in `site/src/index.css`. A
Radix `DropdownMenuSub` opens to the right of its trigger, so on mobile
it has no room and clips. Forcing the sub-content to also be full-width
would overlap the parent and break keyboard / focus flow. The existing
convention for nested menus on mobile in this codebase is the inline
sub-panel (see `plusMenuView` in `AgentChatInput.tsx`).
### `WorkspacePill.tsx`
- Add `view: "main" | "ports"` state and reset to `"main"` on close.
- Extract `usePortsData(workspace, agent, enabled)` and a shared
`PortsList` so desktop sub-content and mobile inline panel share one
renderer.
- Replace `PortsSubMenuItem` with `PortsMenuItem`, which uses
`useIsBelowMdViewport()` to render either:
- **Mobile:** a regular `DropdownMenuItem` whose `onSelect` calls
`event.preventDefault()` (keeps the dropdown open) and switches to the
inline view.
- **Desktop:** the existing `DropdownMenuSub` flyout, behavior
unchanged.
- Add `MobilePortsPanel` rendered inside the parent
`DropdownMenuContent` when `view === "ports"`. Includes a `Back` item
that returns to the main view.
- Add a small reactive `useIsBelowMdViewport()` hook around the existing
`isBelowMdViewport` helper.
> Created on behalf of @jaayden by Coder Agents.
---
site/src/hooks/useIsBelowMdViewport.ts | 12 +
.../components/WorkspacePill.stories.tsx | 102 +++++
.../AgentsPage/components/WorkspacePill.tsx | 385 ++++++------------
.../components/WorkspacePillPorts.tsx | 329 +++++++++++++++
site/src/utils/mobile.ts | 4 +-
5 files changed, 571 insertions(+), 261 deletions(-)
create mode 100644 site/src/hooks/useIsBelowMdViewport.ts
create mode 100644 site/src/pages/AgentsPage/components/WorkspacePillPorts.tsx
diff --git a/site/src/hooks/useIsBelowMdViewport.ts b/site/src/hooks/useIsBelowMdViewport.ts
new file mode 100644
index 0000000000000..b6783bec3f47c
--- /dev/null
+++ b/site/src/hooks/useIsBelowMdViewport.ts
@@ -0,0 +1,12 @@
+import { useSyncExternalStore } from "react";
+import { belowMdViewportMediaQuery, isBelowMdViewport } from "#/utils/mobile";
+
+const subscribeBelowMdViewport = (onStoreChange: () => void) => {
+ const mediaQuery = window.matchMedia(belowMdViewportMediaQuery);
+ mediaQuery.addEventListener("change", onStoreChange);
+ return () => mediaQuery.removeEventListener("change", onStoreChange);
+};
+
+export const useIsBelowMdViewport = (): boolean => {
+ return useSyncExternalStore(subscribeBelowMdViewport, isBelowMdViewport);
+};
diff --git a/site/src/pages/AgentsPage/components/WorkspacePill.stories.tsx b/site/src/pages/AgentsPage/components/WorkspacePill.stories.tsx
index 062623f2acd00..4793830886169 100644
--- a/site/src/pages/AgentsPage/components/WorkspacePill.stories.tsx
+++ b/site/src/pages/AgentsPage/components/WorkspacePill.stories.tsx
@@ -478,3 +478,105 @@ export const EmptyPorts: Story = {
});
},
};
+
+const mobilePortsStoryConfig = {
+ args: {
+ ...defaultProps,
+ workspace: MockWorkspace,
+ agent: {
+ ...MockWorkspaceAgent,
+ name: "a-workspace-agent",
+ },
+ },
+ parameters: {
+ viewport: { defaultViewport: "mobile1" },
+ chromatic: { viewports: [375] },
+ queries: [
+ { key: ["me", "apiKey"], data: { key: "mock-api-key" } },
+ {
+ key: ["portForward", MockWorkspaceAgent.id],
+ data: MockListeningPortsResponse,
+ },
+ {
+ key: ["sharedPorts", MockWorkspace.id],
+ data: MockSharedPortsResponse,
+ },
+ ],
+ },
+} satisfies Partial;
+
+const openMobilePortsPanel = async (canvasElement: HTMLElement) => {
+ const canvas = within(canvasElement);
+ const pill = await canvas.findByRole("button", {
+ name: /workspace menu/,
+ });
+ await userEvent.click(pill);
+
+ const body = within(document.body);
+ const portsItem = await body.findByText(/Ports \(\d+\)/);
+ await userEvent.click(portsItem);
+
+ return { body, pill };
+};
+
+export const MobilePortsInlinePanel: Story = {
+ ...mobilePortsStoryConfig,
+ play: async ({ canvasElement }) => {
+ const { body, pill } = await openMobilePortsPanel(canvasElement);
+
+ await waitFor(() => {
+ expect(body.getByText("Listening Ports")).toBeInTheDocument();
+ expect(body.getByText("Shared Ports")).toBeInTheDocument();
+ expect(body.getByText("Manage sharing")).toBeInTheDocument();
+ expect(body.getByRole("menuitem", { name: /Back/ })).toHaveFocus();
+ expect(body.queryByText("View Workspace")).not.toBeInTheDocument();
+ });
+
+ const portsHeader = body.getByText("Listening Ports");
+ const dropdown: HTMLElement | null = portsHeader.closest(
+ "[data-radix-popper-content-wrapper]",
+ );
+ expect(dropdown).not.toBeNull();
+ if (dropdown === null) {
+ throw new Error("Expected dropdown wrapper to exist");
+ }
+ const rect = dropdown.getBoundingClientRect();
+ expect(rect.right).toBeLessThanOrEqual(innerWidth);
+ expect(rect.left).toBeGreaterThanOrEqual(0);
+
+ await userEvent.click(body.getByRole("menuitem", { name: /Back/ }));
+ await waitFor(() => {
+ expect(body.getByText("View Workspace")).toBeInTheDocument();
+ expect(body.getByRole("menuitem", { name: /Ports/ })).toHaveFocus();
+ expect(body.queryByText("Listening Ports")).not.toBeInTheDocument();
+ });
+
+ await userEvent.click(body.getByText(/Ports \(\d+\)/));
+ await waitFor(() => {
+ expect(body.getByText("Listening Ports")).toBeInTheDocument();
+ expect(body.getByRole("menuitem", { name: /Back/ })).toHaveFocus();
+ });
+
+ await userEvent.keyboard("{Escape}");
+ await waitFor(() => {
+ expect(body.queryByText("Listening Ports")).not.toBeInTheDocument();
+ });
+
+ await userEvent.click(pill);
+ await waitFor(() => {
+ expect(body.getByText("View Workspace")).toBeInTheDocument();
+ expect(body.queryByText("Listening Ports")).not.toBeInTheDocument();
+ });
+ },
+};
+
+export const MobilePortsInlinePanelOpen: Story = {
+ ...mobilePortsStoryConfig,
+ play: async ({ canvasElement }) => {
+ const { body } = await openMobilePortsPanel(canvasElement);
+
+ await waitFor(() => {
+ expect(body.getByText("Listening Ports")).toBeInTheDocument();
+ });
+ },
+};
diff --git a/site/src/pages/AgentsPage/components/WorkspacePill.tsx b/site/src/pages/AgentsPage/components/WorkspacePill.tsx
index e5032c390078a..98168f21e4df4 100644
--- a/site/src/pages/AgentsPage/components/WorkspacePill.tsx
+++ b/site/src/pages/AgentsPage/components/WorkspacePill.tsx
@@ -1,30 +1,21 @@
import {
- BuildingIcon,
ChevronDownIcon,
CopyIcon,
- ExternalLinkIcon,
LayoutGridIcon,
- LockIcon,
- LockOpenIcon,
MonitorIcon,
- NetworkIcon,
- RadioIcon,
SquareTerminalIcon,
UnlinkIcon,
} from "lucide-react";
import type { FC } from "react";
-import { useState } from "react";
-import { useMutation, useQuery } from "react-query";
+import { useEffect, useState } from "react";
+import { useMutation } from "react-query";
import { Link } from "react-router";
import { toast } from "sonner";
import { API } from "#/api/api";
import { getErrorMessage } from "#/api/errors";
-import { workspacePortShares } from "#/api/queries/workspaceportsharing";
import type {
Workspace,
WorkspaceAgent,
- WorkspaceAgentListeningPort,
- WorkspaceAgentPortShare,
WorkspaceApp,
} from "#/api/typesGenerated";
import {
@@ -32,9 +23,6 @@ import {
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
- DropdownMenuSub,
- DropdownMenuSubContent,
- DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from "#/components/DropdownMenu/DropdownMenu";
import { ExternalImage } from "#/components/ExternalImage/ExternalImage";
@@ -47,6 +35,7 @@ import {
} from "#/components/Tooltip/Tooltip";
import { useProxy } from "#/contexts/ProxyContext";
import { useClipboard } from "#/hooks/useClipboard";
+import { useIsBelowMdViewport } from "#/hooks/useIsBelowMdViewport";
import {
getTerminalHref,
getVSCodeHref,
@@ -56,11 +45,12 @@ import {
} from "#/modules/apps/apps";
import { useAppLink } from "#/modules/apps/useAppLink";
import { cn } from "#/utils/cn";
-import {
- getWorkspaceListeningPortsProtocol,
- portForwardURL,
-} from "#/utils/portForward";
import { getWorkspaceStatus, StatusIcon } from "./StatusIcon";
+import {
+ MobilePortsPanel,
+ PortsMenuItem,
+ usePortsData,
+} from "./WorkspacePillPorts";
interface WorkspacePillProps {
workspace: Workspace;
@@ -108,8 +98,36 @@ export const WorkspacePill: FC = ({
hasTerminal ||
portForwardingEnabled;
+ // Flyout sub-menus clip on mobile.
+ const [view, setView] = useState<"main" | "ports">("main");
+ const [focusPortsOnMain, setFocusPortsOnMain] = useState(false);
+ const isBelowMd = useIsBelowMdViewport();
+ const showPortsView = view === "ports" && isBelowMd;
+
+ const portsData = usePortsData(
+ workspace,
+ agent,
+ open && agent.status === "connected" && portForwardingEnabled,
+ );
+
+ useEffect(() => {
+ if (!isBelowMd && view === "ports") {
+ setView("main");
+ setFocusPortsOnMain(false);
+ }
+ }, [isBelowMd, view]);
+
return (
-
+ {
+ setOpen(next);
+ if (!next) {
+ setView("main");
+ setFocusPortsOnMain(false);
+ }
+ }}
+ >
= ({
align="start"
className="mobile-full-width-dropdown mobile-full-width-dropdown-bottom w-48 p-1 [&_[role=menuitem]]:text-xs [&_[role=menuitem]]:py-1 [&_svg]:!size-3.5 [&_img]:!size-3.5"
>
- {hasVSCode && (
-
- )}
- {hasVSCodeInsiders && (
-
- )}
- {userApps.map((app) => (
-
- ))}
- {hasTerminal && (
-
- )}
- {portForwardingEnabled && (
- {
+ setFocusPortsOnMain(true);
+ setView("main");
+ }}
/>
- )}
- {hasItemsAboveSeparator && }
-
- {sshCommand && }
-
-
-
- View Workspace
-
-
- {onRemoveWorkspace && (
+ ) : (
<>
-
-
-
- Detach workspace
+ {hasVSCode && (
+
+ )}
+ {hasVSCodeInsiders && (
+
+ )}
+ {userApps.map((app) => (
+
+ ))}
+ {hasTerminal && (
+
+ )}
+ {portForwardingEnabled && (
+ setFocusPortsOnMain(false)}
+ onSelectInline={() => {
+ setFocusPortsOnMain(false);
+ setView("ports");
+ }}
+ />
+ )}
+ {hasItemsAboveSeparator && (
+
+ )}
+
+ {sshCommand && }
+
+
+
+ View Workspace
+
+ {onRemoveWorkspace && (
+ <>
+
+
+
+ Detach workspace
+
+ >
+ )}
>
)}
@@ -229,183 +271,6 @@ export const WorkspacePill: FC = ({
);
};
-const PortsSubMenuItem: FC<{
- workspace: Workspace;
- agent: WorkspaceAgent;
- host: string;
- isOpen: boolean;
- isRunning: boolean;
-}> = ({ workspace, agent, host, isOpen, isRunning }) => {
- const route = `/@${workspace.owner_name}/${workspace.name}`;
- const isConnected = agent.status === "connected";
- const enabled = isOpen && isConnected;
-
- const protocol = getWorkspaceListeningPortsProtocol(workspace.id);
-
- const { data: listeningPorts } = useQuery({
- queryKey: ["portForward", agent.id],
- queryFn: () => API.getAgentListeningPorts(agent.id),
- enabled,
- refetchInterval: enabled ? 5_000 : false,
- staleTime: 0,
- select: (res) => res.ports,
- });
-
- const { data: sharedPorts } = useQuery({
- ...workspacePortShares(workspace.id),
- enabled,
- staleTime: 0,
- select: (res) => res.shares.filter((s) => s.agent_name === agent.name),
- });
-
- // Listening ports that haven't been explicitly shared appear in their own
- // section; shared ports bubble up to the "Shared" section.
- const sharedPortNumbers = new Set((sharedPorts ?? []).map((s) => s.port));
- const privateListeningPorts = (listeningPorts ?? []).filter(
- (p) => !sharedPortNumbers.has(p.port),
- );
-
- const totalCount =
- listeningPorts !== undefined ? listeningPorts.length : undefined;
-
- return (
-
-
-
- {totalCount !== undefined ? `Ports (${totalCount})` : "Ports"}
-
-
- {/* Listening Ports header: only render when there are ports to list. */}
- {privateListeningPorts.length > 0 && (
-
-
- Listening Ports
-
-
- )}
-
- {privateListeningPorts.map((port) => (
-
- ))}
-
- {listeningPorts !== undefined &&
- sharedPorts !== undefined &&
- privateListeningPorts.length === 0 &&
- sharedPorts.length === 0 && (
-
- No open ports detected.
-
- )}
-
- {/* Shared Ports */}
- {(sharedPorts ?? []).length > 0 && (
- <>
-
-
-
- Shared Ports
-
-
- {(sharedPorts ?? []).map((share) => (
-
- ))}
- >
- )}
-
-
-
-
-
- Manage sharing
-
-
-
-
- );
-};
-
-const ListeningPortItem: FC<{
- port: WorkspaceAgentListeningPort;
- host: string;
- agentName: string;
- workspaceName: string;
- ownerName: string;
- protocol: "http" | "https";
-}> = ({ port, host, agentName, workspaceName, ownerName, protocol }) => {
- const url = portForwardURL(
- host,
- port.port,
- agentName,
- workspaceName,
- ownerName,
- protocol,
- );
- return (
-
-
-
- {port.port}
- {port.process_name !== "" && (
-
- {port.process_name}
-
- )}
-
-
-
- );
-};
-
-const SharedPortItem: FC<{
- share: WorkspaceAgentPortShare;
- host: string;
- agentName: string;
- workspaceName: string;
- ownerName: string;
-}> = ({ share, host, agentName, workspaceName, ownerName }) => {
- const url = portForwardURL(
- host,
- share.port,
- agentName,
- workspaceName,
- ownerName,
- share.protocol,
- );
- const ShareIcon =
- share.share_level === "public"
- ? LockOpenIcon
- : share.share_level === "organization"
- ? BuildingIcon
- : LockIcon;
- return (
-
-
-
- {share.port}
-
- {share.share_level}
-
-
-
-
- );
-};
-
const VSCodeMenuItem: FC<{
variant: "vscode" | "vscode-insiders";
label: string;
diff --git a/site/src/pages/AgentsPage/components/WorkspacePillPorts.tsx b/site/src/pages/AgentsPage/components/WorkspacePillPorts.tsx
new file mode 100644
index 0000000000000..2d4a6f8742808
--- /dev/null
+++ b/site/src/pages/AgentsPage/components/WorkspacePillPorts.tsx
@@ -0,0 +1,329 @@
+import {
+ ArrowLeftIcon,
+ BuildingIcon,
+ ChevronRightIcon,
+ ExternalLinkIcon,
+ LockIcon,
+ LockOpenIcon,
+ NetworkIcon,
+ RadioIcon,
+} from "lucide-react";
+import type { FC } from "react";
+import { useEffect, useRef } from "react";
+import { useQuery } from "react-query";
+import { Link } from "react-router";
+import { API } from "#/api/api";
+import { workspacePortShares } from "#/api/queries/workspaceportsharing";
+import type {
+ Workspace,
+ WorkspaceAgent,
+ WorkspaceAgentListeningPort,
+ WorkspaceAgentPortShare,
+} from "#/api/typesGenerated";
+import {
+ DropdownMenuItem,
+ DropdownMenuSeparator,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+} from "#/components/DropdownMenu/DropdownMenu";
+import {
+ getWorkspaceListeningPortsProtocol,
+ portForwardURL,
+} from "#/utils/portForward";
+
+interface PortsData {
+ listeningPorts: readonly WorkspaceAgentListeningPort[] | undefined;
+ sharedPorts: readonly WorkspaceAgentPortShare[] | undefined;
+ privateListeningPorts: readonly WorkspaceAgentListeningPort[];
+ totalCount: number | undefined;
+ protocol: "http" | "https";
+}
+
+export const usePortsData = (
+ workspace: Workspace,
+ agent: WorkspaceAgent,
+ enabled: boolean,
+): PortsData => {
+ const protocol = getWorkspaceListeningPortsProtocol(workspace.id);
+
+ const { data: listeningPorts } = useQuery({
+ queryKey: ["portForward", agent.id],
+ queryFn: () => API.getAgentListeningPorts(agent.id),
+ enabled,
+ refetchInterval: enabled ? 5_000 : false,
+ staleTime: 0,
+ select: (res) => res.ports,
+ });
+
+ const { data: sharedPorts } = useQuery({
+ ...workspacePortShares(workspace.id),
+ enabled,
+ staleTime: 0,
+ select: (res) => res.shares.filter((s) => s.agent_name === agent.name),
+ });
+
+ // Listening ports that haven't been explicitly shared appear in their own
+ // section; shared ports bubble up to the "Shared" section.
+ const sharedPortNumbers = new Set((sharedPorts ?? []).map((s) => s.port));
+ const privateListeningPorts = (listeningPorts ?? []).filter(
+ (p) => !sharedPortNumbers.has(p.port),
+ );
+
+ const totalCount =
+ listeningPorts !== undefined ? listeningPorts.length : undefined;
+
+ return {
+ listeningPorts,
+ sharedPorts,
+ privateListeningPorts,
+ totalCount,
+ protocol,
+ };
+};
+
+export const PortsMenuItem: FC<{
+ workspace: Workspace;
+ agent: WorkspaceAgent;
+ host: string;
+ portsData: PortsData;
+ isRunning: boolean;
+ isBelowMd: boolean;
+ focusOnMount: boolean;
+ onFocusApplied: () => void;
+ onSelectInline: () => void;
+}> = ({
+ workspace,
+ agent,
+ host,
+ portsData,
+ isRunning,
+ isBelowMd,
+ focusOnMount,
+ onFocusApplied,
+ onSelectInline,
+}) => {
+ const itemRef = useRef(null);
+
+ const label =
+ portsData.totalCount !== undefined
+ ? `Ports (${portsData.totalCount})`
+ : "Ports";
+
+ useEffect(() => {
+ if (!focusOnMount || !isBelowMd) {
+ return;
+ }
+ itemRef.current?.focus();
+ onFocusApplied();
+ }, [focusOnMount, isBelowMd, onFocusApplied]);
+
+ if (isBelowMd) {
+ return (
+ {
+ event.preventDefault();
+ onSelectInline();
+ }}
+ >
+
+ {label}
+
+
+ );
+ }
+
+ return (
+
+
+
+ {label}
+
+
+
+
+
+ );
+};
+
+export const MobilePortsPanel: FC<{
+ workspace: Workspace;
+ agent: WorkspaceAgent;
+ host: string;
+ portsData: PortsData;
+ onBack: () => void;
+}> = ({ workspace, agent, host, portsData, onBack }) => {
+ const backRef = useRef(null);
+
+ useEffect(() => {
+ backRef.current?.focus();
+ }, []);
+
+ return (
+ <>
+ {
+ event.preventDefault();
+ onBack();
+ }}
+ >
+
+ Back
+
+
+
+ >
+ );
+};
+
+const PortsList: FC<{
+ host: string;
+ agent: WorkspaceAgent;
+ workspace: Workspace;
+ data: PortsData;
+}> = ({ host, agent, workspace, data }) => {
+ const route = `/@${workspace.owner_name}/${workspace.name}`;
+ const { listeningPorts, sharedPorts, privateListeningPorts, protocol } = data;
+
+ return (
+ <>
+ {privateListeningPorts.length > 0 && (
+
+
+ Listening Ports
+
+
+ )}
+
+ {privateListeningPorts.map((port) => (
+
+ ))}
+
+ {listeningPorts !== undefined &&
+ sharedPorts !== undefined &&
+ privateListeningPorts.length === 0 &&
+ sharedPorts.length === 0 && (
+
+ No open ports detected.
+
+ )}
+
+ {(sharedPorts ?? []).length > 0 && (
+ <>
+
+
+
+ Shared Ports
+
+
+ {(sharedPorts ?? []).map((share) => (
+
+ ))}
+ >
+ )}
+
+
+
+
+
+ Manage sharing
+
+
+ >
+ );
+};
+
+const ListeningPortItem: FC<{
+ port: WorkspaceAgentListeningPort;
+ host: string;
+ agentName: string;
+ workspaceName: string;
+ ownerName: string;
+ protocol: "http" | "https";
+}> = ({ port, host, agentName, workspaceName, ownerName, protocol }) => {
+ const url = portForwardURL(
+ host,
+ port.port,
+ agentName,
+ workspaceName,
+ ownerName,
+ protocol,
+ );
+ return (
+
+
+
+ {port.port}
+ {port.process_name !== "" && (
+
+ {port.process_name}
+
+ )}
+
+
+
+ );
+};
+
+const SharedPortItem: FC<{
+ share: WorkspaceAgentPortShare;
+ host: string;
+ agentName: string;
+ workspaceName: string;
+ ownerName: string;
+}> = ({ share, host, agentName, workspaceName, ownerName }) => {
+ const url = portForwardURL(
+ host,
+ share.port,
+ agentName,
+ workspaceName,
+ ownerName,
+ share.protocol,
+ );
+ const ShareIcon =
+ share.share_level === "public"
+ ? LockOpenIcon
+ : share.share_level === "organization"
+ ? BuildingIcon
+ : LockIcon;
+ return (
+
+
+
+ {share.port}
+
+ {share.share_level}
+
+
+
+
+ );
+};
diff --git a/site/src/utils/mobile.ts b/site/src/utils/mobile.ts
index dfc278c1b944b..dc44656d538b3 100644
--- a/site/src/utils/mobile.ts
+++ b/site/src/utils/mobile.ts
@@ -8,6 +8,8 @@ export const isMobileViewport = (): boolean => {
return window.matchMedia("(max-width: 639px)").matches;
};
+export const belowMdViewportMediaQuery = "(max-width: 767px)";
+
/**
* Returns `true` when the viewport width is below the `md` Tailwind
* breakpoint (< 768 px). Use this for layout branching that needs to
@@ -17,5 +19,5 @@ export const isMobileViewport = (): boolean => {
* mobile branch instead of the desktop flyout branch.
*/
export const isBelowMdViewport = (): boolean => {
- return window.matchMedia("(max-width: 767px)").matches;
+ return window.matchMedia(belowMdViewportMediaQuery).matches;
};
From d2697dc5b08ae9b3bd6b6783c964be99976b69d3 Mon Sep 17 00:00:00 2001
From: Steven Masley
Date: Tue, 2 Jun 2026 09:02:29 -0500
Subject: [PATCH 031/112] test: data race for TestAIGatewayKeysTableConstraints
- shadowed error (#25980)
Closes https://github.com/coder/coder/issues/25979
error is shadowed and shared by parallel subtests
---
coderd/database/querier_test.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/coderd/database/querier_test.go b/coderd/database/querier_test.go
index 984dd8a79ab89..12db95ad9d161 100644
--- a/coderd/database/querier_test.go
+++ b/coderd/database/querier_test.go
@@ -14828,7 +14828,7 @@ func TestAIGatewayKeysTableConstraints(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitShort)
- _, err = db.InsertAIGatewayKey(ctx, tc.params)
+ _, err := db.InsertAIGatewayKey(ctx, tc.params)
require.Error(t, err)
requireAIGatewayKeysViolation(t, err, tc.expectUniqueErr, tc.expectCheckErr)
})
From 9fe75587aec1882130520218ee291977d910de3c Mon Sep 17 00:00:00 2001
From: Ethan <39577870+ethanndickson@users.noreply.github.com>
Date: Wed, 3 Jun 2026 00:16:01 +1000
Subject: [PATCH 032/112] fix: forward user-uploaded PDFs to Anthropic and
Bedrock (#25946)
Previously, user-uploaded PDFs were silently dropped by fantasy's
Anthropic provider adapter, so Claude (direct or via Bedrock) only saw
the user's text and replied as if no document had been attached. Other
providers (OpenAI, Gemini, OpenRouter, Vercel) were unaffected.
Bumps `coder/fantasy` past
[coder/fantasy#37](https://github.com/coder/fantasy/pull/37)
(cherry-pick of upstream
[charmbracelet/fantasy#197](https://github.com/charmbracelet/fantasy/pull/197)),
which emits an Anthropic `document` content block with a base64 PDF
source for `fantasy.FilePart{MediaType: "application/pdf"}` and counts
`OfDocument` as user-visible so a PDF-only user message is no longer
culled as empty.
Adds a regression test
(`TestModelFromConfig_AnthropicPDFFilePartReachesProvider`) that drives
a `fantasy.FilePart` through the real Anthropic provider against a
`chattest.NewAnthropic` stub and asserts the outbound request contains a
base64 document block. The test was verified to fail on the previous
fantasy pin (the request leaves with zero messages and `Generate`
returns EOF) and pass on the new one.
Manually verified end-to-end with `./scripts/develop.sh`: uploading a
PDF to a Claude-backed Coder Agents chat now lets the model read it.
Closes CODAGT-540
---
.../x/chatd/chatprovider/chatprovider_test.go | 74 +++++++++++++++++++
go.mod | 8 +-
go.sum | 4 +-
3 files changed, 82 insertions(+), 4 deletions(-)
diff --git a/coderd/x/chatd/chatprovider/chatprovider_test.go b/coderd/x/chatd/chatprovider/chatprovider_test.go
index 0c2cebfbad69a..1d9b43c4ff4f1 100644
--- a/coderd/x/chatd/chatprovider/chatprovider_test.go
+++ b/coderd/x/chatd/chatprovider/chatprovider_test.go
@@ -1304,6 +1304,80 @@ func TestModelFromConfig_ExtraHeaders(t *testing.T) {
})
}
+// TestModelFromConfig_AnthropicPDFFilePartReachesProvider pins the end-to-end
+// path that lets a user-uploaded PDF actually reach Claude/Bedrock: a
+// fantasy.FilePart with MediaType "application/pdf" must be serialized as an
+// Anthropic "document" content block with a base64 source carrying the PDF
+// bytes. Older fantasy versions silently dropped PDF FileParts in the
+// Anthropic provider, so the user message ended up empty and the model never
+// saw the document. See coder/fantasy#37 (cherry-pick of upstream
+// charmbracelet/fantasy#197). The Generate call would fail outright on the
+// regressed code path because the dropped FilePart leaves the request with
+// zero messages.
+func TestModelFromConfig_AnthropicPDFFilePartReachesProvider(t *testing.T) {
+ t.Parallel()
+ ctx := testutil.Context(t, testutil.WaitShort)
+
+ pdfData := []byte("%PDF-1.7\nfake pdf bytes for regression test")
+ wantData := base64.StdEncoding.EncodeToString(pdfData)
+
+ called := make(chan struct{})
+ serverURL := chattest.NewAnthropic(t, func(req *chattest.AnthropicRequest) chattest.AnthropicResponse {
+ defer close(called)
+
+ require.Len(t, req.Messages, 1, "PDF FilePart should produce one Anthropic message, not be dropped as empty")
+ require.Equal(t, "user", req.Messages[0].Role)
+
+ var blocks []struct {
+ Type string `json:"type"`
+ Source struct {
+ Type string `json:"type"`
+ MediaType string `json:"media_type"`
+ Data string `json:"data"`
+ } `json:"source"`
+ }
+ require.NoError(t, json.Unmarshal(req.Messages[0].Content, &blocks),
+ "user content should be a structured block array, got: %s", string(req.Messages[0].Content))
+
+ var found bool
+ for _, block := range blocks {
+ if block.Type != "document" {
+ continue
+ }
+ assert.Equal(t, "base64", block.Source.Type, "PDF document block must use a base64 source")
+ assert.Equal(t, wantData, block.Source.Data, "PDF bytes must round-trip base64 unchanged")
+ if block.Source.MediaType != "" {
+ assert.Equal(t, "application/pdf", block.Source.MediaType)
+ }
+ found = true
+ }
+ require.True(t, found, "expected an Anthropic document block carrying the PDF, got: %s", string(req.Messages[0].Content))
+
+ return chattest.AnthropicNonStreamingResponse("ok")
+ })
+
+ keys := chatprovider.ProviderAPIKeys{
+ ByProvider: map[string]string{"anthropic": "test-key"},
+ BaseURLByProvider: map[string]string{"anthropic": serverURL},
+ }
+
+ model, err := chatprovider.ModelFromConfig("anthropic", "claude-sonnet-4-20250514", keys, chatprovider.UserAgent(), nil, nil)
+ require.NoError(t, err)
+
+ _, err = model.Generate(ctx, fantasy.Call{
+ Prompt: []fantasy.Message{
+ {
+ Role: fantasy.MessageRoleUser,
+ Content: []fantasy.MessagePart{
+ fantasy.FilePart{Data: pdfData, MediaType: "application/pdf"},
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
+ _ = testutil.TryReceive(ctx, t, called)
+}
+
func TestModelFromConfig_NilExtraHeaders(t *testing.T) {
t.Parallel()
ctx := testutil.Context(t, testutil.WaitShort)
diff --git a/go.mod b/go.mod
index d4ea36cb270e2..241ab475c02d8 100644
--- a/go.mod
+++ b/go.mod
@@ -90,8 +90,12 @@ replace github.com/spf13/afero => github.com/aslilac/afero v0.0.0-20250403163713
// streams close before their terminal events.
// 9) coder/fantasy#35, preserve Anthropic replay fidelity for signed
// reasoning and provider-executed web_search error results.
-// See: https://github.com/coder/fantasy/commits/cfca5fd82c5dd
-replace charm.land/fantasy => github.com/coder/fantasy v0.0.0-20260514123132-cfca5fd82c5d
+// 10) coder/fantasy#37, cherry-pick of upstream charmbracelet/fantasy#197:
+// emit a Base64 PDF document block for application/pdf FileParts on the
+// Anthropic provider so user-uploaded PDFs actually reach Claude/Bedrock
+// instead of being silently dropped.
+// See: https://github.com/coder/fantasy/commits/7d46e640327a
+replace charm.land/fantasy => github.com/coder/fantasy v0.0.0-20260602023814-7d46e640327a
// coder/coder uses a fork of charmbracelet's fork of the Anthropic Go SDK
// with performance improvements and Bedrock header cleanup.
diff --git a/go.sum b/go.sum
index 5840cb7bf56b8..61bfd608f8bed 100644
--- a/go.sum
+++ b/go.sum
@@ -324,8 +324,8 @@ github.com/coder/bubbletea v1.2.2-0.20241212190825-007a1cdb2c41 h1:SBN/DA63+ZHwu
github.com/coder/bubbletea v1.2.2-0.20241212190825-007a1cdb2c41/go.mod h1:I9ULxr64UaOSUv7hcb3nX4kowodJCVS7vt7VVJk/kW4=
github.com/coder/clistat v1.2.1 h1:P9/10njXMyj5cWzIU5wkRsSy5LVQH49+tcGMsAgWX0w=
github.com/coder/clistat v1.2.1/go.mod h1:m7SC0uj88eEERgvF8Kn6+w6XF21BeSr+15f7GoLAw0A=
-github.com/coder/fantasy v0.0.0-20260514123132-cfca5fd82c5d h1:CS3b2CZUDdHMwwtDoAtZF2/dzZd57yJtSJi3t86pmxE=
-github.com/coder/fantasy v0.0.0-20260514123132-cfca5fd82c5d/go.mod h1:wZ0e3lEPqrM0XiIdAUQLvMKCLYhc3gi96MRX2wjbX44=
+github.com/coder/fantasy v0.0.0-20260602023814-7d46e640327a h1:ffQixHAwjJLHgFfe4rtrAsFNRGhEyWnBSpInnLIxDPo=
+github.com/coder/fantasy v0.0.0-20260602023814-7d46e640327a/go.mod h1:wZ0e3lEPqrM0XiIdAUQLvMKCLYhc3gi96MRX2wjbX44=
github.com/coder/flog v1.1.0 h1:kbAes1ai8fIS5OeV+QAnKBQE22ty1jRF/mcAwHpLBa4=
github.com/coder/flog v1.1.0/go.mod h1:UQlQvrkJBvnRGo69Le8E24Tcl5SJleAAR7gYEHzAmdQ=
github.com/coder/go-httpstat v0.0.0-20230801153223-321c88088322 h1:m0lPZjlQ7vdVpRBPKfYIFlmgevoTkBxB10wv6l2gOaU=
From b411f093832fb85ac869da30f8303dca28426a28 Mon Sep 17 00:00:00 2001
From: TJ
Date: Tue, 2 Jun 2026 07:17:06 -0700
Subject: [PATCH 033/112] fix(site/src/pages/AgentsPage): use sentence case for
UI labels (#25941)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Converts all title-case UI labels in the Coder Agents area to sentence
case for consistency. Also renames the "New Agent" sidebar button to
"New chat".
## Changes
### Settings headings
| Before | After |
|---|---|
| Personal Instructions | Personal instructions |
| Chat Layout | Chat layout |
| Keyboard Shortcuts | Keyboard shortcuts |
| Thinking Display | Thinking display |
| Shell Output Display | Shell output display |
| Code Diff Display | Code diff display |
| Autostop Fallback | Autostop fallback |
| Workspace Autostop Fallback | Workspace autostop fallback |
| Auto-Archive Inactive Conversations | Auto-archive inactive
conversations |
| Conversation Retention Period | Conversation retention period |
| Chat Debug Data Retention | Chat debug data retention |
| System Instructions | System instructions |
| Context Compaction | Context compaction |
| Cost Tracking | Cost tracking |
| Provider Configuration | Provider configuration |
| Virtual Desktop | Virtual desktop |
### Select/option labels
| Before | After |
|---|---|
| Always Expanded | Always expanded |
| Always Collapsed | Always collapsed |
### Sidebar and nav labels
| Before | After |
|---|---|
| New Agent | New chat |
| Personal Skills | Personal skills |
| Manage Agents | Manage agents |
| MCP Servers | MCP servers |
| Back to Settings | Back to settings |
| Back to Agents | Back to agents |
### Form field labels
| Before | After |
|---|---|
| Display Name | Display name |
| Client Secret | Client secret |
| Header Name | Header name |
| Tool Allow List | Tool allow list |
| Tool Deny List | Tool deny list |
| Spend Limit | Spend limit |
| Cache Read | Cache read |
| Cache Write | Cache write |
| Model Identifier | Model identifier |
| Context Limit | Context limit |
| Compression Threshold | Compression threshold |
### Model form titles
| Before | After |
|---|---|
| Add Model | Add model |
| Edit Model | Edit model |
| Duplicate Model | Duplicate model |
### Admin/limits labels
| Before | After |
|---|---|
| Group Limits | Group limits |
| Per-User Overrides | Per-user overrides |
| Default Spend Limit | Default spend limit |
### Other
| Before | After |
|---|---|
| Weekly/Workspace Usage | Weekly/Workspace usage |
| View Usage | View usage |
| attached image / attached file | Attached image / Attached file |
### Not changed (server-provided labels)
Model config field labels like "Reasoning Effort", "Max Completion
Tokens", "Send Reasoning", etc. are provided by the server via
`field.label` and rendered as-is by `snakeToPrettyLabel`. These require
a server-side change to use sentence case.
All corresponding story and test assertions updated to match.
> 🤖 Generated by Coder Agents on behalf of @tracyjohnsonux
---
...entSettingsExperimentsPageView.stories.tsx | 2 +-
.../AgentSettingsGeneralPageView.stories.tsx | 12 +++---
...ntSettingsInstructionsPageView.stories.tsx | 4 +-
...AgentSettingsLifecyclePageView.stories.tsx | 16 ++++----
.../AgentSettingsMCPServersPage.tsx | 2 +-
.../pages/AgentsPage/AgentSettingsPage.tsx | 2 +-
.../AgentSettingsPersonalSkillsPageView.tsx | 2 +-
.../AgentsPage/AgentsPageView.stories.tsx | 12 +++---
.../AgentsPage/components/AgentCreateForm.tsx | 2 +-
.../components/AutoArchiveSettings.tsx | 2 +-
.../LiveStreamTail.stories.tsx | 3 +-
.../ChatConversation/LiveStreamTail.tsx | 2 +-
.../components/ChatCostSummaryView.tsx | 14 +++----
.../components/ChatFullWidthSettings.tsx | 2 +-
.../ChatModelAdminPanel.stories.tsx | 29 +++++++-------
.../ChatModelAdminPanel/ModelConfigFields.tsx | 8 ++--
.../ChatModelAdminPanel/ModelForm.tsx | 20 +++++-----
.../ModelIdentifierField.tsx | 2 +-
.../ModelsSection.stories.tsx | 40 +++++++++----------
.../components/ChatSendShortcutSettings.tsx | 2 +-
.../ChatsSidebar/ChatsSidebar.stories.tsx | 6 +--
.../ChatsSidebar/chats/ChatsPanel.tsx | 2 +-
.../ChatsSidebar/settings/SettingsPanel.tsx | 14 +++----
.../components/DebugRetentionSettings.tsx | 2 +-
.../components/DisplayModeSettings.tsx | 20 +++++-----
.../LimitsTab/DefaultLimitSection.tsx | 2 +-
.../LimitsTab/GroupLimitsSection.tsx | 6 +--
.../LimitsTab/UserOverridesSection.tsx | 6 +--
.../components/MCPServerAdminPanel.tsx | 12 +++---
.../AgentsPage/components/MCPServerPicker.tsx | 2 +-
.../PersonalInstructionsSettings.tsx | 2 +-
.../components/RetentionPeriodSettings.tsx | 2 +-
.../components/SystemInstructionsSettings.tsx | 2 +-
.../AgentsPage/components/UsageIndicator.tsx | 2 +-
.../UserCompactionThresholdSettings.tsx | 2 +-
.../components/VirtualDesktopSettings.tsx | 2 +-
.../components/WorkspaceAutostopSettings.tsx | 4 +-
37 files changed, 132 insertions(+), 134 deletions(-)
diff --git a/site/src/pages/AgentsPage/AgentSettingsExperimentsPageView.stories.tsx b/site/src/pages/AgentsPage/AgentSettingsExperimentsPageView.stories.tsx
index a7ccad775833b..fefec646f880c 100644
--- a/site/src/pages/AgentsPage/AgentSettingsExperimentsPageView.stories.tsx
+++ b/site/src/pages/AgentsPage/AgentSettingsExperimentsPageView.stories.tsx
@@ -153,7 +153,7 @@ export const ForcedByDeployment: Story = {
export const DesktopSetting: Story = {
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- await canvas.findByText("Virtual Desktop");
+ await canvas.findByText("Virtual desktop");
await canvas.findByText(
/Allow agents to use a virtual, graphical desktop within workspaces./i,
);
diff --git a/site/src/pages/AgentsPage/AgentSettingsGeneralPageView.stories.tsx b/site/src/pages/AgentsPage/AgentSettingsGeneralPageView.stories.tsx
index 311df2eb8cd14..04ab698b8dfe1 100644
--- a/site/src/pages/AgentsPage/AgentSettingsGeneralPageView.stories.tsx
+++ b/site/src/pages/AgentsPage/AgentSettingsGeneralPageView.stories.tsx
@@ -55,7 +55,7 @@ export const InvisibleUnicodeWarningUserPrompt: Story = {
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- await canvas.findByText("Personal Instructions");
+ await canvas.findByText("Personal instructions");
const alert = await canvas.findByText(/invisible Unicode/);
expect(alert).toBeInTheDocument();
expect(alert.textContent).toContain("2");
@@ -128,7 +128,7 @@ export const RendersChatLayoutSection: Story = {
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- expect(await canvas.findByText("Chat Layout")).toBeInTheDocument();
+ expect(await canvas.findByText("Chat layout")).toBeInTheDocument();
expect(
await canvas.findByRole("switch", { name: "Full-width chat" }),
).toBeInTheDocument();
@@ -160,7 +160,7 @@ export const TogglesSendShortcut: Story = {
name: "Require Cmd/Ctrl+Enter to send messages",
});
- expect(await canvas.findByText("Keyboard Shortcuts")).toBeInTheDocument();
+ expect(await canvas.findByText("Keyboard shortcuts")).toBeInTheDocument();
expect(toggle).not.toBeChecked();
await userEvent.click(toggle);
@@ -177,9 +177,9 @@ export const RendersAgentDisplayModeSettings: Story = {
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- expect(await canvas.findByText("Thinking Display")).toBeVisible();
- expect(await canvas.findByText("Shell Output Display")).toBeVisible();
- expect(await canvas.findByText("Code Diff Display")).toBeVisible();
+ expect(await canvas.findByText("Thinking display")).toBeVisible();
+ expect(await canvas.findByText("Shell output display")).toBeVisible();
+ expect(await canvas.findByText("Code diff display")).toBeVisible();
},
};
diff --git a/site/src/pages/AgentsPage/AgentSettingsInstructionsPageView.stories.tsx b/site/src/pages/AgentsPage/AgentSettingsInstructionsPageView.stories.tsx
index 2919b4e193440..ea8088311a765 100644
--- a/site/src/pages/AgentsPage/AgentSettingsInstructionsPageView.stories.tsx
+++ b/site/src/pages/AgentsPage/AgentSettingsInstructionsPageView.stories.tsx
@@ -117,7 +117,7 @@ export const InvisibleUnicodeWarningSystemPrompt: Story = {
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- await canvas.findByText("System Instructions");
+ await canvas.findByText("System instructions");
const alert = await canvas.findByText(/invisible Unicode/);
expect(alert).toBeInTheDocument();
expect(alert.textContent).toContain("4");
@@ -138,7 +138,7 @@ export const NoWarningForCleanPrompt: Story = {
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- await canvas.findByText("System Instructions");
+ await canvas.findByText("System instructions");
await canvas.findByDisplayValue("You are a helpful coding assistant.");
expect(canvas.queryByText(/invisible Unicode/)).toBeNull();
},
diff --git a/site/src/pages/AgentsPage/AgentSettingsLifecyclePageView.stories.tsx b/site/src/pages/AgentsPage/AgentSettingsLifecyclePageView.stories.tsx
index 187929e207e16..638ac04cd4387 100644
--- a/site/src/pages/AgentsPage/AgentSettingsLifecyclePageView.stories.tsx
+++ b/site/src/pages/AgentsPage/AgentSettingsLifecyclePageView.stories.tsx
@@ -46,7 +46,7 @@ export const Default: Story = {};
export const DefaultAutostopDefault: Story = {
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- await canvas.findByText("Workspace Autostop Fallback");
+ await canvas.findByText("Workspace autostop fallback");
await canvas.findByText(
/Set a default autostop for agent-created workspaces/i,
);
@@ -55,7 +55,7 @@ export const DefaultAutostopDefault: Story = {
name: "Enable default autostop",
});
expect(toggle).not.toBeChecked();
- expect(canvas.queryByLabelText("Autostop Fallback")).toBeNull();
+ expect(canvas.queryByLabelText("Autostop fallback")).toBeNull();
},
};
@@ -70,7 +70,7 @@ export const DefaultAutostopCustomValue: Story = {
});
expect(toggle).toBeChecked();
- const durationInput = await canvas.findByLabelText("Autostop Fallback");
+ const durationInput = await canvas.findByLabelText("Autostop fallback");
expect(durationInput).toHaveValue("2");
},
};
@@ -90,7 +90,7 @@ export const DefaultAutostopSave: Story = {
);
});
- const durationInput = await canvas.findByLabelText("Autostop Fallback");
+ const durationInput = await canvas.findByLabelText("Autostop fallback");
expect(durationInput).toHaveValue("1");
await userEvent.clear(durationInput);
@@ -126,7 +126,7 @@ export const DefaultAutostopExceedsMax: Story = {
});
await userEvent.click(toggle);
- const durationInput = await canvas.findByLabelText("Autostop Fallback");
+ const durationInput = await canvas.findByLabelText("Autostop fallback");
const ttlForm = durationInput.closest("form");
if (!(ttlForm instanceof HTMLFormElement)) {
throw new Error(
@@ -180,7 +180,7 @@ export const DefaultAutostopSaveDisabled: Story = {
});
expect(toggle).toBeChecked();
- const durationInput = await canvas.findByLabelText("Autostop Fallback");
+ const durationInput = await canvas.findByLabelText("Autostop fallback");
expect(durationInput).toHaveValue("2");
const ttlForm = durationInput.closest("form");
@@ -229,7 +229,7 @@ export const DefaultAutostopToggleOffFailure: Story = {
});
expect(toggle).toBeChecked();
- const durationInput = await canvas.findByLabelText("Autostop Fallback");
+ const durationInput = await canvas.findByLabelText("Autostop fallback");
expect(durationInput).toHaveValue("2");
await userEvent.click(toggle);
@@ -634,7 +634,7 @@ export const RetentionBelowMin: Story = {
export const DebugRetentionLoadedDefault: Story = {
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
- await canvas.findByText("Chat Debug Data Retention");
+ await canvas.findByText("Chat debug data retention");
await canvas.findByText(/debug runs and debug steps/i);
await canvas.findByText(/does not control chat message retention/i);
diff --git a/site/src/pages/AgentsPage/AgentSettingsMCPServersPage.tsx b/site/src/pages/AgentsPage/AgentSettingsMCPServersPage.tsx
index 4523b6ed4aed1..dbb9b1183973d 100644
--- a/site/src/pages/AgentsPage/AgentSettingsMCPServersPage.tsx
+++ b/site/src/pages/AgentsPage/AgentSettingsMCPServersPage.tsx
@@ -23,7 +23,7 @@ const AgentSettingsMCPServersPage: FC = () => {
return (
{
const sidebarView = sidebarViewFromPath(location.pathname);
const mobileBack = section
? sidebarView.panel === "settings-admin"
- ? { to: "/agents/settings/admin", label: "Manage Agents" }
+ ? { to: "/agents/settings/admin", label: "Manage agents" }
: { to: "/agents/settings", label: "Settings" }
: undefined;
diff --git a/site/src/pages/AgentsPage/AgentSettingsPersonalSkillsPageView.tsx b/site/src/pages/AgentsPage/AgentSettingsPersonalSkillsPageView.tsx
index fd83d035a4354..ccb1d5d585302 100644
--- a/site/src/pages/AgentsPage/AgentSettingsPersonalSkillsPageView.tsx
+++ b/site/src/pages/AgentsPage/AgentSettingsPersonalSkillsPageView.tsx
@@ -224,7 +224,7 @@ export const AgentSettingsPersonalSkillsPageView: FC<
return (
diff --git a/site/src/pages/AgentsPage/AgentsPageView.stories.tsx b/site/src/pages/AgentsPage/AgentsPageView.stories.tsx
index d2a2359b97f16..fcb3de9286881 100644
--- a/site/src/pages/AgentsPage/AgentsPageView.stories.tsx
+++ b/site/src/pages/AgentsPage/AgentsPageView.stories.tsx
@@ -726,7 +726,7 @@ export const EmptyStateZoom200Desktop: Story = {
});
await expect(canvas.getByRole("link", { name: "Settings" })).toBeVisible();
- await expect(canvas.getByRole("link", { name: "New Agent" })).toBeVisible();
+ await expect(canvas.getByRole("link", { name: "New chat" })).toBeVisible();
await expect(
canvas.getByRole("button", { name: "Collapse sidebar" }),
).toBeVisible();
@@ -1014,7 +1014,7 @@ export const OpensSettingsForNonAdmins: Story = {
});
expect(
- screen.queryByRole("link", { name: "Manage Agents" }),
+ screen.queryByRole("link", { name: "Manage agents" }),
).not.toBeInTheDocument();
},
};
@@ -1032,7 +1032,7 @@ export const OpensAdminSubPanelOnMobile: Story = {
},
play: async () => {
await userEvent.click(
- await screen.findByRole("link", { name: "Manage Agents" }),
+ await screen.findByRole("link", { name: "Manage agents" }),
);
await expect(
@@ -1059,7 +1059,7 @@ export const SettingsViewResets: Story = {
});
// Navigate to the admin panel, then open the Spend section.
- await userEvent.click(screen.getByRole("link", { name: "Manage Agents" }));
+ await userEvent.click(screen.getByRole("link", { name: "Manage agents" }));
await userEvent.click(await screen.findByRole("link", { name: "Spend" }));
await waitFor(() => {
expect(
@@ -1071,11 +1071,11 @@ export const SettingsViewResets: Story = {
// Step back to the top-level settings panel, then back to conversations.
const backToSettingsButton = await screen.findByRole("link", {
- name: "Back to Settings",
+ name: "Back to settings",
});
await userEvent.click(backToSettingsButton);
const backToAgentsButton = await screen.findByRole("link", {
- name: "Back to Agents",
+ name: "Back to agents",
});
await userEvent.click(backToAgentsButton);
diff --git a/site/src/pages/AgentsPage/components/AgentCreateForm.tsx b/site/src/pages/AgentsPage/components/AgentCreateForm.tsx
index f52703d58ae49..d4ec3b59563fc 100644
--- a/site/src/pages/AgentsPage/components/AgentCreateForm.tsx
+++ b/site/src/pages/AgentsPage/components/AgentCreateForm.tsx
@@ -476,7 +476,7 @@ export const AgentCreateForm: FC
= ({
severity="info"
actions={
- View Usage
+ View usage
}
>
diff --git a/site/src/pages/AgentsPage/components/AutoArchiveSettings.tsx b/site/src/pages/AgentsPage/components/AutoArchiveSettings.tsx
index 9ab2578d8287d..9718df957735c 100644
--- a/site/src/pages/AgentsPage/components/AutoArchiveSettings.tsx
+++ b/site/src/pages/AgentsPage/components/AutoArchiveSettings.tsx
@@ -112,7 +112,7 @@ export const AutoArchiveSettings: FC = ({
- Auto-Archive Inactive Conversations
+ Auto-archive inactive conversations
- View Usage
+ View usage
}
>
diff --git a/site/src/pages/AgentsPage/components/ChatCostSummaryView.tsx b/site/src/pages/AgentsPage/components/ChatCostSummaryView.tsx
index 16f854e82fc33..6066768571902 100644
--- a/site/src/pages/AgentsPage/components/ChatCostSummaryView.tsx
+++ b/site/src/pages/AgentsPage/components/ChatCostSummaryView.tsx
@@ -174,7 +174,7 @@ export const ChatCostSummaryView: FC = ({
- Cache Read
+ Cache read
{formatTokenCount(summary.total_cache_read_tokens)}
@@ -182,7 +182,7 @@ export const ChatCostSummaryView: FC = ({
- Cache Write
+ Cache write
{formatTokenCount(summary.total_cache_creation_tokens)}
@@ -206,7 +206,7 @@ export const ChatCostSummaryView: FC = ({
- {usageLimitPeriodLabel} Spend Limit
+ {usageLimitPeriodLabel} spend limit
{usageLimitCurrentPeriod && (
@@ -288,8 +288,8 @@ export const ChatCostSummaryView: FC = ({
Messages
Input
Output
- Cache Read
- Cache Write
+ Cache read
+ Cache write
@@ -344,8 +344,8 @@ export const ChatCostSummaryView: FC = ({
Messages
Input
Output
- Cache Read
- Cache Write
+ Cache read
+ Cache write
diff --git a/site/src/pages/AgentsPage/components/ChatFullWidthSettings.tsx b/site/src/pages/AgentsPage/components/ChatFullWidthSettings.tsx
index 4a58f77f25e86..12627a47873e7 100644
--- a/site/src/pages/AgentsPage/components/ChatFullWidthSettings.tsx
+++ b/site/src/pages/AgentsPage/components/ChatFullWidthSettings.tsx
@@ -8,7 +8,7 @@ export const ChatFullWidthSettings: FC = () => {
return (
- Chat Layout
+ Chat layout
diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.stories.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.stories.tsx
index 09a538636976e..7d6fce9b0ead1 100644
--- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.stories.tsx
+++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.stories.tsx
@@ -965,8 +965,7 @@ export const SubmitModelConfigExplicitly: Story = {
await body.findByLabelText(/Max output tokens/i),
"32000",
);
- // Reasoning Effort is a provider option under "Provider Configuration".
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
const effortGroup = await body.findByRole("radiogroup", {
name: "Reasoning Effort",
});
@@ -1192,7 +1191,7 @@ const ensureCostTrackingOpen = async (body: ReturnType) => {
if (body.queryByLabelText(/^Input$/i)) {
return;
}
- await expandSection(body, "Cost Tracking");
+ await expandSection(body, "Cost tracking");
await body.findByLabelText(/^Input$/i);
};
@@ -1271,7 +1270,7 @@ const ensureProviderConfigurationOpen = async (
if (body.queryByLabelText(/Max Completion Tokens/i)) {
return;
}
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
await body.findByLabelText(/Max Completion Tokens/i);
};
@@ -1321,7 +1320,7 @@ export const OpenAIKnownModelHappyPath: Story = {
);
await expect(body.getByLabelText(/Context limit/i)).toHaveValue("1050000");
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
await expect(
await body.findByLabelText(/Max Completion Tokens/i),
).toHaveValue("128000");
@@ -1384,7 +1383,7 @@ export const AnthropicKnownModelHappyPath: Story = {
"128000",
);
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
const sendReasoningGroup = await body.findByRole("radiogroup", {
name: "Send Reasoning",
});
@@ -1409,7 +1408,7 @@ export const AnthropicHaikuKnownModelUsesThinkingBudgetNotEffort: Story = {
await openAddModelForm(body, "Anthropic");
await selectKnownModel(body, "claude-haiku-4-5");
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
// Reasoning Effort should remain empty because Haiku 4.5 uses the
// thinking budget path instead of Anthropic adaptive thinking.
@@ -1981,7 +1980,7 @@ export const ModelFormOpenAI: Story = {
play: async ({ canvasElement }) => {
const body = within(canvasElement.ownerDocument.body);
await openAddModelForm(body, "OpenAI");
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
await expect(
await body.findByLabelText(/Reasoning Effort/i),
).toBeInTheDocument();
@@ -1996,7 +1995,7 @@ export const ModelFormAnthropic: Story = {
play: async ({ canvasElement }) => {
const body = within(canvasElement.ownerDocument.body);
await openAddModelForm(body, "Anthropic");
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
await expect(
await body.findByLabelText(/Send Reasoning/i),
).toBeInTheDocument();
@@ -2011,7 +2010,7 @@ export const ModelFormGoogle: Story = {
play: async ({ canvasElement }) => {
const body = within(canvasElement.ownerDocument.body);
await openAddModelForm(body, "Google");
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
await expect(
await body.findByLabelText(/Thinking Config Thinking Budget/i),
).toBeInTheDocument();
@@ -2026,7 +2025,7 @@ export const ModelFormOpenAICompat: Story = {
play: async ({ canvasElement }) => {
const body = within(canvasElement.ownerDocument.body);
await openAddModelForm(body, "OpenAI-compatible");
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
await expect(
await body.findByLabelText(/Reasoning Effort/i),
).toBeInTheDocument();
@@ -2038,7 +2037,7 @@ export const ModelFormOpenRouter: Story = {
play: async ({ canvasElement }) => {
const body = within(canvasElement.ownerDocument.body);
await openAddModelForm(body, "OpenRouter");
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
await expect(
await body.findByLabelText(/Reasoning Enabled/i),
).toBeInTheDocument();
@@ -2053,7 +2052,7 @@ export const ModelFormVercel: Story = {
play: async ({ canvasElement }) => {
const body = within(canvasElement.ownerDocument.body);
await openAddModelForm(body, "Vercel AI Gateway");
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
await expect(
await body.findByLabelText(/Reasoning Enabled/i),
).toBeInTheDocument();
@@ -2068,7 +2067,7 @@ export const ModelFormAzure: Story = {
play: async ({ canvasElement }) => {
const body = within(canvasElement.ownerDocument.body);
await openAddModelForm(body, "Azure OpenAI");
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
// Azure aliases to OpenAI fields.
await expect(
await body.findByLabelText(/Reasoning Effort/i),
@@ -2084,7 +2083,7 @@ export const ModelFormBedrock: Story = {
play: async ({ canvasElement }) => {
const body = within(canvasElement.ownerDocument.body);
await openAddModelForm(body, "AWS Bedrock");
- await expandSection(body, "Provider Configuration");
+ await expandSection(body, "Provider configuration");
// Bedrock aliases to Anthropic fields.
await expect(
await body.findByLabelText(/Send Reasoning/i),
diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelConfigFields.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelConfigFields.tsx
index f56ecf81be212..5c253f3254d9d 100644
--- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelConfigFields.tsx
+++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelConfigFields.tsx
@@ -49,8 +49,8 @@ const unsetSelectValue = "__unset__";
const shortLabelOverrides: Record = {
"cost.input_price_per_million_tokens": "Input",
"cost.output_price_per_million_tokens": "Output",
- "cost.cache_read_price_per_million_tokens": "Cache Read",
- "cost.cache_write_price_per_million_tokens": "Cache Write",
+ "cost.cache_read_price_per_million_tokens": "Cache read",
+ "cost.cache_write_price_per_million_tokens": "Cache write",
};
/**
@@ -99,8 +99,8 @@ function snakeToPrettyLabel(field: FieldSchema): string {
if (shortLabelOverrides[field.json_name]) {
return shortLabelOverrides[field.json_name];
}
- return field.json_name
- .split(/[._]/)
+ const words = field.json_name.split(/[._]/);
+ return words
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(" ");
}
diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelForm.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelForm.tsx
index 53543797d3a97..43dc08ca353ca 100644
--- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelForm.tsx
+++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelForm.tsx
@@ -129,10 +129,10 @@ export const ModelForm: FC = ({
selectedProviderState.providerConfig.allow_user_api_key),
);
const formTitle = isEditing
- ? "Edit Model"
+ ? "Edit model"
: isDuplicating
- ? "Duplicate Model"
- : "Add Model";
+ ? "Duplicate model"
+ : "Add model";
const formDescription = isDuplicating
? "Review the copied settings, then save to create a new model."
: undefined;
@@ -403,7 +403,7 @@ export const ModelForm: FC = ({
autoComplete="off"
>
- {/* Model ID + Context Limit + Pricing */}
+ {/* Model ID + Context limit + Pricing */}
{" "}
@@ -419,7 +419,7 @@ export const ModelForm: FC = ({
htmlFor={contextLimitField.id}
className="inline-flex items-center gap-1 text-sm font-medium text-content-primary"
>
- Context Limit{" "}
+ Context limit{" "}
*
@@ -464,7 +464,7 @@ export const ModelForm: FC = ({
- {/* Usage Tracking */}
+ {/* Cost tracking */}
= ({
>
- Cost Tracking{" "}
+ Cost tracking
Set per-token pricing so Coder can track costs and enforce
@@ -498,7 +498,7 @@ export const ModelForm: FC = ({
)}
- {/* Provider Configuration */}
+ {/* Provider configuration */}
= ({
>
- Provider Configuration
+ Provider configuration
Tune provider-specific behavior like reasoning, tool calling,
@@ -567,7 +567,7 @@ export const ModelForm: FC = ({
htmlFor={compressionThresholdField.id}
className="inline-flex items-center gap-1 text-[13px] font-medium text-content-primary"
>
- Compression Threshold
+ Compression threshold
diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelIdentifierField.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelIdentifierField.tsx
index 028484f9b0fd6..fa679a0e37d49 100644
--- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelIdentifierField.tsx
+++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelIdentifierField.tsx
@@ -459,7 +459,7 @@ export const ModelIdentifierField = ({
htmlFor={modelField.id}
className="inline-flex items-center gap-1 text-sm font-medium text-content-primary"
>
- Model Identifier{" "}
+ Model identifier{" "}
*
diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelsSection.stories.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelsSection.stories.tsx
index b45d40458999b..cf74c1caaf6fc 100644
--- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelsSection.stories.tsx
+++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelsSection.stories.tsx
@@ -213,23 +213,23 @@ export const OpensDuplicateFormWithoutCreating: Story = {
}),
);
- await expect(canvas.findByText("Duplicate Model")).resolves.toBeVisible();
+ await expect(canvas.findByText("Duplicate model")).resolves.toBeVisible();
expect(args.onCreateModel).not.toHaveBeenCalled();
expect(args.onUpdateModel).not.toHaveBeenCalled();
expect(canvas.getByDisplayValue("GPT-4.1 Default")).toBeVisible();
- expect(canvas.getByLabelText(/Model Identifier/)).toHaveValue(
+ expect(canvas.getByLabelText(/Model identifier/)).toHaveValue(
"gpt-4.1-default",
);
- expect(canvas.getByLabelText(/Context Limit/)).toHaveValue("200000");
+ expect(canvas.getByLabelText(/Context limit/)).toHaveValue("200000");
const enabledSwitch = canvas.getByRole("switch", { name: "Enabled" });
expect(enabledSwitch).toBeChecked();
expect(enabledSwitch).toBeEnabled();
await userEvent.click(canvas.getByRole("button", { name: /Advanced/ }));
- expect(canvas.getByLabelText(/Compression Threshold/)).toHaveValue("65");
+ expect(canvas.getByLabelText(/Compression threshold/)).toHaveValue("65");
await userEvent.click(
- canvas.getByRole("button", { name: /Provider Configuration/ }),
+ canvas.getByRole("button", { name: /Provider configuration/ }),
);
expect(canvas.getByLabelText("Max Tool Calls")).toHaveValue("4");
},
@@ -246,14 +246,14 @@ export const AbandonsDuplicateWithoutSaving: Story = {
const copyButtonName = "Duplicate model: GPT-4.1 Default";
await userEvent.click(canvas.getByRole("button", { name: copyButtonName }));
- await expect(canvas.findByText("Duplicate Model")).resolves.toBeVisible();
+ await expect(canvas.findByText("Duplicate model")).resolves.toBeVisible();
await userEvent.click(canvas.getByRole("button", { name: "Cancel" }));
await expect(
canvas.findByRole("button", { name: copyButtonName }),
).resolves.toBeVisible();
await userEvent.click(canvas.getByRole("button", { name: copyButtonName }));
- await expect(canvas.findByText("Duplicate Model")).resolves.toBeVisible();
+ await expect(canvas.findByText("Duplicate model")).resolves.toBeVisible();
await userEvent.click(canvas.getByRole("button", { name: "Back" }));
await expect(
canvas.findByRole("button", { name: copyButtonName }),
@@ -276,9 +276,9 @@ export const SavesDuplicateAsCreateRequest: Story = {
name: "Duplicate model: GPT-4.1 Default",
}),
);
- await expect(canvas.findByText("Duplicate Model")).resolves.toBeVisible();
+ await expect(canvas.findByText("Duplicate model")).resolves.toBeVisible();
- const modelInput = canvas.getByLabelText(/Model Identifier/);
+ const modelInput = canvas.getByLabelText(/Model identifier/);
await userEvent.clear(modelInput);
await userEvent.type(modelInput, "gpt-4.1-copy");
const displayNameInput = canvas.getByDisplayValue("GPT-4.1 Default");
@@ -329,14 +329,14 @@ export const SavesNonDefaultDuplicateWithEditableEnabled: Story = {
await userEvent.click(
canvas.getByRole("button", { name: "Duplicate model: GPT-4.1" }),
);
- await expect(canvas.findByText("Duplicate Model")).resolves.toBeVisible();
+ await expect(canvas.findByText("Duplicate model")).resolves.toBeVisible();
const enabledSwitch = canvas.getByRole("switch", { name: "Enabled" });
expect(enabledSwitch).toBeChecked();
expect(enabledSwitch).toBeEnabled();
await userEvent.click(enabledSwitch);
- const modelInput = canvas.getByLabelText(/Model Identifier/);
+ const modelInput = canvas.getByLabelText(/Model identifier/);
await userEvent.clear(modelInput);
await userEvent.type(modelInput, "gpt-4.1-copy");
await userEvent.click(
@@ -373,14 +373,14 @@ export const SavesDisabledDuplicateWithEditableEnabled: Story = {
name: "Duplicate model: GPT-4.1 Disabled",
}),
);
- await expect(canvas.findByText("Duplicate Model")).resolves.toBeVisible();
+ await expect(canvas.findByText("Duplicate model")).resolves.toBeVisible();
const enabledSwitch = canvas.getByRole("switch", { name: "Enabled" });
expect(enabledSwitch).not.toBeChecked();
expect(enabledSwitch).toBeEnabled();
await userEvent.click(enabledSwitch);
- const modelInput = canvas.getByLabelText(/Model Identifier/);
+ const modelInput = canvas.getByLabelText(/Model identifier/);
await userEvent.clear(modelInput);
await userEvent.type(modelInput, "gpt-4.1-disabled-copy");
await userEvent.click(
@@ -417,7 +417,7 @@ export const DisablesDuplicateWhenProviderCannotManageModels: Story = {
expect(duplicateButton).toHaveAttribute("aria-disabled", "true");
await userEvent.click(duplicateButton);
- expect(canvas.queryByText("Duplicate Model")).not.toBeInTheDocument();
+ expect(canvas.queryByText("Duplicate model")).not.toBeInTheDocument();
expect(args.onCreateModel).not.toHaveBeenCalled();
},
};
@@ -442,13 +442,13 @@ export const RowActionsDoNotOpenRowBody: Story = {
"model-config-id",
{ is_default: true },
]);
- expect(canvas.queryByText("Edit Model")).not.toBeInTheDocument();
+ expect(canvas.queryByText("Edit model")).not.toBeInTheDocument();
await userEvent.click(
canvas.getByRole("button", { name: "Default model: GPT-4o" }),
);
expect(args.onUpdateModel).toHaveBeenCalledTimes(1);
- expect(canvas.queryByText("Edit Model")).not.toBeInTheDocument();
+ expect(canvas.queryByText("Edit model")).not.toBeInTheDocument();
const disabledStarButton = canvas.getByRole("button", {
name: "Set as default model: GPT-4.1 Disabled",
@@ -456,20 +456,20 @@ export const RowActionsDoNotOpenRowBody: Story = {
expect(disabledStarButton).toHaveAttribute("aria-disabled", "true");
await userEvent.click(disabledStarButton);
expect(args.onUpdateModel).toHaveBeenCalledTimes(1);
- expect(canvas.queryByText("Edit Model")).not.toBeInTheDocument();
+ expect(canvas.queryByText("Edit model")).not.toBeInTheDocument();
await userEvent.click(
canvas.getByRole("button", { name: "Duplicate model: GPT-4.1" }),
);
- await expect(canvas.findByText("Duplicate Model")).resolves.toBeVisible();
+ await expect(canvas.findByText("Duplicate model")).resolves.toBeVisible();
expect(args.onCreateModel).not.toHaveBeenCalled();
expect(args.onUpdateModel).toHaveBeenCalledTimes(1);
- expect(canvas.queryByText("Edit Model")).not.toBeInTheDocument();
+ expect(canvas.queryByText("Edit model")).not.toBeInTheDocument();
await userEvent.click(canvas.getByRole("button", { name: "Back" }));
await userEvent.click(
await canvas.findByRole("button", { name: "Edit model: GPT-4.1" }),
);
- await expect(canvas.findByText("Edit Model")).resolves.toBeVisible();
+ await expect(canvas.findByText("Edit model")).resolves.toBeVisible();
},
};
diff --git a/site/src/pages/AgentsPage/components/ChatSendShortcutSettings.tsx b/site/src/pages/AgentsPage/components/ChatSendShortcutSettings.tsx
index 3a408f5f5f49a..e81591f26e934 100644
--- a/site/src/pages/AgentsPage/components/ChatSendShortcutSettings.tsx
+++ b/site/src/pages/AgentsPage/components/ChatSendShortcutSettings.tsx
@@ -22,7 +22,7 @@ export const ChatSendShortcutSettings: FC = () => {
return (
- Keyboard Shortcuts
+ Keyboard shortcuts
= ({
onCollapse,
}) => {
const subNavTitle =
- settingsPanel === "settings-admin" ? "Manage Agents" : "Settings";
+ settingsPanel === "settings-admin" ? "Manage agents" : "Settings";
return (
= ({
size="icon"
aria-label={
settingsPanel === "settings-admin"
- ? "Back to Settings"
- : "Back to Agents"
+ ? "Back to settings"
+ : "Back to agents"
}
className="relative z-10 size-7 min-w-0 text-content-secondary hover:text-content-primary"
>
@@ -76,7 +76,7 @@ export const SettingsPanel: FC
= ({
@@ -122,7 +122,7 @@ export const SettingsPanel: FC = ({
)}
= ({
{isAdmin && (
= ({
/>
= ({
- Chat Debug Data Retention
+ Chat debug data retention
[] = [
{ value: "auto", label: "Auto" },
{ value: "preview", label: "Preview" },
- { value: "always_expanded", label: "Always Expanded" },
- { value: "always_collapsed", label: "Always Collapsed" },
+ { value: "always_expanded", label: "Always expanded" },
+ { value: "always_collapsed", label: "Always collapsed" },
];
const agentDisplayOptions: DisplayModeOption[] = [
{ value: "auto", label: "Auto" },
- { value: "always_expanded", label: "Always Expanded" },
- { value: "always_collapsed", label: "Always Collapsed" },
+ { value: "always_expanded", label: "Always expanded" },
+ { value: "always_collapsed", label: "Always collapsed" },
];
type DisplayModeSettingsProps = {
@@ -101,8 +101,8 @@ const DisplayModeSettings = ({
export const ThinkingDisplaySettings: FC = () => {
return (
{
export const ShellToolDisplaySettings: FC = () => {
return (
{
export const CodeDiffDisplaySettings: FC = () => {
return (
= ({
{!hideHeader && (
diff --git a/site/src/pages/AgentsPage/components/LimitsTab/GroupLimitsSection.tsx b/site/src/pages/AgentsPage/components/LimitsTab/GroupLimitsSection.tsx
index cd97b9efa8937..6961a1f668259 100644
--- a/site/src/pages/AgentsPage/components/LimitsTab/GroupLimitsSection.tsx
+++ b/site/src/pages/AgentsPage/components/LimitsTab/GroupLimitsSection.tsx
@@ -92,7 +92,7 @@ export const GroupLimitsSection: FC = ({
{!hideHeader && (
)}
@@ -103,7 +103,7 @@ export const GroupLimitsSection: FC = ({
Group
Members
- Spend Limit
+ Spend limit
Actions
@@ -253,7 +253,7 @@ export const GroupLimitsSection: FC = ({
)}
-
Spend Limit ($)
+
Spend limit ($)
= ({
{!hideHeader && (
)}
@@ -94,7 +94,7 @@ export const UserOverridesSection: FC = ({
User
- Spend Limit
+ Spend limit
Actions
@@ -190,7 +190,7 @@ export const UserOverridesSection: FC = ({
)}