From 297f5b7f8ac6eeef96db2ba1c0f7af13ef81c03b Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Thu, 12 Mar 2026 17:34:11 +1100
Subject: [PATCH 01/12] Cleanup unused images
---
agent/internal/build/build.go | 2 +-
agent/internal/container/runtime_darwin.go | 2 +-
agent/internal/container/runtime_linux.go | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/agent/internal/build/build.go b/agent/internal/build/build.go
index ff64287..95def39 100644
--- a/agent/internal/build/build.go
+++ b/agent/internal/build/build.go
@@ -409,7 +409,7 @@ func (b *Builder) Cleanup() error {
}
}
- log.Printf("[build:cleanup] pruning dangling images")
+ log.Printf("[build:cleanup] pruning unused images")
container.ImagePrune()
return nil
diff --git a/agent/internal/container/runtime_darwin.go b/agent/internal/container/runtime_darwin.go
index e7f8168..59d13bc 100644
--- a/agent/internal/container/runtime_darwin.go
+++ b/agent/internal/container/runtime_darwin.go
@@ -494,7 +494,7 @@ func writeDockerConfig(registryURL, username, password string) error {
}
func ImagePrune() {
- exec.Command("docker", "image", "prune", "-f").Run()
+ exec.Command("docker", "image", "prune", "-a", "-f").Run()
}
type dockerContainer struct {
diff --git a/agent/internal/container/runtime_linux.go b/agent/internal/container/runtime_linux.go
index 81069a5..3175254 100644
--- a/agent/internal/container/runtime_linux.go
+++ b/agent/internal/container/runtime_linux.go
@@ -494,7 +494,7 @@ func writeDockerConfig(registryURL, username, password string) error {
}
func ImagePrune() {
- exec.Command("podman", "image", "prune", "-f").Run()
+ exec.Command("podman", "image", "prune", "-a", "-f").Run()
}
type podmanContainer struct {
From fb1bf7c3fa9a6892f650bee343937c2932275b5f Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Sat, 14 Mar 2026 17:51:25 +1100
Subject: [PATCH 02/12] Fix wireguard after reboot
---
agent/internal/agent/drift.go | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/agent/internal/agent/drift.go b/agent/internal/agent/drift.go
index 6a71d42..81e8002 100644
--- a/agent/internal/agent/drift.go
+++ b/agent/internal/agent/drift.go
@@ -415,7 +415,10 @@ func (a *Agent) reconcileOne(actual *ActualState) error {
Endpoint: p.Endpoint,
}
}
- if wireguard.HashPeers(expectedWgPeers) != actual.WireguardHash {
+ wgPeersChanged := wireguard.HashPeers(expectedWgPeers) != actual.WireguardHash
+ wgIsUp := wireguard.IsUp(wireguard.DefaultInterface)
+
+ if wgPeersChanged {
log.Printf("[reconcile] updating WireGuard peers")
if err := a.reconcileWireguard(expectedWgPeers); err != nil {
return fmt.Errorf("failed to update WireGuard: %w", err)
@@ -423,6 +426,14 @@ func (a *Agent) reconcileOne(actual *ActualState) error {
return nil
}
+ if !wgIsUp {
+ log.Printf("[reconcile] WireGuard interface is down, bringing it up")
+ if err := wireguard.Up(wireguard.DefaultInterface); err != nil {
+ return fmt.Errorf("failed to bring up WireGuard: %w", err)
+ }
+ return nil
+ }
+
return nil
}
From 62a09aa2272ad7f45314eaa20df899953233df8d Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Mon, 16 Mar 2026 07:59:41 +1100
Subject: [PATCH 03/12] Update release workflow
---
...gent-release.yml => agent-tip-release.yml} | 16 +--
.github/workflows/control-plane-release.yml | 64 ---------
.github/workflows/release.yml | 132 ++++++++++++++++++
agent/cmd/agent/main.go | 2 +-
agent/internal/agent/reporting.go | 9 +-
web/public/setup.sh | 4 +-
web/public/update.sh | 4 +-
7 files changed, 146 insertions(+), 85 deletions(-)
rename .github/workflows/{agent-release.yml => agent-tip-release.yml} (85%)
delete mode 100644 .github/workflows/control-plane-release.yml
create mode 100644 .github/workflows/release.yml
diff --git a/.github/workflows/agent-release.yml b/.github/workflows/agent-tip-release.yml
similarity index 85%
rename from .github/workflows/agent-release.yml
rename to .github/workflows/agent-tip-release.yml
index 8fbfd81..6789fcc 100644
--- a/.github/workflows/agent-release.yml
+++ b/.github/workflows/agent-tip-release.yml
@@ -1,4 +1,4 @@
-name: Build and Release Agent
+name: Agent Tip Release
on:
push:
@@ -6,13 +6,13 @@ on:
- main
paths:
- "agent/**"
- workflow_dispatch:
+ - ".github/workflows/agent-tip-release.yml"
permissions:
contents: write
jobs:
- build:
+ agent:
runs-on: ubuntu-latest
strategy:
matrix:
@@ -43,7 +43,7 @@ jobs:
GOARCH: ${{ matrix.goarch }}
CGO_ENABLED: 0
run: |
- go build -ldflags="-s -w" -o agent-${{ matrix.goos }}-${{ matrix.goarch }} ./cmd/agent
+ go build -ldflags="-s -w -X techulus/cloud-agent/internal/agent.Version=${{ github.sha }}" -o agent-${{ matrix.goos }}-${{ matrix.goarch }} ./cmd/agent
- name: Upload artifact
uses: actions/upload-artifact@v4
@@ -53,7 +53,7 @@ jobs:
retention-days: 1
release:
- needs: build
+ needs: agent
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
@@ -67,7 +67,7 @@ jobs:
cd binaries
sha256sum agent-* > checksums.txt
- - name: Delete existing release assets
+ - name: Update tip release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
@@ -76,10 +76,6 @@ jobs:
gh api -X DELETE repos/${{ github.repository }}/releases/assets/$asset_id
done
- - name: Upload binaries to Tip release
- env:
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: |
for binary in binaries/agent-*; do
chmod +x "$binary"
gh release upload tip "$binary" --repo ${{ github.repository }} --clobber
diff --git a/.github/workflows/control-plane-release.yml b/.github/workflows/control-plane-release.yml
deleted file mode 100644
index c7f27c7..0000000
--- a/.github/workflows/control-plane-release.yml
+++ /dev/null
@@ -1,64 +0,0 @@
-name: Build and Push Images
-
-on:
- push:
- branches:
- - release
- workflow_dispatch:
-
-permissions:
- contents: read
- packages: write
-
-jobs:
- web:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
-
- - name: Login to GHCR
- uses: docker/login-action@v3
- with:
- registry: ghcr.io
- username: ${{ github.actor }}
- password: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Build and push
- uses: docker/build-push-action@v6
- with:
- context: web
- push: true
- tags: ghcr.io/${{ github.repository }}/web:tip
- platforms: linux/amd64,linux/arm64
- cache-from: type=gha,scope=web
- cache-to: type=gha,mode=max,scope=web
-
- registry:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
-
- - name: Login to GHCR
- uses: docker/login-action@v3
- with:
- registry: ghcr.io
- username: ${{ github.actor }}
- password: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Build and push
- uses: docker/build-push-action@v6
- with:
- context: registry
- push: true
- tags: ghcr.io/${{ github.repository }}/registry:tip
- platforms: linux/amd64,linux/arm64
- cache-from: type=gha,scope=registry
- cache-to: type=gha,mode=max,scope=registry
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..4810fe4
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,132 @@
+name: Release
+
+on:
+ push:
+ tags:
+ - "v*"
+
+permissions:
+ contents: write
+ packages: write
+
+jobs:
+ agent:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ include:
+ - goos: linux
+ goarch: amd64
+ - goos: linux
+ goarch: arm64
+ - goos: darwin
+ goarch: amd64
+ - goos: darwin
+ goarch: arm64
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version-file: agent/go.mod
+ cache-dependency-path: agent/go.sum
+
+ - name: Build
+ working-directory: agent
+ env:
+ GOOS: ${{ matrix.goos }}
+ GOARCH: ${{ matrix.goarch }}
+ CGO_ENABLED: 0
+ run: |
+ go build -ldflags="-s -w -X techulus/cloud-agent/internal/agent.Version=${{ github.ref_name }}" -o agent-${{ matrix.goos }}-${{ matrix.goarch }} ./cmd/agent
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: agent-${{ matrix.goos }}-${{ matrix.goarch }}
+ path: agent/agent-${{ matrix.goos }}-${{ matrix.goarch }}
+ retention-days: 1
+
+ release:
+ needs: agent
+ runs-on: ubuntu-latest
+ steps:
+ - name: Download all artifacts
+ uses: actions/download-artifact@v4
+ with:
+ path: binaries
+ merge-multiple: true
+
+ - name: Generate SHA256 checksums
+ run: |
+ cd binaries
+ sha256sum agent-* > checksums.txt
+
+ - name: Create GitHub release
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release create "${{ github.ref_name }}" \
+ --repo ${{ github.repository }} \
+ --title "${{ github.ref_name }}" \
+ --generate-notes \
+ binaries/agent-* binaries/checksums.txt
+
+ web:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Login to GHCR
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v6
+ with:
+ context: web
+ push: true
+ tags: |
+ ghcr.io/${{ github.repository }}/web:${{ github.ref_name }}
+ ghcr.io/${{ github.repository }}/web:tip
+ platforms: linux/amd64,linux/arm64
+ cache-from: type=gha,scope=web
+ cache-to: type=gha,mode=max,scope=web
+
+ registry:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Login to GHCR
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v6
+ with:
+ context: registry
+ push: true
+ tags: |
+ ghcr.io/${{ github.repository }}/registry:${{ github.ref_name }}
+ ghcr.io/${{ github.repository }}/registry:tip
+ platforms: linux/amd64,linux/arm64
+ cache-from: type=gha,scope=registry
+ cache-to: type=gha,mode=max,scope=registry
diff --git a/agent/cmd/agent/main.go b/agent/cmd/agent/main.go
index b4a7941..eb8842f 100644
--- a/agent/cmd/agent/main.go
+++ b/agent/cmd/agent/main.go
@@ -293,7 +293,7 @@ func main() {
publicIP := getPublicIP()
privateIP := getPrivateIP()
- log.Printf("Agent started. Public IP: %s, Private IP: %s. Tick interval: %v", publicIP, privateIP, agent.TickInterval)
+ log.Printf("Agent v%s started. Public IP: %s, Private IP: %s. Tick interval: %v", agent.Version, publicIP, privateIP, agent.TickInterval)
agentInstance := agent.NewAgent(client, reconciler, config, publicIP, privateIP, dataDir, logCollector, traefikLogCollector, builder, config.IsProxy, disableDNS)
agentInstance.Run(ctx)
diff --git a/agent/internal/agent/reporting.go b/agent/internal/agent/reporting.go
index 6da1c5e..4513604 100644
--- a/agent/internal/agent/reporting.go
+++ b/agent/internal/agent/reporting.go
@@ -16,17 +16,14 @@ import (
"github.com/shirou/gopsutil/v3/mem"
)
+var Version = "dev"
+
var (
agentStartTime = time.Now()
- agentVersion = "dev"
lastHealthCollect time.Time
healthCollectMu sync.Mutex
)
-func SetAgentVersion(version string) {
- agentVersion = version
-}
-
func (a *Agent) BuildStatusReport(includeResources bool) *agenthttp.StatusReport {
report := &agenthttp.StatusReport{
PublicIP: a.PublicIP,
@@ -46,7 +43,7 @@ func (a *Agent) BuildStatusReport(includeResources bool) *agenthttp.StatusReport
report.NetworkHealth = health.CollectNetworkHealth("wg0")
report.ContainerHealth = health.CollectContainerHealth()
report.AgentHealth = &agenthttp.AgentHealth{
- Version: agentVersion,
+ Version: Version,
UptimeSecs: int64(time.Since(agentStartTime).Seconds()),
}
lastHealthCollect = time.Now()
diff --git a/web/public/setup.sh b/web/public/setup.sh
index 1793f0b..d2ea963 100644
--- a/web/public/setup.sh
+++ b/web/public/setup.sh
@@ -300,8 +300,8 @@ fi
echo "✓ crane installed"
step "Downloading Techulus Cloud agent..."
-AGENT_URL="https://github.com/techulus/cloud/releases/download/tip/agent-linux-${AGENT_ARCH}"
-CHECKSUM_URL="https://github.com/techulus/cloud/releases/download/tip/checksums.txt"
+AGENT_URL="https://github.com/techulus/cloud/releases/latest/download/agent-linux-${AGENT_ARCH}"
+CHECKSUM_URL="https://github.com/techulus/cloud/releases/latest/download/checksums.txt"
curl -fsSL -o /tmp/techulus-agent "$AGENT_URL"
if [ ! -f /tmp/techulus-agent ]; then
diff --git a/web/public/update.sh b/web/public/update.sh
index b0cba23..114c5c5 100644
--- a/web/public/update.sh
+++ b/web/public/update.sh
@@ -36,8 +36,8 @@ esac
echo "Architecture: $ARCH ($AGENT_ARCH)"
echo "Downloading latest agent..."
-AGENT_URL="https://github.com/techulus/cloud/releases/download/tip/agent-linux-${AGENT_ARCH}"
-CHECKSUM_URL="https://github.com/techulus/cloud/releases/download/tip/checksums.txt"
+AGENT_URL="https://github.com/techulus/cloud/releases/latest/download/agent-linux-${AGENT_ARCH}"
+CHECKSUM_URL="https://github.com/techulus/cloud/releases/latest/download/checksums.txt"
curl -fsSL -o /tmp/techulus-agent "$AGENT_URL"
if [ ! -f /tmp/techulus-agent ]; then
From 334e2990d385fd27894208d878a002f32e548971 Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Mon, 16 Mar 2026 19:16:34 +1100
Subject: [PATCH 04/12] Fix release workflow
---
.github/workflows/agent-tip-release.yml | 8 ++++----
.github/workflows/release.yml | 23 ++++++++++++-----------
2 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/.github/workflows/agent-tip-release.yml b/.github/workflows/agent-tip-release.yml
index 6789fcc..4732add 100644
--- a/.github/workflows/agent-tip-release.yml
+++ b/.github/workflows/agent-tip-release.yml
@@ -28,10 +28,10 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Setup Go
- uses: actions/setup-go@v5
+ uses: actions/setup-go@v6
with:
go-version-file: agent/go.mod
cache-dependency-path: agent/go.sum
@@ -46,7 +46,7 @@ jobs:
go build -ldflags="-s -w -X techulus/cloud-agent/internal/agent.Version=${{ github.sha }}" -o agent-${{ matrix.goos }}-${{ matrix.goarch }} ./cmd/agent
- name: Upload artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v7
with:
name: agent-${{ matrix.goos }}-${{ matrix.goarch }}
path: agent/agent-${{ matrix.goos }}-${{ matrix.goarch }}
@@ -57,7 +57,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v8
with:
path: binaries
merge-multiple: true
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 4810fe4..a58cf9a 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -26,10 +26,10 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Setup Go
- uses: actions/setup-go@v5
+ uses: actions/setup-go@v6
with:
go-version-file: agent/go.mod
cache-dependency-path: agent/go.sum
@@ -44,7 +44,7 @@ jobs:
go build -ldflags="-s -w -X techulus/cloud-agent/internal/agent.Version=${{ github.ref_name }}" -o agent-${{ matrix.goos }}-${{ matrix.goarch }} ./cmd/agent
- name: Upload artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v7
with:
name: agent-${{ matrix.goos }}-${{ matrix.goarch }}
path: agent/agent-${{ matrix.goos }}-${{ matrix.goarch }}
@@ -54,10 +54,11 @@ jobs:
needs: agent
runs-on: ubuntu-latest
steps:
- - name: Download all artifacts
- uses: actions/download-artifact@v4
+ - name: Download agent artifacts
+ uses: actions/download-artifact@v8
with:
path: binaries
+ pattern: agent-*
merge-multiple: true
- name: Generate SHA256 checksums
@@ -79,13 +80,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
+ uses: docker/setup-buildx-action@v4
- name: Login to GHCR
- uses: docker/login-action@v3
+ uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -107,13 +108,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
+ uses: docker/setup-buildx-action@v4
- name: Login to GHCR
- uses: docker/login-action@v3
+ uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
From 6bcb376b9cb75a62038c8cbc3794bb8c181169b0 Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Mon, 16 Mar 2026 20:06:45 +1100
Subject: [PATCH 05/12] Fix version display for server
---
web/components/server/server-health-details.tsx | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/web/components/server/server-health-details.tsx b/web/components/server/server-health-details.tsx
index 9ce243d..021955e 100644
--- a/web/components/server/server-health-details.tsx
+++ b/web/components/server/server-health-details.tsx
@@ -106,9 +106,7 @@ export function ServerHealthDetails({
}
/>
From 897bdc0c5f142e34d88971d3f66ed50c2cf3cef4 Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Mon, 16 Mar 2026 21:35:44 +1100
Subject: [PATCH 06/12] Avoid sending entire traefik log on restart
---
agent/internal/logs/traefik_collector.go | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/agent/internal/logs/traefik_collector.go b/agent/internal/logs/traefik_collector.go
index 3e39be8..7a3dc5a 100644
--- a/agent/internal/logs/traefik_collector.go
+++ b/agent/internal/logs/traefik_collector.go
@@ -79,6 +79,7 @@ type TraefikCollector struct {
cancel context.CancelFunc
wg sync.WaitGroup
lastPos int64
+ initialized bool
droppedCount int
}
@@ -128,8 +129,15 @@ func (c *TraefikCollector) tailFile() error {
}
defer file.Close()
- if c.lastPos == 0 {
- log.Printf("[traefik-logs] started tailing %s", traefikLogPath)
+ if !c.initialized {
+ endPos, err := file.Seek(0, io.SeekEnd)
+ if err != nil {
+ return err
+ }
+ c.lastPos = endPos
+ c.initialized = true
+ log.Printf("[traefik-logs] started tailing %s (skipped to position %d)", traefikLogPath, endPos)
+ return nil
}
stat, err := file.Stat()
From 090c26f7606c6c2361d998f21a7cb06077fba63f Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Mon, 16 Mar 2026 22:49:48 +1100
Subject: [PATCH 07/12] Remove github app setup flow
---
.github/workflows/release.yml | 2 +
web/Dockerfile | 2 +
web/actions/projects.ts | 14 +-
.../(dashboard)/dashboard/settings/page.tsx | 6 +-
web/app/api/github/manifest/callback/route.ts | 60 ---
web/components/github/github-app-setup.tsx | 371 ------------------
web/components/logs/log-viewer.tsx | 36 +-
.../details/pending-changes-banner.tsx | 96 ++---
web/components/settings/global-settings.tsx | 39 +-
9 files changed, 100 insertions(+), 526 deletions(-)
delete mode 100644 web/app/api/github/manifest/callback/route.ts
delete mode 100644 web/components/github/github-app-setup.tsx
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index a58cf9a..b6110f5 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -100,6 +100,8 @@ jobs:
tags: |
ghcr.io/${{ github.repository }}/web:${{ github.ref_name }}
ghcr.io/${{ github.repository }}/web:tip
+ build-args: |
+ APP_VERSION=${{ github.ref_name }}
platforms: linux/amd64,linux/arm64
cache-from: type=gha,scope=web
cache-to: type=gha,mode=max,scope=web
diff --git a/web/Dockerfile b/web/Dockerfile
index 63f2990..7c3ea01 100644
--- a/web/Dockerfile
+++ b/web/Dockerfile
@@ -6,11 +6,13 @@ RUN pnpm install --frozen-lockfile
FROM node:24-slim AS builder
WORKDIR /app
+ARG APP_VERSION=dev
COPY --from=deps /app/node_modules ./node_modules
COPY . .
ENV DATABASE_URL=postgres://build:build@localhost:5432/build
ENV BETTER_AUTH_SECRET=build-secret
ENV BETTER_AUTH_URL=http://localhost:3000
+ENV NEXT_PUBLIC_APP_VERSION=$APP_VERSION
RUN npx next build
FROM node:24-slim AS drizzle
diff --git a/web/actions/projects.ts b/web/actions/projects.ts
index 862f069..510bfa3 100644
--- a/web/actions/projects.ts
+++ b/web/actions/projects.ts
@@ -1047,14 +1047,12 @@ export async function abortRollout(serviceId: string) {
});
if (workToDelete.length > 0) {
- await db
- .delete(workQueue)
- .where(
- inArray(
- workQueue.id,
- workToDelete.map((w) => w.id),
- ),
- );
+ await db.delete(workQueue).where(
+ inArray(
+ workQueue.id,
+ workToDelete.map((w) => w.id),
+ ),
+ );
}
return { success: true };
diff --git a/web/app/(dashboard)/dashboard/settings/page.tsx b/web/app/(dashboard)/dashboard/settings/page.tsx
index d754876..849df55 100644
--- a/web/app/(dashboard)/dashboard/settings/page.tsx
+++ b/web/app/(dashboard)/dashboard/settings/page.tsx
@@ -24,7 +24,11 @@ export default async function SettingsPage() {
-
+
>
);
diff --git a/web/app/api/github/manifest/callback/route.ts b/web/app/api/github/manifest/callback/route.ts
deleted file mode 100644
index b3f4afb..0000000
--- a/web/app/api/github/manifest/callback/route.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-
-export async function GET(request: NextRequest) {
- const searchParams = request.nextUrl.searchParams;
- const code = searchParams.get("code");
-
- if (!code || !/^[a-zA-Z0-9]+$/.test(code)) {
- return NextResponse.redirect(
- new URL("/dashboard/settings?github_error=missing_code", request.url),
- );
- }
-
- try {
- const response = await fetch(
- `https://api.github.com/app-manifests/${code}/conversions`,
- {
- method: "POST",
- headers: {
- Accept: "application/vnd.github+json",
- },
- },
- );
-
- if (!response.ok) {
- const error = await response.text();
- console.error("GitHub manifest conversion failed:", error);
- return NextResponse.redirect(
- new URL(
- "/dashboard/settings?github_error=conversion_failed",
- request.url,
- ),
- );
- }
-
- const data = await response.json();
-
- const credentials = {
- id: data.id,
- slug: data.slug,
- pem: Buffer.from(data.pem).toString("base64"),
- webhookSecret: data.webhook_secret,
- ownerType: data.owner?.type,
- ownerLogin: data.owner?.login,
- };
-
- const credentialsParam = encodeURIComponent(JSON.stringify(credentials));
-
- return NextResponse.redirect(
- new URL(
- `/dashboard/settings?github_credentials=${credentialsParam}`,
- request.url,
- ),
- );
- } catch (error) {
- console.error("GitHub manifest callback error:", error);
- return NextResponse.redirect(
- new URL("/dashboard/settings?github_error=unknown", request.url),
- );
- }
-}
diff --git a/web/components/github/github-app-setup.tsx b/web/components/github/github-app-setup.tsx
deleted file mode 100644
index 2b914fa..0000000
--- a/web/components/github/github-app-setup.tsx
+++ /dev/null
@@ -1,371 +0,0 @@
-"use client";
-
-import { useState, useEffect } from "react";
-import { useSearchParams, useRouter } from "next/navigation";
-import { toast } from "sonner";
-import isFQDN from "validator/es/lib/isFQDN";
-import {
- Github,
- TriangleAlert,
- ExternalLink,
- Copy,
- RotateCcw,
-} from "lucide-react";
-import { Button, buttonVariants } from "@/components/ui/button";
-import { Input } from "@/components/ui/input";
-import { Label } from "@/components/ui/label";
-import { Switch } from "@/components/ui/switch";
-import { Item, ItemContent, ItemMedia, ItemTitle } from "@/components/ui/item";
-import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
-
-const HOSTNAME_KEY = "techulus_github_hostname";
-const STORAGE_TTL = 10 * 60 * 1000;
-
-type GitHubCredentials = {
- id: string;
- slug: string;
- pem: string;
- webhookSecret: string;
- ownerType?: string;
- ownerLogin?: string;
-};
-
-function getStoredHostname(): string {
- if (typeof window === "undefined") return "";
- const item = sessionStorage.getItem(HOSTNAME_KEY);
- if (!item) return "";
- try {
- const { value, expires } = JSON.parse(item);
- if (Date.now() > expires) {
- sessionStorage.removeItem(HOSTNAME_KEY);
- return "";
- }
- return value;
- } catch {
- return "";
- }
-}
-
-function setStoredHostname(value: string) {
- const item = { value, expires: Date.now() + STORAGE_TTL };
- sessionStorage.setItem(HOSTNAME_KEY, JSON.stringify(item));
-}
-
-export function GitHubAppSetup() {
- const searchParams = useSearchParams();
- const router = useRouter();
-
- const [hostname, setHostname] = useState("");
- const [useOrg, setUseOrg] = useState(false);
- const [orgId, setOrgId] = useState("");
- const [credentials, setCredentials] = useState(
- null,
- );
- const [copied, setCopied] = useState(false);
- const [loading, setLoading] = useState(false);
-
- useEffect(() => {
- const storedHostname = getStoredHostname();
- if (storedHostname) {
- setHostname(storedHostname);
- }
-
- const credentialsParam = searchParams.get("github_credentials");
- const errorParam = searchParams.get("github_error");
-
- if (credentialsParam) {
- try {
- const parsed = JSON.parse(decodeURIComponent(credentialsParam));
- setCredentials(parsed);
- setLoading(false);
- } catch {
- toast.error("Failed to parse GitHub credentials");
- }
- router.replace("/dashboard/settings?tab=github", { scroll: false });
- }
-
- if (errorParam) {
- const messages: Record = {
- missing_code: "GitHub did not return an authorization code",
- conversion_failed:
- "Failed to exchange code for credentials. The code may have expired.",
- unknown: "An unknown error occurred",
- };
- toast.error(messages[errorParam] || "GitHub setup failed");
- setLoading(false);
- router.replace("/dashboard/settings?tab=github", { scroll: false });
- }
- }, [searchParams, router]);
-
- const isHostnameValid = (() => {
- const h = hostname.trim().toLowerCase();
- if (!h) return false;
- if (h === "localhost") return true;
- return isFQDN(h);
- })();
-
- const isOrgValid =
- !useOrg || /^[a-z0-9]([a-z0-9_-]*[a-z0-9])?$/i.test(orgId.trim());
-
- const canSubmit = isHostnameValid && isOrgValid && !loading;
-
- const githubUrl =
- useOrg && orgId.trim()
- ? `https://github.com/organizations/${orgId.trim()}/settings/apps/new`
- : "https://github.com/settings/apps/new";
-
- const generateManifest = () => {
- const h = hostname.trim().toLowerCase();
- const protocol =
- h === "localhost" || h.endsWith(".local") ? "http" : "https";
- const appBaseUrl = `${protocol}://${h}`;
- const callbackUrl = `${typeof window !== "undefined" ? window.location.origin : ""}/api/github/manifest/callback`;
- const appName = `techulus-cloud-${useOrg && orgId ? orgId.trim() : Math.random().toString(36).substring(2, 8)}`;
-
- return JSON.stringify({
- name: appName,
- url: appBaseUrl,
- hook_attributes: {
- url:
- h === "localhost"
- ? "http://example.com/api/webhooks/github"
- : `${appBaseUrl}/api/webhooks/github`,
- active: true,
- },
- redirect_url: callbackUrl,
- callback_urls: [
- `${appBaseUrl}/api/github/authorize/callback`,
- `${appBaseUrl}/auth/github/callback`,
- ],
- setup_url: `${appBaseUrl}/api/github/setup`,
- setup_on_update: true,
- public: true,
- default_permissions: {
- administration: "write",
- checks: "write",
- contents: "write",
- deployments: "write",
- issues: "write",
- metadata: "read",
- pull_requests: "write",
- repository_hooks: "write",
- statuses: "write",
- emails: "read",
- },
- default_events: ["installation_target", "push", "repository"],
- });
- };
-
- const handleSubmit = (e: React.FormEvent) => {
- if (!canSubmit) {
- e.preventDefault();
- return;
- }
- setStoredHostname(hostname.trim().toLowerCase());
- };
-
- const envOutput = credentials
- ? `GITHUB_APP_ID="${credentials.id}"
-GITHUB_APP_PRIVATE_KEY="${credentials.pem}"
-GITHUB_WEBHOOK_SECRET="${credentials.webhookSecret}"`
- : "";
-
- const githubAppUrl = credentials
- ? credentials.ownerType === "Organization"
- ? `https://github.com/organizations/${credentials.ownerLogin}/settings/apps/${credentials.slug}`
- : `https://github.com/settings/apps/${credentials.slug}`
- : "";
-
- const copyToClipboard = async () => {
- try {
- await navigator.clipboard.writeText(envOutput);
- setCopied(true);
- toast.success("Copied to clipboard");
- setTimeout(() => setCopied(false), 2000);
- } catch {
- toast.error("Failed to copy to clipboard");
- }
- };
-
- const reset = () => {
- setCredentials(null);
- setHostname("");
- setOrgId("");
- setUseOrg(false);
- setCopied(false);
- setLoading(false);
- sessionStorage.removeItem(HOSTNAME_KEY);
- };
-
- const isLocalhost = hostname.trim().toLowerCase() === "localhost";
-
- if (credentials || loading) {
- return (
-
-
-
-
-
-
-
- GitHub App Credentials
-
-
-
-
- Copy the following environment variables into your{" "}
- .env file.
-
-
- {loading && (
-
-
- Retrieving credentials...
-
-
- )}
-
- {!loading && credentials && (
- <>
- {isLocalhost && (
-
-
- Update webhook URL
-
- The webhook URL was set to a placeholder because GitHub
- cannot reach localhost. Use a tunnel (e.g., ngrok) and{" "}
-
- update the webhook URL in the GitHub App settings
-
- .
-
-
- )}
-
-
- >
- )}
-
-
-
-
- Reset
-
-
- {githubAppUrl && (
-
-
-
- )}
-
-
- {copied ? "Copied!" : "Copy to clipboard"}
-
-
-
-
-
- );
- }
-
- return (
-
-
-
-
-
-
-
- Create GitHub App
-
-
-
-
- Create a GitHub App to enable repository access and webhook
- integration. You will be redirected to GitHub to confirm, then back
- here to copy the configuration. You must be logged into GitHub before
- creating the app.
-
-
-
-
-
- );
-}
diff --git a/web/components/logs/log-viewer.tsx b/web/components/logs/log-viewer.tsx
index 6a7d05b..29cfca2 100644
--- a/web/components/logs/log-viewer.tsx
+++ b/web/components/logs/log-viewer.tsx
@@ -980,51 +980,25 @@ export function LogViewer(props: LogViewerProps) {
{filteredLogs.map((entry) => {
if (props.variant === "service-logs") {
const e = entry as ServiceLogEntry;
- return (
-
- );
+ return ;
}
if (props.variant === "requests") {
const e = entry as RequestEntry;
- return (
-
- );
+ return ;
}
if (props.variant === "server-logs") {
const e = entry as ServerLogEntry;
- return (
-
- );
+ return ;
}
if (props.variant === "rollout-logs") {
const e = entry as BuildLogEntry;
return (
-
+
);
}
const e = entry as BuildLogEntry;
return (
-
+
);
})}
diff --git a/web/components/service/details/pending-changes-banner.tsx b/web/components/service/details/pending-changes-banner.tsx
index 3cfd102..5dcc18d 100644
--- a/web/components/service/details/pending-changes-banner.tsx
+++ b/web/components/service/details/pending-changes-banner.tsx
@@ -69,61 +69,61 @@ export const PendingChangesBanner = memo(function PendingChangesBanner({
>
-
-
-
-
-
+
+
+
+
+
+
+ {hasChanges
+ ? `${changes.length} pending change${changes.length !== 1 ? "s" : ""}`
+ : "Ready to deploy"}
+
+ {hasChanges ? (
+
+ {changes.map((change, i) => (
+
+
+ {change.field}:
+
+
+ {change.from}
+
+
+
+ {change.to}
+
+
+ ))}
+
+ ) : (
+
+ This service has no active deployments.
+
+ )}
+
-
-
- {hasChanges
- ? `${changes.length} pending change${changes.length !== 1 ? "s" : ""}`
- : "Ready to deploy"}
-
- {hasChanges ? (
-
- {changes.map((change, i) => (
-
-
- {change.field}:
-
-
- {change.from}
-
-
-
- {change.to}
-
-
- ))}
-
+
+ {isDeploying ? (
+
) : (
-
- This service has no active deployments.
-
+
)}
-
+ {isGithubWithNoDeployments ? "Build" : "Deploy"}
+
-
- {isDeploying ? (
-
- ) : (
-
- )}
- {isGithubWithNoDeployments ? "Build" : "Deploy"}
-
-
);
});
diff --git a/web/components/settings/global-settings.tsx b/web/components/settings/global-settings.tsx
index eb554e9..7ce54d1 100644
--- a/web/components/settings/global-settings.tsx
+++ b/web/components/settings/global-settings.tsx
@@ -4,7 +4,15 @@ import { useState } from "react";
import { useRouter } from "next/navigation";
import { useQueryState } from "nuqs";
import { toast } from "sonner";
-import { Hammer, Server, Ban, Clock, Shield, Network } from "lucide-react";
+import {
+ Hammer,
+ Server,
+ Ban,
+ Clock,
+ Shield,
+ Network,
+ Info,
+} from "lucide-react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
@@ -25,7 +33,7 @@ import {
} from "@/actions/settings";
import type { Server as ServerType } from "@/db/types";
import type { EmailAlertsConfig } from "@/lib/settings-keys";
-import { GitHubAppSetup } from "@/components/github/github-app-setup";
+
import { EmailSettings } from "@/components/settings/email-settings";
type Props = {
@@ -38,9 +46,14 @@ type Props = {
proxyDomain: string | null;
emailAlertsConfig: EmailAlertsConfig | null;
};
+ appVersion: string | null;
};
-export function GlobalSettings({ servers, initialSettings }: Props) {
+export function GlobalSettings({
+ servers,
+ initialSettings,
+ appVersion,
+}: Props) {
const router = useRouter();
const [tab, setTab] = useQueryState("tab", { defaultValue: "build" });
const [buildServerIds, setBuildServerIds] = useState
>(
@@ -208,8 +221,8 @@ export function GlobalSettings({ servers, initialSettings }: Props) {
Email
-
- GitHub
+
+ About
@@ -467,8 +480,20 @@ export function GlobalSettings({ servers, initialSettings }: Props) {
/>
-
-
+
+
+
-
+
+
+
+
+ Version
+
+
+
+
{appVersion ?? "dev"}
+
+
);
From b1236a2d2d6ec36aad707045e5cdfbf153ecb0d5 Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Sat, 21 Mar 2026 11:35:12 +1100
Subject: [PATCH 08/12] Update next
---
deployment/compose.postgres.yml | 4 +-
deployment/compose.production.yml | 4 +-
web/package.json | 144 +++---
web/pnpm-lock.yaml | 788 ++++++++++++++++--------------
4 files changed, 495 insertions(+), 445 deletions(-)
diff --git a/deployment/compose.postgres.yml b/deployment/compose.postgres.yml
index ed4a0f1..8996e0e 100644
--- a/deployment/compose.postgres.yml
+++ b/deployment/compose.postgres.yml
@@ -35,7 +35,7 @@ services:
restart: unless-stopped
web:
- image: ghcr.io/techulus/cloud/web:tip
+ image: ghcr.io/techulus/cloud/web:latest
env_file:
- ./.env
environment:
@@ -63,7 +63,7 @@ services:
restart: unless-stopped
registry:
- image: ghcr.io/techulus/cloud/registry:tip
+ image: ghcr.io/techulus/cloud/registry:latest
env_file:
- ./.env
volumes:
diff --git a/deployment/compose.production.yml b/deployment/compose.production.yml
index 9399fab..4e0d294 100644
--- a/deployment/compose.production.yml
+++ b/deployment/compose.production.yml
@@ -24,7 +24,7 @@ services:
restart: unless-stopped
web:
- image: ghcr.io/techulus/cloud/web:tip
+ image: ghcr.io/techulus/cloud/web:latest
env_file:
- ./.env
environment:
@@ -51,7 +51,7 @@ services:
restart: unless-stopped
registry:
- image: ghcr.io/techulus/cloud/registry:tip
+ image: ghcr.io/techulus/cloud/registry:latest
env_file:
- ./.env
volumes:
diff --git a/web/package.json b/web/package.json
index 5e451b2..009bb46 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,71 +1,77 @@
{
- "name": "web",
- "version": "0.1.0",
- "private": true,
- "scripts": {
- "dev": "concurrently -n next,inngest -c blue,magenta \"next dev\" \"npx inngest-cli@latest dev\"",
- "build": "next build",
- "start": "next start",
- "lint": "next lint",
- "db:generate": "drizzle-kit generate",
- "db:migrate": "drizzle-kit migrate",
- "db:push": "drizzle-kit push",
- "db:studio": "drizzle-kit studio"
- },
- "dependencies": {
- "@aws-sdk/client-s3": "^3.968.0",
- "@base-ui/react": "^1.0.0",
- "@bprogress/next": "^3.2.12",
- "@react-email/components": "^1.0.4",
- "@react-email/render": "^2.0.2",
- "acme-client": "^5.4.0",
- "better-auth": "^1.4.9",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "cmdk": "^1.1.1",
- "cron-parser": "^5.4.0",
- "cronstrue": "^3.9.0",
- "drizzle-orm": "^0.45.1",
- "inngest": "^3.50.0",
- "ip-address": "^10.1.0",
- "jose": "^6.1.3",
- "lucide-react": "^0.562.0",
- "next": "16.1.5",
- "next-themes": "^0.4.6",
- "nodemailer": "^7.0.12",
- "nuqs": "^2.8.6",
- "pg": "^8.16.3",
- "react": "19.2.3",
- "react-dom": "19.2.3",
- "shadcn": "^3.6.2",
- "sonner": "^2.0.7",
- "swr": "^2.3.8",
- "tailwind-merge": "^3.4.0",
- "tw-animate-css": "^1.4.0",
- "validator": "^13.15.26",
- "yaml": "^2.8.2",
- "zod": "^4.3.5"
- },
- "devDependencies": {
- "@biomejs/biome": "2.3.10",
- "@eslint/eslintrc": "^3",
- "@tailwindcss/postcss": "^4",
- "@types/node": "^22",
- "@types/nodemailer": "^7.0.5",
- "@types/pg": "^8.16.0",
- "@types/react": "19.2.7",
- "@types/react-dom": "19.2.3",
- "@types/validator": "^13.15.10",
- "concurrently": "^9.2.1",
- "drizzle-kit": "^0.31.8",
- "eslint": "^9",
- "eslint-config-next": "16.1.1",
- "tailwindcss": "^4",
- "tsx": "^4.19.2",
- "typescript": "^5"
- },
- "overrides": {
- "@types/react": "19.2.7",
- "@types/react-dom": "19.2.3"
- }
+ "name": "web",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "concurrently -n next,inngest -c blue,magenta \"next dev\" \"npx inngest-cli@latest dev\"",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint",
+ "db:generate": "drizzle-kit generate",
+ "db:migrate": "drizzle-kit migrate",
+ "db:push": "drizzle-kit push",
+ "db:studio": "drizzle-kit studio"
+ },
+ "dependencies": {
+ "@aws-sdk/client-s3": "^3.968.0",
+ "@base-ui/react": "^1.0.0",
+ "@bprogress/next": "^3.2.12",
+ "@react-email/components": "^1.0.4",
+ "@react-email/render": "^2.0.2",
+ "acme-client": "^5.4.0",
+ "better-auth": "^1.4.9",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "cmdk": "^1.1.1",
+ "cron-parser": "^5.4.0",
+ "cronstrue": "^3.9.0",
+ "drizzle-orm": "^0.45.1",
+ "inngest": "^3.50.0",
+ "ip-address": "^10.1.0",
+ "jose": "^6.1.3",
+ "lucide-react": "^0.562.0",
+ "next": "16.2.1",
+ "next-themes": "^0.4.6",
+ "nodemailer": "^7.0.12",
+ "nuqs": "^2.8.6",
+ "pg": "^8.16.3",
+ "react": "19.2.4",
+ "react-dom": "19.2.4",
+ "shadcn": "^3.6.2",
+ "sonner": "^2.0.7",
+ "swr": "^2.3.8",
+ "tailwind-merge": "^3.4.0",
+ "tw-animate-css": "^1.4.0",
+ "validator": "^13.15.26",
+ "yaml": "^2.8.2",
+ "zod": "^4.3.5"
+ },
+ "devDependencies": {
+ "@biomejs/biome": "2.3.10",
+ "@eslint/eslintrc": "^3",
+ "@tailwindcss/postcss": "^4",
+ "@types/node": "^22",
+ "@types/nodemailer": "^7.0.5",
+ "@types/pg": "^8.16.0",
+ "@types/react": "19.2.14",
+ "@types/react-dom": "19.2.3",
+ "@types/validator": "^13.15.10",
+ "concurrently": "^9.2.1",
+ "drizzle-kit": "^0.31.8",
+ "eslint": "^9",
+ "eslint-config-next": "16.2.1",
+ "tailwindcss": "^4",
+ "tsx": "^4.19.2",
+ "typescript": "^5"
+ },
+ "overrides": {
+ "@types/react": "19.2.7",
+ "@types/react-dom": "19.2.3"
+ },
+ "pnpm": {
+ "overrides": {
+ "@types/react": "19.2.14",
+ "@types/react-dom": "19.2.3"
+ }
+ }
}
diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml
index 6a902ca..976874c 100644
--- a/web/pnpm-lock.yaml
+++ b/web/pnpm-lock.yaml
@@ -4,6 +4,10 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
+overrides:
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3
+
importers:
.:
@@ -13,22 +17,22 @@ importers:
version: 3.985.0
'@base-ui/react':
specifier: ^1.0.0
- version: 1.1.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 1.1.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@bprogress/next':
specifier: ^3.2.12
- version: 3.2.12(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 3.2.12(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@react-email/components':
specifier: ^1.0.4
- version: 1.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 1.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@react-email/render':
specifier: ^2.0.2
- version: 2.0.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
acme-client:
specifier: ^5.4.0
version: 5.4.0
better-auth:
specifier: ^1.4.9
- version: 1.4.18(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(kysely@0.28.11)(pg@8.18.0))(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 1.4.18(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(kysely@0.28.11)(pg@8.18.0))(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(pg@8.18.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -37,7 +41,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.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
cron-parser:
specifier: ^5.4.0
version: 5.5.0
@@ -49,7 +53,7 @@ importers:
version: 0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(kysely@0.28.11)(pg@8.18.0)
inngest:
specifier: ^3.50.0
- version: 3.51.0(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(express@5.2.1)(hono@4.11.8)(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)(zod@4.3.6)
+ version: 3.51.0(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(express@5.2.1)(hono@4.11.8)(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(zod@4.3.6)
ip-address:
specifier: ^10.1.0
version: 10.1.0
@@ -58,37 +62,37 @@ importers:
version: 6.1.3
lucide-react:
specifier: ^0.562.0
- version: 0.562.0(react@19.2.3)
+ version: 0.562.0(react@19.2.4)
next:
- specifier: 16.1.5
- version: 16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ specifier: 16.2.1
+ version: 16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
next-themes:
specifier: ^0.4.6
- version: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
nodemailer:
specifier: ^7.0.12
version: 7.0.13
nuqs:
specifier: ^2.8.6
- version: 2.8.8(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)
+ version: 2.8.8(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
pg:
specifier: ^8.16.3
version: 8.18.0
react:
- specifier: 19.2.3
- version: 19.2.3
+ specifier: 19.2.4
+ version: 19.2.4
react-dom:
- specifier: 19.2.3
- version: 19.2.3(react@19.2.3)
+ specifier: 19.2.4
+ version: 19.2.4(react@19.2.4)
shadcn:
specifier: ^3.6.2
version: 3.8.4(@types/node@22.19.9)(typescript@5.9.3)
sonner:
specifier: ^2.0.7
- version: 2.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
swr:
specifier: ^2.3.8
- version: 2.4.0(react@19.2.3)
+ version: 2.4.0(react@19.2.4)
tailwind-merge:
specifier: ^3.4.0
version: 3.4.0
@@ -124,11 +128,11 @@ importers:
specifier: ^8.16.0
version: 8.16.0
'@types/react':
- specifier: 19.2.7
- version: 19.2.7
+ specifier: 19.2.14
+ version: 19.2.14
'@types/react-dom':
specifier: 19.2.3
- version: 19.2.3(@types/react@19.2.7)
+ version: 19.2.3(@types/react@19.2.14)
'@types/validator':
specifier: ^13.15.10
version: 13.15.10
@@ -142,8 +146,8 @@ importers:
specifier: ^9
version: 9.39.2(jiti@2.6.1)
eslint-config-next:
- specifier: 16.1.1
- version: 16.1.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ specifier: 16.2.1
+ version: 16.2.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
tailwindcss:
specifier: ^4
version: 4.1.18
@@ -464,7 +468,7 @@ packages:
resolution: {integrity: sha512-ikcJRNj1mOiF2HZ5jQHrXoVoHcNHdBU5ejJljcBl+VTLoYXR6FidjTN86GjO6hyshi6TZFuNvv0dEOgaOFv6Lw==}
engines: {node: '>=14.0.0'}
peerDependencies:
- '@types/react': ^17 || ^18 || ^19
+ '@types/react': 19.2.14
react: ^17 || ^18 || ^19
react-dom: ^17 || ^18 || ^19
peerDependenciesMeta:
@@ -474,7 +478,7 @@ packages:
'@base-ui/utils@0.2.4':
resolution: {integrity: sha512-smZwpMhjO29v+jrZusBSc5T+IJ3vBb9cjIiBjtKcvWmRj9Z4DWGVR3efr1eHR56/bqY5a4qyY9ElkOY5ljo3ng==}
peerDependencies:
- '@types/react': ^17 || ^18 || ^19
+ '@types/react': 19.2.14
react: ^17 || ^18 || ^19
react-dom: ^17 || ^18 || ^19
peerDependenciesMeta:
@@ -524,24 +528,28 @@ packages:
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@biomejs/cli-linux-arm64@2.3.10':
resolution: {integrity: sha512-hhPw2V3/EpHKsileVOFynuWiKRgFEV48cLe0eA+G2wO4SzlwEhLEB9LhlSrVeu2mtSn205W283LkX7Fh48CaxA==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@biomejs/cli-linux-x64-musl@2.3.10':
resolution: {integrity: sha512-QTfHZQh62SDFdYc2nfmZFuTm5yYb4eO1zwfB+90YxUumRCR171tS1GoTX5OD0wrv4UsziMPmrePMtkTnNyYG3g==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@biomejs/cli-linux-x64@2.3.10':
resolution: {integrity: sha512-wwAkWD1MR95u+J4LkWP74/vGz+tRrIQvr8kfMMJY8KOQ8+HMVleREOcPYsQX82S7uueco60L58Wc6M1I9WA9Dw==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@biomejs/cli-win32-arm64@2.3.10':
resolution: {integrity: sha512-o7lYc9n+CfRbHvkjPhm8s9FgbKdYZu5HCcGVMItLjz93EhgJ8AM44W+QckDqLA9MKDNFrR8nPbO4b73VC5kGGQ==}
@@ -1162,89 +1170,105 @@ packages:
resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-arm@1.2.4':
resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-ppc64@1.2.4':
resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-riscv64@1.2.4':
resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-s390x@1.2.4':
resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-x64@1.2.4':
resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linuxmusl-arm64@1.2.4':
resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@img/sharp-libvips-linuxmusl-x64@1.2.4':
resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@img/sharp-linux-arm64@0.34.5':
resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-arm@0.34.5':
resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-ppc64@0.34.5':
resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-riscv64@0.34.5':
resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-s390x@0.34.5':
resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-x64@0.34.5':
resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linuxmusl-arm64@0.34.5':
resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@img/sharp-linuxmusl-x64@0.34.5':
resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@img/sharp-wasm32@0.34.5':
resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
@@ -1354,56 +1378,60 @@ packages:
'@napi-rs/wasm-runtime@0.2.12':
resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
- '@next/env@16.1.5':
- resolution: {integrity: sha512-CRSCPJiSZoi4Pn69RYBDI9R7YK2g59vLexPQFXY0eyw+ILevIenCywzg+DqmlBik9zszEnw2HLFOUlLAcJbL7g==}
+ '@next/env@16.2.1':
+ resolution: {integrity: sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==}
- '@next/eslint-plugin-next@16.1.1':
- resolution: {integrity: sha512-Ovb/6TuLKbE1UiPcg0p39Ke3puyTCIKN9hGbNItmpQsp+WX3qrjO3WaMVSi6JHr9X1NrmthqIguVHodMJbh/dw==}
+ '@next/eslint-plugin-next@16.2.1':
+ resolution: {integrity: sha512-r0epZGo24eT4g08jJlg2OEryBphXqO8aL18oajoTKLzHJ6jVr6P6FI58DLMug04MwD3j8Fj0YK0slyzneKVyzA==}
- '@next/swc-darwin-arm64@16.1.5':
- resolution: {integrity: sha512-eK7Wdm3Hjy/SCL7TevlH0C9chrpeOYWx2iR7guJDaz4zEQKWcS1IMVfMb9UKBFMg1XgzcPTYPIp1Vcpukkjg6Q==}
+ '@next/swc-darwin-arm64@16.2.1':
+ resolution: {integrity: sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@16.1.5':
- resolution: {integrity: sha512-foQscSHD1dCuxBmGkbIr6ScAUF6pRoDZP6czajyvmXPAOFNnQUJu2Os1SGELODjKp/ULa4fulnBWoHV3XdPLfA==}
+ '@next/swc-darwin-x64@16.2.1':
+ resolution: {integrity: sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@16.1.5':
- resolution: {integrity: sha512-qNIb42o3C02ccIeSeKjacF3HXotGsxh/FMk/rSRmCzOVMtoWH88odn2uZqF8RLsSUWHcAqTgYmPD3pZ03L9ZAA==}
+ '@next/swc-linux-arm64-gnu@16.2.1':
+ resolution: {integrity: sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- '@next/swc-linux-arm64-musl@16.1.5':
- resolution: {integrity: sha512-U+kBxGUY1xMAzDTXmuVMfhaWUZQAwzRaHJ/I6ihtR5SbTVUEaDRiEU9YMjy1obBWpdOBuk1bcm+tsmifYSygfw==}
+ '@next/swc-linux-arm64-musl@16.2.1':
+ resolution: {integrity: sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- '@next/swc-linux-x64-gnu@16.1.5':
- resolution: {integrity: sha512-gq2UtoCpN7Ke/7tKaU7i/1L7eFLfhMbXjNghSv0MVGF1dmuoaPeEVDvkDuO/9LVa44h5gqpWeJ4mRRznjDv7LA==}
+ '@next/swc-linux-x64-gnu@16.2.1':
+ resolution: {integrity: sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@next/swc-linux-x64-musl@16.1.5':
- resolution: {integrity: sha512-bQWSE729PbXT6mMklWLf8dotislPle2L70E9q6iwETYEOt092GDn0c+TTNj26AjmeceSsC4ndyGsK5nKqHYXjQ==}
+ '@next/swc-linux-x64-musl@16.2.1':
+ resolution: {integrity: sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
- '@next/swc-win32-arm64-msvc@16.1.5':
- resolution: {integrity: sha512-LZli0anutkIllMtTAWZlDqdfvjWX/ch8AFK5WgkNTvaqwlouiD1oHM+WW8RXMiL0+vAkAJyAGEzPPjO+hnrSNQ==}
+ '@next/swc-win32-arm64-msvc@16.2.1':
+ resolution: {integrity: sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@16.1.5':
- resolution: {integrity: sha512-7is37HJTNQGhjPpQbkKjKEboHYQnCgpVt/4rBrrln0D9nderNxZ8ZWs8w1fAtzUx7wEyYjQ+/13myFgFj6K2Ng==}
+ '@next/swc-win32-x64-msvc@16.2.1':
+ resolution: {integrity: sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -1994,7 +2022,7 @@ packages:
'@radix-ui/react-compose-refs@1.1.2':
resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2003,7 +2031,7 @@ packages:
'@radix-ui/react-context@1.1.2':
resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2012,8 +2040,8 @@ packages:
'@radix-ui/react-dialog@1.1.15':
resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
@@ -2025,8 +2053,8 @@ packages:
'@radix-ui/react-dismissable-layer@1.1.11':
resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
@@ -2038,7 +2066,7 @@ packages:
'@radix-ui/react-focus-guards@1.1.3':
resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2047,8 +2075,8 @@ packages:
'@radix-ui/react-focus-scope@1.1.7':
resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
@@ -2060,7 +2088,7 @@ packages:
'@radix-ui/react-id@1.1.1':
resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2069,8 +2097,8 @@ packages:
'@radix-ui/react-portal@1.1.9':
resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
@@ -2082,8 +2110,8 @@ packages:
'@radix-ui/react-presence@1.1.5':
resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
@@ -2095,8 +2123,8 @@ packages:
'@radix-ui/react-primitive@2.1.3':
resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
@@ -2108,8 +2136,8 @@ packages:
'@radix-ui/react-primitive@2.1.4':
resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
@@ -2121,7 +2149,7 @@ packages:
'@radix-ui/react-slot@1.2.3':
resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2130,7 +2158,7 @@ packages:
'@radix-ui/react-slot@1.2.4':
resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2139,7 +2167,7 @@ packages:
'@radix-ui/react-use-callback-ref@1.1.1':
resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2148,7 +2176,7 @@ packages:
'@radix-ui/react-use-controllable-state@1.2.2':
resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2157,7 +2185,7 @@ packages:
'@radix-ui/react-use-effect-event@0.0.2':
resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2166,7 +2194,7 @@ packages:
'@radix-ui/react-use-escape-keydown@1.1.1':
resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2175,7 +2203,7 @@ packages:
'@radix-ui/react-use-layout-effect@1.1.1':
resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -2616,24 +2644,28 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@tailwindcss/oxide-linux-arm64-musl@4.1.18':
resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@tailwindcss/oxide-linux-x64-gnu@4.1.18':
resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@tailwindcss/oxide-linux-x64-musl@4.1.18':
resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@tailwindcss/oxide-wasm32-wasi@4.1.18':
resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
@@ -2731,10 +2763,10 @@ packages:
'@types/react-dom@19.2.3':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
peerDependencies:
- '@types/react': ^19.2.0
+ '@types/react': 19.2.14
- '@types/react@19.2.7':
- resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==}
+ '@types/react@19.2.14':
+ resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==}
'@types/statuses@2.0.6':
resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==}
@@ -2846,41 +2878,49 @@ packages:
resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-arm64-musl@1.11.1':
resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
cpu: [riscv64]
os: [linux]
+ libc: [musl]
'@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-x64-gnu@1.11.1':
resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-x64-musl@1.11.1':
resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@unrs/resolver-binding-wasm32-wasi@1.11.1':
resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
@@ -3628,8 +3668,8 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
- eslint-config-next@16.1.1:
- resolution: {integrity: sha512-55nTpVWm3qeuxoQKLOjQVciKZJUphKrNM0fCcQHAIOGl6VFXgaqeMfv0aKJhs7QtcnlAPhNVqsqRfRjeKBPIUA==}
+ eslint-config-next@16.2.1:
+ resolution: {integrity: sha512-qhabwjQZ1Mk53XzXvmogf8KQ0tG0CQXF0CZ56+2/lVhmObgmaqj7x5A1DSrWdZd3kwI7GTPGUjFne+krRxYmFg==}
peerDependencies:
eslint: '>=9.0.0'
typescript: '>=3.3.1'
@@ -4447,24 +4487,28 @@ packages:
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
lightningcss-linux-arm64-musl@1.30.2:
resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
lightningcss-linux-x64-gnu@1.30.2:
resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
lightningcss-linux-x64-musl@1.30.2:
resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ libc: [musl]
lightningcss-win32-arm64-msvc@1.30.2:
resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
@@ -4637,8 +4681,8 @@ packages:
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
- next@16.1.5:
- resolution: {integrity: sha512-f+wE+NSbiQgh3DSAlTaw2FwY5yGdVViAtp8TotNQj4kk4Q8Bh1sC/aL9aH+Rg1YAVn18OYXsRDT7U/079jgP7w==}
+ next@16.2.1:
+ resolution: {integrity: sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==}
engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
@@ -4993,10 +5037,10 @@ packages:
resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
engines: {node: '>= 0.10'}
- react-dom@19.2.3:
- resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==}
+ react-dom@19.2.4:
+ resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==}
peerDependencies:
- react: ^19.2.3
+ react: ^19.2.4
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@@ -5005,7 +5049,7 @@ packages:
resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
engines: {node: '>=10'}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
peerDependenciesMeta:
'@types/react':
@@ -5015,7 +5059,7 @@ packages:
resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==}
engines: {node: '>=10'}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -5025,14 +5069,14 @@ packages:
resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
engines: {node: '>=10'}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
optional: true
- react@19.2.3:
- resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==}
+ react@19.2.4:
+ resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==}
engines: {node: '>=0.10.0'}
recast@0.23.11:
@@ -5530,7 +5574,7 @@ packages:
resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
engines: {node: '>=10'}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -5540,7 +5584,7 @@ packages:
resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
engines: {node: '>=10'}
peerDependencies:
- '@types/react': '*'
+ '@types/react': 19.2.14
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@@ -6362,30 +6406,30 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
- '@base-ui/react@1.1.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@base-ui/react@1.1.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@babel/runtime': 7.28.6
- '@base-ui/utils': 0.2.4(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@floating-ui/react-dom': 2.1.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ '@base-ui/utils': 0.2.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@floating-ui/utils': 0.2.10
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
reselect: 5.1.1
tabbable: 6.4.0
- use-sync-external-store: 1.6.0(react@19.2.3)
+ use-sync-external-store: 1.6.0(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@base-ui/utils@0.2.4(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@base-ui/utils@0.2.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@babel/runtime': 7.28.6
'@floating-ui/utils': 0.2.10
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
reselect: 5.1.1
- use-sync-external-store: 1.6.0(react@19.2.3)
+ use-sync-external-store: 1.6.0(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
'@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)':
dependencies:
@@ -6445,19 +6489,19 @@ snapshots:
'@bprogress/core@1.3.4': {}
- '@bprogress/next@3.2.12(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@bprogress/next@3.2.12(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@bprogress/core': 1.3.4
- '@bprogress/react': 1.2.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- next: 16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@bprogress/react': 1.2.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ next: 16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
- '@bprogress/react@1.2.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@bprogress/react@1.2.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@bprogress/core': 1.3.4
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
'@bufbuild/protobuf@2.11.0': {}
@@ -6782,11 +6826,11 @@ snapshots:
'@floating-ui/core': 1.7.4
'@floating-ui/utils': 0.2.10
- '@floating-ui/react-dom@2.1.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@floating-ui/dom': 1.7.5
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
'@floating-ui/utils@0.2.10': {}
@@ -7014,34 +7058,34 @@ snapshots:
'@tybys/wasm-util': 0.10.1
optional: true
- '@next/env@16.1.5': {}
+ '@next/env@16.2.1': {}
- '@next/eslint-plugin-next@16.1.1':
+ '@next/eslint-plugin-next@16.2.1':
dependencies:
fast-glob: 3.3.1
- '@next/swc-darwin-arm64@16.1.5':
+ '@next/swc-darwin-arm64@16.2.1':
optional: true
- '@next/swc-darwin-x64@16.1.5':
+ '@next/swc-darwin-x64@16.2.1':
optional: true
- '@next/swc-linux-arm64-gnu@16.1.5':
+ '@next/swc-linux-arm64-gnu@16.2.1':
optional: true
- '@next/swc-linux-arm64-musl@16.1.5':
+ '@next/swc-linux-arm64-musl@16.2.1':
optional: true
- '@next/swc-linux-x64-gnu@16.1.5':
+ '@next/swc-linux-x64-gnu@16.2.1':
optional: true
- '@next/swc-linux-x64-musl@16.1.5':
+ '@next/swc-linux-x64-musl@16.2.1':
optional: true
- '@next/swc-win32-arm64-msvc@16.1.5':
+ '@next/swc-win32-arm64-msvc@16.2.1':
optional: true
- '@next/swc-win32-x64-msvc@16.1.5':
+ '@next/swc-win32-x64-msvc@16.2.1':
optional: true
'@noble/ciphers@1.3.0': {}
@@ -7891,286 +7935,286 @@ snapshots:
'@radix-ui/primitive@1.1.3': {}
- '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@radix-ui/react-context@1.1.2(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@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.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4)
+ '@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.4(react@19.2.4))(react@19.2.4)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4)
+ '@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.4(react@19.2.4))(react@19.2.4)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ '@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.4(react@19.2.4))(react@19.2.4)
+ '@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.4(react@19.2.4))(react@19.2.4)
+ '@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.4(react@19.2.4))(react@19.2.4)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4)
aria-hidden: 1.2.6
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3(@types/react@19.2.14)
- '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@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.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
+ '@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.4(react@19.2.4))(react@19.2.4)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3(@types/react@19.2.14)
- '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@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.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
+ '@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.4(react@19.2.4))(react@19.2.4)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3(@types/react@19.2.14)
- '@radix-ui/react-id@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@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.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.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.4(react@19.2.4))(react@19.2.4)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3(@types/react@19.2.14)
- '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@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.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3(@types/react@19.2.14)
- '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.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.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3(@types/react@19.2.14)
- '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@radix-ui/react-slot': 1.2.4(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3(@types/react@19.2.14)
- '@radix-ui/react-slot@1.2.3(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@radix-ui/react-slot@1.2.4(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-slot@1.2.4(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@react-email/body@0.2.1(react@19.2.3)':
+ '@react-email/body@0.2.1(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/button@0.2.1(react@19.2.3)':
+ '@react-email/button@0.2.1(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/code-block@0.2.1(react@19.2.3)':
+ '@react-email/code-block@0.2.1(react@19.2.4)':
dependencies:
prismjs: 1.30.0
- react: 19.2.3
-
- '@react-email/code-inline@0.0.6(react@19.2.3)':
- dependencies:
- react: 19.2.3
-
- '@react-email/column@0.0.14(react@19.2.3)':
- dependencies:
- react: 19.2.3
-
- '@react-email/components@1.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
- dependencies:
- '@react-email/body': 0.2.1(react@19.2.3)
- '@react-email/button': 0.2.1(react@19.2.3)
- '@react-email/code-block': 0.2.1(react@19.2.3)
- '@react-email/code-inline': 0.0.6(react@19.2.3)
- '@react-email/column': 0.0.14(react@19.2.3)
- '@react-email/container': 0.0.16(react@19.2.3)
- '@react-email/font': 0.0.10(react@19.2.3)
- '@react-email/head': 0.0.13(react@19.2.3)
- '@react-email/heading': 0.0.16(react@19.2.3)
- '@react-email/hr': 0.0.12(react@19.2.3)
- '@react-email/html': 0.0.12(react@19.2.3)
- '@react-email/img': 0.0.12(react@19.2.3)
- '@react-email/link': 0.0.13(react@19.2.3)
- '@react-email/markdown': 0.0.18(react@19.2.3)
- '@react-email/preview': 0.0.14(react@19.2.3)
- '@react-email/render': 2.0.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@react-email/row': 0.0.13(react@19.2.3)
- '@react-email/section': 0.0.17(react@19.2.3)
- '@react-email/tailwind': 2.0.4(@react-email/body@0.2.1(react@19.2.3))(@react-email/button@0.2.1(react@19.2.3))(@react-email/code-block@0.2.1(react@19.2.3))(@react-email/code-inline@0.0.6(react@19.2.3))(@react-email/container@0.0.16(react@19.2.3))(@react-email/heading@0.0.16(react@19.2.3))(@react-email/hr@0.0.12(react@19.2.3))(@react-email/img@0.0.12(react@19.2.3))(@react-email/link@0.0.13(react@19.2.3))(@react-email/preview@0.0.14(react@19.2.3))(@react-email/text@0.1.6(react@19.2.3))(react@19.2.3)
- '@react-email/text': 0.1.6(react@19.2.3)
- react: 19.2.3
+ react: 19.2.4
+
+ '@react-email/code-inline@0.0.6(react@19.2.4)':
+ dependencies:
+ react: 19.2.4
+
+ '@react-email/column@0.0.14(react@19.2.4)':
+ dependencies:
+ react: 19.2.4
+
+ '@react-email/components@1.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-email/body': 0.2.1(react@19.2.4)
+ '@react-email/button': 0.2.1(react@19.2.4)
+ '@react-email/code-block': 0.2.1(react@19.2.4)
+ '@react-email/code-inline': 0.0.6(react@19.2.4)
+ '@react-email/column': 0.0.14(react@19.2.4)
+ '@react-email/container': 0.0.16(react@19.2.4)
+ '@react-email/font': 0.0.10(react@19.2.4)
+ '@react-email/head': 0.0.13(react@19.2.4)
+ '@react-email/heading': 0.0.16(react@19.2.4)
+ '@react-email/hr': 0.0.12(react@19.2.4)
+ '@react-email/html': 0.0.12(react@19.2.4)
+ '@react-email/img': 0.0.12(react@19.2.4)
+ '@react-email/link': 0.0.13(react@19.2.4)
+ '@react-email/markdown': 0.0.18(react@19.2.4)
+ '@react-email/preview': 0.0.14(react@19.2.4)
+ '@react-email/render': 2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-email/row': 0.0.13(react@19.2.4)
+ '@react-email/section': 0.0.17(react@19.2.4)
+ '@react-email/tailwind': 2.0.4(@react-email/body@0.2.1(react@19.2.4))(@react-email/button@0.2.1(react@19.2.4))(@react-email/code-block@0.2.1(react@19.2.4))(@react-email/code-inline@0.0.6(react@19.2.4))(@react-email/container@0.0.16(react@19.2.4))(@react-email/heading@0.0.16(react@19.2.4))(@react-email/hr@0.0.12(react@19.2.4))(@react-email/img@0.0.12(react@19.2.4))(@react-email/link@0.0.13(react@19.2.4))(@react-email/preview@0.0.14(react@19.2.4))(@react-email/text@0.1.6(react@19.2.4))(react@19.2.4)
+ '@react-email/text': 0.1.6(react@19.2.4)
+ react: 19.2.4
transitivePeerDependencies:
- react-dom
- '@react-email/container@0.0.16(react@19.2.3)':
+ '@react-email/container@0.0.16(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/font@0.0.10(react@19.2.3)':
+ '@react-email/font@0.0.10(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/head@0.0.13(react@19.2.3)':
+ '@react-email/head@0.0.13(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/heading@0.0.16(react@19.2.3)':
+ '@react-email/heading@0.0.16(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/hr@0.0.12(react@19.2.3)':
+ '@react-email/hr@0.0.12(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/html@0.0.12(react@19.2.3)':
+ '@react-email/html@0.0.12(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/img@0.0.12(react@19.2.3)':
+ '@react-email/img@0.0.12(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/link@0.0.13(react@19.2.3)':
+ '@react-email/link@0.0.13(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/markdown@0.0.18(react@19.2.3)':
+ '@react-email/markdown@0.0.18(react@19.2.4)':
dependencies:
marked: 15.0.12
- react: 19.2.3
+ react: 19.2.4
- '@react-email/preview@0.0.14(react@19.2.3)':
+ '@react-email/preview@0.0.14(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/render@2.0.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@react-email/render@2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
html-to-text: 9.0.5
prettier: 3.8.1
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
- '@react-email/row@0.0.13(react@19.2.3)':
+ '@react-email/row@0.0.13(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/section@0.0.17(react@19.2.3)':
+ '@react-email/section@0.0.17(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
- '@react-email/tailwind@2.0.4(@react-email/body@0.2.1(react@19.2.3))(@react-email/button@0.2.1(react@19.2.3))(@react-email/code-block@0.2.1(react@19.2.3))(@react-email/code-inline@0.0.6(react@19.2.3))(@react-email/container@0.0.16(react@19.2.3))(@react-email/heading@0.0.16(react@19.2.3))(@react-email/hr@0.0.12(react@19.2.3))(@react-email/img@0.0.12(react@19.2.3))(@react-email/link@0.0.13(react@19.2.3))(@react-email/preview@0.0.14(react@19.2.3))(@react-email/text@0.1.6(react@19.2.3))(react@19.2.3)':
+ '@react-email/tailwind@2.0.4(@react-email/body@0.2.1(react@19.2.4))(@react-email/button@0.2.1(react@19.2.4))(@react-email/code-block@0.2.1(react@19.2.4))(@react-email/code-inline@0.0.6(react@19.2.4))(@react-email/container@0.0.16(react@19.2.4))(@react-email/heading@0.0.16(react@19.2.4))(@react-email/hr@0.0.12(react@19.2.4))(@react-email/img@0.0.12(react@19.2.4))(@react-email/link@0.0.13(react@19.2.4))(@react-email/preview@0.0.14(react@19.2.4))(@react-email/text@0.1.6(react@19.2.4))(react@19.2.4)':
dependencies:
- '@react-email/text': 0.1.6(react@19.2.3)
- react: 19.2.3
+ '@react-email/text': 0.1.6(react@19.2.4)
+ react: 19.2.4
tailwindcss: 4.1.18
optionalDependencies:
- '@react-email/body': 0.2.1(react@19.2.3)
- '@react-email/button': 0.2.1(react@19.2.3)
- '@react-email/code-block': 0.2.1(react@19.2.3)
- '@react-email/code-inline': 0.0.6(react@19.2.3)
- '@react-email/container': 0.0.16(react@19.2.3)
- '@react-email/heading': 0.0.16(react@19.2.3)
- '@react-email/hr': 0.0.12(react@19.2.3)
- '@react-email/img': 0.0.12(react@19.2.3)
- '@react-email/link': 0.0.13(react@19.2.3)
- '@react-email/preview': 0.0.14(react@19.2.3)
+ '@react-email/body': 0.2.1(react@19.2.4)
+ '@react-email/button': 0.2.1(react@19.2.4)
+ '@react-email/code-block': 0.2.1(react@19.2.4)
+ '@react-email/code-inline': 0.0.6(react@19.2.4)
+ '@react-email/container': 0.0.16(react@19.2.4)
+ '@react-email/heading': 0.0.16(react@19.2.4)
+ '@react-email/hr': 0.0.12(react@19.2.4)
+ '@react-email/img': 0.0.12(react@19.2.4)
+ '@react-email/link': 0.0.13(react@19.2.4)
+ '@react-email/preview': 0.0.14(react@19.2.4)
- '@react-email/text@0.1.6(react@19.2.3)':
+ '@react-email/text@0.1.6(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
'@rtsao/scc@1.1.0': {}
@@ -8682,11 +8726,11 @@ snapshots:
pg-protocol: 1.11.0
pg-types: 2.2.0
- '@types/react-dom@19.2.3(@types/react@19.2.7)':
+ '@types/react-dom@19.2.3(@types/react@19.2.14)':
dependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- '@types/react@19.2.7':
+ '@types/react@19.2.14':
dependencies:
csstype: 3.2.3
@@ -9018,7 +9062,7 @@ snapshots:
baseline-browser-mapping@2.9.19: {}
- better-auth@1.4.18(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(kysely@0.28.11)(pg@8.18.0))(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ better-auth@1.4.18(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(kysely@0.28.11)(pg@8.18.0))(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(pg@8.18.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
'@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)
'@better-auth/telemetry': 1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0))
@@ -9035,10 +9079,10 @@ snapshots:
optionalDependencies:
drizzle-kit: 0.31.8
drizzle-orm: 0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(kysely@0.28.11)(pg@8.18.0)
- next: 16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ next: 16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
pg: 8.18.0
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
better-call@1.1.8(zod@4.3.6):
dependencies:
@@ -9152,14 +9196,14 @@ snapshots:
clsx@2.1.1: {}
- cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
+ '@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.4(react@19.2.4))(react@19.2.4)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
transitivePeerDependencies:
- '@types/react'
- '@types/react-dom'
@@ -9585,9 +9629,9 @@ snapshots:
escape-string-regexp@4.0.0: {}
- eslint-config-next@16.1.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3):
+ eslint-config-next@16.2.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3):
dependencies:
- '@next/eslint-plugin-next': 16.1.1
+ '@next/eslint-plugin-next': 16.2.1
eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1))
@@ -10187,7 +10231,7 @@ snapshots:
inherits@2.0.4: {}
- inngest@3.51.0(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(express@5.2.1)(hono@4.11.8)(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)(zod@4.3.6):
+ inngest@3.51.0(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(express@5.2.1)(hono@4.11.8)(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(zod@4.3.6):
dependencies:
'@bufbuild/protobuf': 2.11.0
'@inngest/ai': 0.1.7
@@ -10218,7 +10262,7 @@ snapshots:
optionalDependencies:
express: 5.2.1
hono: 4.11.8
- next: 16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ next: 16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
typescript: 5.9.3
transitivePeerDependencies:
- '@opentelemetry/core'
@@ -10546,9 +10590,9 @@ snapshots:
dependencies:
yallist: 3.1.1
- lucide-react@0.562.0(react@19.2.3):
+ lucide-react@0.562.0(react@19.2.4):
dependencies:
- react: 19.2.3
+ react: 19.2.4
luxon@3.7.2: {}
@@ -10646,30 +10690,30 @@ snapshots:
negotiator@1.0.0: {}
- next-themes@0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ next-themes@0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
- next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
- '@next/env': 16.1.5
+ '@next/env': 16.2.1
'@swc/helpers': 0.5.15
baseline-browser-mapping: 2.9.19
caniuse-lite: 1.0.30001769
postcss: 8.4.31
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.4)
optionalDependencies:
- '@next/swc-darwin-arm64': 16.1.5
- '@next/swc-darwin-x64': 16.1.5
- '@next/swc-linux-arm64-gnu': 16.1.5
- '@next/swc-linux-arm64-musl': 16.1.5
- '@next/swc-linux-x64-gnu': 16.1.5
- '@next/swc-linux-x64-musl': 16.1.5
- '@next/swc-win32-arm64-msvc': 16.1.5
- '@next/swc-win32-x64-msvc': 16.1.5
+ '@next/swc-darwin-arm64': 16.2.1
+ '@next/swc-darwin-x64': 16.2.1
+ '@next/swc-linux-arm64-gnu': 16.2.1
+ '@next/swc-linux-arm64-musl': 16.2.1
+ '@next/swc-linux-x64-gnu': 16.2.1
+ '@next/swc-linux-x64-musl': 16.2.1
+ '@next/swc-win32-arm64-msvc': 16.2.1
+ '@next/swc-win32-x64-msvc': 16.2.1
'@opentelemetry/api': 1.9.0
sharp: 0.34.5
transitivePeerDependencies:
@@ -10703,12 +10747,12 @@ snapshots:
path-key: 4.0.0
unicorn-magic: 0.3.0
- nuqs@2.8.8(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3):
+ nuqs@2.8.8(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4):
dependencies:
'@standard-schema/spec': 1.0.0
- react: 19.2.3
+ react: 19.2.4
optionalDependencies:
- next: 16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ next: 16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
object-assign@4.1.1: {}
@@ -11009,41 +11053,41 @@ snapshots:
iconv-lite: 0.7.2
unpipe: 1.0.0
- react-dom@19.2.3(react@19.2.3):
+ react-dom@19.2.4(react@19.2.4):
dependencies:
- react: 19.2.3
+ react: 19.2.4
scheduler: 0.27.0
react-is@16.13.1: {}
- react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.2.3):
+ react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.4):
dependencies:
- react: 19.2.3
- react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.3)
+ react: 19.2.4
+ react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4)
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- react-remove-scroll@2.7.2(@types/react@19.2.7)(react@19.2.3):
+ react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.4):
dependencies:
- react: 19.2.3
- react-remove-scroll-bar: 2.3.8(@types/react@19.2.7)(react@19.2.3)
- react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.3)
+ react: 19.2.4
+ react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.4)
+ react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4)
tslib: 2.8.1
- use-callback-ref: 1.3.3(@types/react@19.2.7)(react@19.2.3)
- use-sidecar: 1.1.3(@types/react@19.2.7)(react@19.2.3)
+ use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.4)
+ use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- react-style-singleton@2.2.3(@types/react@19.2.7)(react@19.2.3):
+ react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.4):
dependencies:
get-nonce: 1.0.1
- react: 19.2.3
+ react: 19.2.4
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- react@19.2.3: {}
+ react@19.2.4: {}
recast@0.23.11:
dependencies:
@@ -11345,10 +11389,10 @@ snapshots:
sisteransi@1.0.5: {}
- sonner@2.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ sonner@2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
source-map-js@1.2.1: {}
@@ -11464,10 +11508,10 @@ snapshots:
strnum@2.1.2: {}
- styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.3):
+ styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.4):
dependencies:
client-only: 0.0.1
- react: 19.2.3
+ react: 19.2.4
optionalDependencies:
'@babel/core': 7.29.0
@@ -11481,11 +11525,11 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
- swr@2.4.0(react@19.2.3):
+ swr@2.4.0(react@19.2.4):
dependencies:
dequal: 2.0.3
- react: 19.2.3
- use-sync-external-store: 1.6.0(react@19.2.3)
+ react: 19.2.4
+ use-sync-external-store: 1.6.0(react@19.2.4)
tabbable@6.4.0: {}
@@ -11684,24 +11728,24 @@ snapshots:
dependencies:
punycode: 2.3.1
- use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.2.3):
+ use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.4):
dependencies:
- react: 19.2.3
+ react: 19.2.4
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- use-sidecar@1.1.3(@types/react@19.2.7)(react@19.2.3):
+ use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.4):
dependencies:
detect-node-es: 1.1.0
- react: 19.2.3
+ react: 19.2.4
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.14
- use-sync-external-store@1.6.0(react@19.2.3):
+ use-sync-external-store@1.6.0(react@19.2.4):
dependencies:
- react: 19.2.3
+ react: 19.2.4
util-deprecate@1.0.2: {}
From b8139435bffcc2166597f14055e5ef559ef9a69b Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Sat, 21 Mar 2026 13:13:05 +1100
Subject: [PATCH 09/12] Show agent update prompt
---
compose.dev.yml | 8 +++
.../dashboard/servers/[id]/page.tsx | 33 +++++++++-
web/components/server/agent-update-nudge.tsx | 63 +++++++++++++++++++
web/package.json | 5 +-
web/public/setup.sh | 6 ++
web/public/update.sh | 7 ++-
6 files changed, 117 insertions(+), 5 deletions(-)
create mode 100644 web/components/server/agent-update-nudge.tsx
diff --git a/compose.dev.yml b/compose.dev.yml
index e02a2b5..a3681ce 100644
--- a/compose.dev.yml
+++ b/compose.dev.yml
@@ -49,6 +49,14 @@ services:
command: server /data --console-address ":9001"
restart: unless-stopped
+ inngest:
+ image: inngest/inngest
+ ports:
+ - "8288:8288"
+ - "8289:8289"
+ command: inngest dev -u http://host.docker.internal:3000/api/inngest
+ restart: unless-stopped
+
volumes:
registry-data:
victoria-logs-data:
diff --git a/web/app/(dashboard)/dashboard/servers/[id]/page.tsx b/web/app/(dashboard)/dashboard/servers/[id]/page.tsx
index ee6b95f..f2bee83 100644
--- a/web/app/(dashboard)/dashboard/servers/[id]/page.tsx
+++ b/web/app/(dashboard)/dashboard/servers/[id]/page.tsx
@@ -14,21 +14,44 @@ import { ServerDangerZone } from "@/components/server/server-danger-zone";
import { ServerHeader } from "@/components/server/server-header";
import { ServerHealthDetails } from "@/components/server/server-health-details";
import { ServerServices } from "@/components/server/server-services";
+import { AgentUpdateNudge } from "@/components/server/agent-update-nudge";
import { formatRelativeTime } from "@/lib/date";
+async function getLatestAgentVersion(): Promise {
+ try {
+ const res = await fetch(
+ "https://api.github.com/repos/techulus/cloud/releases/latest",
+ {
+ headers: { Accept: "application/vnd.github.v3+json" },
+ },
+ );
+ if (!res.ok) return null;
+ const data = await res.json();
+ return data.tag_name ?? null;
+ } catch {
+ return null;
+ }
+}
+
export default async function ServerDetailPage({
params,
}: {
params: Promise<{ id: string }>;
}) {
const { id } = await params;
- const server = await getServerDetails(id);
+ const [server, latestVersion] = await Promise.all([
+ getServerDetails(id),
+ getLatestAgentVersion(),
+ ]);
if (!server) {
notFound();
}
const isUnregistered = !server.wireguardIp && server.agentToken;
+ const currentVersion = server.agentHealth?.version;
+ const hasUpdate =
+ currentVersion && latestVersion && currentVersion !== latestVersion;
return (
<>
@@ -41,6 +64,14 @@ export default async function ServerDetailPage({
+ {hasUpdate && (
+
+ )}
+
{isUnregistered && (
diff --git a/web/components/server/agent-update-nudge.tsx b/web/components/server/agent-update-nudge.tsx
new file mode 100644
index 0000000..0651bef
--- /dev/null
+++ b/web/components/server/agent-update-nudge.tsx
@@ -0,0 +1,63 @@
+"use client";
+
+import { useState } from "react";
+import { ArrowUpCircle } from "lucide-react";
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+} from "@/components/ui/dialog";
+
+interface AgentUpdateNudgeProps {
+ currentVersion: string;
+ latestVersion: string;
+ appUrl: string;
+}
+
+export function AgentUpdateNudge({
+ currentVersion,
+ latestVersion,
+ appUrl,
+}: AgentUpdateNudgeProps) {
+ const [open, setOpen] = useState(false);
+
+ return (
+ <>
+ setOpen(true)}
+ >
+
+
+ Agent update available:{" "}
+ {currentVersion}
+ {" → "}
+ {latestVersion}
+
+
+
+
+
+
+ Update Agent
+
+ Run the following command on your server to update the agent from{" "}
+ {currentVersion} to{" "}
+ {latestVersion} .
+
+
+
+
+ sudo bash -c "$(curl -fsSL {appUrl}/update.sh)"
+
+
+
+
+
+ >
+ );
+}
diff --git a/web/package.json b/web/package.json
index 009bb46..a7cd079 100644
--- a/web/package.json
+++ b/web/package.json
@@ -3,7 +3,7 @@
"version": "0.1.0",
"private": true,
"scripts": {
- "dev": "concurrently -n next,inngest -c blue,magenta \"next dev\" \"npx inngest-cli@latest dev\"",
+ "dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
@@ -56,7 +56,6 @@
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"@types/validator": "^13.15.10",
- "concurrently": "^9.2.1",
"drizzle-kit": "^0.31.8",
"eslint": "^9",
"eslint-config-next": "16.2.1",
@@ -65,7 +64,7 @@
"typescript": "^5"
},
"overrides": {
- "@types/react": "19.2.7",
+ "@types/react": "19.2.14",
"@types/react-dom": "19.2.3"
},
"pnpm": {
diff --git a/web/public/setup.sh b/web/public/setup.sh
index d2ea963..f5dea33 100644
--- a/web/public/setup.sh
+++ b/web/public/setup.sh
@@ -300,6 +300,12 @@ fi
echo "✓ crane installed"
step "Downloading Techulus Cloud agent..."
+LATEST_VERSION=$(curl -fsSL "https://api.github.com/repos/techulus/cloud/releases/latest" | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p')
+if [ -z "$LATEST_VERSION" ]; then
+ error "Failed to resolve latest version"
+fi
+echo "Installing version: $LATEST_VERSION"
+
AGENT_URL="https://github.com/techulus/cloud/releases/latest/download/agent-linux-${AGENT_ARCH}"
CHECKSUM_URL="https://github.com/techulus/cloud/releases/latest/download/checksums.txt"
diff --git a/web/public/update.sh b/web/public/update.sh
index 114c5c5..c9a454b 100644
--- a/web/public/update.sh
+++ b/web/public/update.sh
@@ -35,7 +35,12 @@ case $ARCH in
esac
echo "Architecture: $ARCH ($AGENT_ARCH)"
-echo "Downloading latest agent..."
+LATEST_VERSION=$(curl -fsSL "https://api.github.com/repos/techulus/cloud/releases/latest" | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p')
+if [ -z "$LATEST_VERSION" ]; then
+ error "Failed to resolve latest version"
+fi
+echo "Updating to version: $LATEST_VERSION"
+
AGENT_URL="https://github.com/techulus/cloud/releases/latest/download/agent-linux-${AGENT_ARCH}"
CHECKSUM_URL="https://github.com/techulus/cloud/releases/latest/download/checksums.txt"
From 911533fb2b7442fa9ad5f5e7c9e181bc0ddacf27 Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Sat, 21 Mar 2026 22:40:07 +1100
Subject: [PATCH 10/12] Clean up agent err
---
agent/cmd/agent/main.go | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/agent/cmd/agent/main.go b/agent/cmd/agent/main.go
index eb8842f..8e01c36 100644
--- a/agent/cmd/agent/main.go
+++ b/agent/cmd/agent/main.go
@@ -31,8 +31,10 @@ import (
"github.com/hashicorp/go-sockaddr"
)
-var httpClient *api.Client
-var dataDir string
+var (
+ httpClient *api.Client
+ dataDir string
+)
func main() {
var (
@@ -82,7 +84,7 @@ func main() {
log.Fatalf("Build prerequisites check failed: %v", err)
}
- if err := os.MkdirAll(dataDir, 0700); err != nil {
+ if err := os.MkdirAll(dataDir, 0o700); err != nil {
log.Fatalf("Failed to create data directory: %v", err)
}
@@ -115,12 +117,12 @@ func main() {
logsEndpoint = config.LoggingEndpoint
}
- if err := container.EnsureNetwork(config.SubnetID); err != nil {
+ if err = container.EnsureNetwork(config.SubnetID); err != nil {
log.Printf("Warning: Failed to ensure container network: %v", err)
}
if !disableDNS {
- if err := dns.SetupLocalDNS(config.SubnetID); err != nil {
+ if err = dns.SetupLocalDNS(config.SubnetID); err != nil {
log.Printf("Warning: Failed to setup local DNS: %v", err)
}
} else {
@@ -147,7 +149,7 @@ func main() {
log.Fatalf("Failed to generate WireGuard key pair: %v", err)
}
- if err := wireguard.SavePrivateKey(dataDir, wgPrivateKey); err != nil {
+ if err = wireguard.SavePrivateKey(dataDir, wgPrivateKey); err != nil {
log.Fatalf("Failed to save WireGuard private key: %v", err)
}
@@ -194,7 +196,7 @@ func main() {
logsEndpoint = respLoggingEndpoint
}
- if err := saveConfig(configPath, config); err != nil {
+ if err = saveConfig(configPath, config); err != nil {
log.Fatalf("Failed to save config: %v", err)
}
@@ -209,19 +211,19 @@ func main() {
}
log.Println("Writing WireGuard config...")
- if err := wireguard.WriteConfig(wireguard.DefaultInterface, wgConfig); err != nil {
+ if err = wireguard.WriteConfig(wireguard.DefaultInterface, wgConfig); err != nil {
log.Fatalf("Failed to write WireGuard config: %v", err)
}
log.Println("Bringing up WireGuard interface...")
- if err := wireguard.Up(wireguard.DefaultInterface); err != nil {
+ if err = wireguard.Up(wireguard.DefaultInterface); err != nil {
log.Fatalf("Failed to bring up WireGuard: %v", err)
}
log.Println("WireGuard interface is up!")
log.Println("Ensuring container network exists...")
- if err := container.EnsureNetwork(config.SubnetID); err != nil {
+ if err = container.EnsureNetwork(config.SubnetID); err != nil {
log.Printf("Warning: Failed to create container network: %v", err)
} else {
log.Println("Container network ready")
@@ -229,7 +231,7 @@ func main() {
if !disableDNS {
log.Println("Setting up local DNS...")
- if err := dns.SetupLocalDNS(config.SubnetID); err != nil {
+ if err = dns.SetupLocalDNS(config.SubnetID); err != nil {
log.Printf("Warning: Failed to setup local DNS: %v", err)
} else {
log.Println("Local DNS configured successfully")
@@ -333,7 +335,7 @@ func saveConfig(path string, config *agent.Config) error {
return err
}
- return os.WriteFile(path, data, 0600)
+ return os.WriteFile(path, data, 0o600)
}
func getPublicIP() string {
@@ -366,7 +368,7 @@ func getPrivateIP() string {
return ""
}
- for _, ip := range strings.Split(ips, " ") {
+ for ip := range strings.SplitSeq(ips, " ") {
if ip == "" {
continue
}
From bce1acdae9f7a6ebe6a85d5bca4660173647f8ad Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Sun, 22 Mar 2026 00:09:39 +1100
Subject: [PATCH 11/12] Remove data-dir, add config and network package
---
agent/MACOS.md | 4 +-
agent/README.md | 13 ++-
agent/cmd/agent/main.go | 95 +++----------------
agent/internal/configuration/configuration.go | 36 +++++++
agent/internal/network/network.go | 55 +++++++++++
docs/AGENT.md | 1 -
web/public/setup.sh | 5 +-
7 files changed, 114 insertions(+), 95 deletions(-)
create mode 100644 agent/internal/configuration/configuration.go
create mode 100644 agent/internal/network/network.go
diff --git a/agent/MACOS.md b/agent/MACOS.md
index c3c1a32..e063987 100644
--- a/agent/MACOS.md
+++ b/agent/MACOS.md
@@ -75,13 +75,13 @@ docker run -d --name buildkitd --privileged moby/buildkit:latest
Then run the agent with the `BUILDKIT_HOST` env var. Use `sudo -E` to preserve environment variables:
```bash
-sudo BUILDKIT_HOST=docker-container://buildkitd ./agent --url --data-dir /var/lib/techulus-agent
+sudo BUILDKIT_HOST=docker-container://buildkitd ./agent --url
```
Or with `-E`:
```bash
-BUILDKIT_HOST=docker-container://buildkitd sudo -E ./agent --url --data-dir /var/lib/techulus-agent
+BUILDKIT_HOST=docker-container://buildkitd sudo -E ./agent --url
```
## Insecure Registry (HTTP)
diff --git a/agent/README.md b/agent/README.md
index 87a3f95..94e5ab1 100644
--- a/agent/README.md
+++ b/agent/README.md
@@ -165,24 +165,24 @@ GOOS=linux GOARCH=amd64 go build -o bin/agent-linux-amd64 ./cmd/agent
Worker node:
```bash
-sudo ./agent --url --token --data-dir /var/lib/techulus-agent
+sudo ./agent --url --token
```
Proxy node:
```bash
-sudo ./agent --url --token --data-dir /var/lib/techulus-agent --proxy
+sudo ./agent --url --token --proxy
```
### Subsequent Runs
Worker node:
```bash
-sudo ./agent --url --data-dir /var/lib/techulus-agent
+sudo ./agent --url
```
Proxy node:
```bash
-sudo ./agent --url --data-dir /var/lib/techulus-agent --proxy
+sudo ./agent --url --proxy
```
### Run as systemd Service
@@ -199,7 +199,7 @@ After=network.target buildkitd.service
[Service]
Type=simple
-ExecStart=/usr/local/bin/agent --url --data-dir /var/lib/techulus-agent
+ExecStart=/usr/local/bin/agent --url
Restart=always
RestartSec=5
KillMode=process
@@ -216,7 +216,7 @@ After=network.target traefik.service buildkitd.service
[Service]
Type=simple
-ExecStart=/usr/local/bin/agent --url --data-dir /var/lib/techulus-agent --proxy
+ExecStart=/usr/local/bin/agent --url --proxy
Restart=always
RestartSec=5
KillMode=process
@@ -239,7 +239,6 @@ sudo systemctl start techulus-agent
|------|---------|-------------|
| `--url` | (required) | Control plane URL |
| `--token` | | Registration token (required for first run) |
-| `--data-dir` | `/var/lib/techulus-agent` | Data directory for agent state |
| `--logs-endpoint` | | VictoriaLogs endpoint |
| `--proxy` | `false` | Run as proxy node (handles TLS and public traffic) |
diff --git a/agent/cmd/agent/main.go b/agent/cmd/agent/main.go
index 8e01c36..d013f7b 100644
--- a/agent/cmd/agent/main.go
+++ b/agent/cmd/agent/main.go
@@ -2,38 +2,34 @@ package main
import (
"context"
- "encoding/json"
"flag"
- "io"
"log"
- "net/http"
"os"
"os/signal"
"path/filepath"
"runtime"
- "strings"
"syscall"
"time"
"techulus/cloud-agent/internal/agent"
"techulus/cloud-agent/internal/api"
"techulus/cloud-agent/internal/build"
+ "techulus/cloud-agent/internal/configuration"
"techulus/cloud-agent/internal/container"
"techulus/cloud-agent/internal/crypto"
"techulus/cloud-agent/internal/dns"
agenthttp "techulus/cloud-agent/internal/http"
"techulus/cloud-agent/internal/logs"
+ "techulus/cloud-agent/internal/network"
"techulus/cloud-agent/internal/paths"
"techulus/cloud-agent/internal/reconcile"
"techulus/cloud-agent/internal/traefik"
"techulus/cloud-agent/internal/wireguard"
-
- "github.com/hashicorp/go-sockaddr"
)
var (
httpClient *api.Client
- dataDir string
+ dataDir string = paths.DataDir
)
func main() {
@@ -47,7 +43,6 @@ func main() {
flag.StringVar(&controlPlaneURL, "url", "", "Control plane URL (required)")
flag.StringVar(&token, "token", "", "Registration token (required for first run)")
- flag.StringVar(&dataDir, "data-dir", paths.DataDir, "Data directory for agent state")
flag.BoolVar(&isProxy, "proxy", false, "Run as proxy node (handles TLS and public traffic)")
flag.StringVar(&logsEndpointFlag, "logs-endpoint", "", "Override logs endpoint URL (optional)")
flag.BoolVar(&disableDNS, "no-dns", false, "Disable local DNS server")
@@ -89,7 +84,6 @@ func main() {
}
keyDir := filepath.Join(dataDir, "keys")
- configPath := filepath.Join(dataDir, "config.json")
httpClient = api.NewClient(controlPlaneURL)
@@ -97,14 +91,16 @@ func main() {
var config *agent.Config
var err error
- if crypto.KeyPairExists(keyDir) {
+ setupComplete := crypto.KeyPairExists(keyDir)
+
+ if setupComplete {
log.Println("Loading existing signing key pair...")
signingKeyPair, err = crypto.LoadKeyPair(keyDir)
if err != nil {
log.Fatalf("Failed to load signing key pair: %v", err)
}
- config, err = loadConfig(configPath)
+ config, err = configuration.Load()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
@@ -154,8 +150,8 @@ func main() {
}
log.Println("Registering with control plane...")
- publicIP := getPublicIP()
- privateIP := getPrivateIP()
+ publicIP := network.PublicIP()
+ privateIP := network.PrivateIP()
resp, err := httpClient.Register(token, wgPublicKey, signingKeyPair.PublicKeyBase64(), publicIP, privateIP, isProxy)
if err != nil {
log.Fatalf("Failed to register: %v", err)
@@ -196,7 +192,7 @@ func main() {
logsEndpoint = respLoggingEndpoint
}
- if err = saveConfig(configPath, config); err != nil {
+ if err = configuration.Save(config); err != nil {
log.Fatalf("Failed to save config: %v", err)
}
@@ -255,6 +251,7 @@ func main() {
var traefikLogCollector *logs.TraefikCollector
var logsSender *logs.VictoriaLogsSender
var agentLogWriter *logs.AgentLogWriter
+
if logsEndpoint != "" {
log.Println("[logs] log collection enabled, endpoint:", logsEndpoint)
logsSender = logs.NewVictoriaLogsSender(logsEndpoint, config.ServerID)
@@ -293,8 +290,8 @@ func main() {
agentLogFlusherDone = agentLogWriter.StartFlusher(ctx)
}
- publicIP := getPublicIP()
- privateIP := getPrivateIP()
+ publicIP := network.PublicIP()
+ privateIP := network.PrivateIP()
log.Printf("Agent v%s started. Public IP: %s, Private IP: %s. Tick interval: %v", agent.Version, publicIP, privateIP, agent.TickInterval)
agentInstance := agent.NewAgent(client, reconciler, config, publicIP, privateIP, dataDir, logCollector, traefikLogCollector, builder, config.IsProxy, disableDNS)
@@ -314,69 +311,3 @@ func main() {
log.Println("Agent stopped")
}
-
-func loadConfig(path string) (*agent.Config, error) {
- data, err := os.ReadFile(path)
- if err != nil {
- return nil, err
- }
-
- var config agent.Config
- if err := json.Unmarshal(data, &config); err != nil {
- return nil, err
- }
-
- return &config, nil
-}
-
-func saveConfig(path string, config *agent.Config) error {
- data, err := json.MarshalIndent(config, "", " ")
- if err != nil {
- return err
- }
-
- return os.WriteFile(path, data, 0o600)
-}
-
-func getPublicIP() string {
- ip, err := sockaddr.GetPublicIP()
- if err == nil && ip != "" {
- return ip
- }
-
- client := &http.Client{Timeout: 5 * time.Second}
- resp, err := client.Get("https://api.ipify.org")
- if err != nil {
- log.Printf("Failed to get public IP from ipify: %v", err)
- return ""
- }
- defer resp.Body.Close()
-
- body, err := io.ReadAll(resp.Body)
- if err != nil {
- log.Printf("Failed to read ipify response: %v", err)
- return ""
- }
-
- return strings.TrimSpace(string(body))
-}
-
-func getPrivateIP() string {
- ips, err := sockaddr.GetPrivateIPs()
- if err != nil {
- log.Printf("Failed to get private IPs: %v", err)
- return ""
- }
-
- for ip := range strings.SplitSeq(ips, " ") {
- if ip == "" {
- continue
- }
- if strings.HasPrefix(ip, "10.100.") || strings.HasPrefix(ip, "10.200.") {
- continue
- }
- return ip
- }
-
- return ""
-}
diff --git a/agent/internal/configuration/configuration.go b/agent/internal/configuration/configuration.go
new file mode 100644
index 0000000..7ae6d16
--- /dev/null
+++ b/agent/internal/configuration/configuration.go
@@ -0,0 +1,36 @@
+// Package configuration handles loading and saving agent configuration files.
+package configuration
+
+import (
+ "encoding/json"
+ "os"
+ "path/filepath"
+
+ "techulus/cloud-agent/internal/agent"
+ "techulus/cloud-agent/internal/paths"
+)
+
+var configPath = filepath.Join(paths.DataDir, "config.json")
+
+func Load() (*agent.Config, error) {
+ data, err := os.ReadFile(configPath)
+ if err != nil {
+ return nil, err
+ }
+
+ var config agent.Config
+ if err := json.Unmarshal(data, &config); err != nil {
+ return nil, err
+ }
+
+ return &config, nil
+}
+
+func Save(config *agent.Config) error {
+ data, err := json.MarshalIndent(config, "", " ")
+ if err != nil {
+ return err
+ }
+
+ return os.WriteFile(configPath, data, 0o600)
+}
diff --git a/agent/internal/network/network.go b/agent/internal/network/network.go
new file mode 100644
index 0000000..3a7f7d1
--- /dev/null
+++ b/agent/internal/network/network.go
@@ -0,0 +1,55 @@
+// Package network provides utilities for discovering public and private IP addresses.
+package network
+
+import (
+ "io"
+ "log"
+ "net/http"
+ "strings"
+ "time"
+
+ "github.com/hashicorp/go-sockaddr"
+)
+
+func PublicIP() string {
+ ip, err := sockaddr.GetPublicIP()
+ if err == nil && ip != "" {
+ return ip
+ }
+
+ client := &http.Client{Timeout: 5 * time.Second}
+ resp, err := client.Get("https://api.ipify.org")
+ if err != nil {
+ log.Printf("Failed to get public IP from ipify: %v", err)
+ return ""
+ }
+ defer resp.Body.Close()
+
+ body, err := io.ReadAll(resp.Body)
+ if err != nil {
+ log.Printf("Failed to read ipify response: %v", err)
+ return ""
+ }
+
+ return strings.TrimSpace(string(body))
+}
+
+func PrivateIP() string {
+ ips, err := sockaddr.GetPrivateIPs()
+ if err != nil {
+ log.Printf("Failed to get private IPs: %v", err)
+ return ""
+ }
+
+ for ip := range strings.SplitSeq(ips, " ") {
+ if ip == "" {
+ continue
+ }
+ if strings.HasPrefix(ip, "10.100.") || strings.HasPrefix(ip, "10.200.") {
+ continue
+ }
+ return ip
+ }
+
+ return ""
+}
diff --git a/docs/AGENT.md b/docs/AGENT.md
index d81870b..90fa35d 100644
--- a/docs/AGENT.md
+++ b/docs/AGENT.md
@@ -66,7 +66,6 @@ Containers without `techulus.deployment.id` are considered orphans and will be c
|------|---------|-------------|
| `--url` | (required) | Control plane URL |
| `--token` | | Registration token (required for first run) |
-| `--data-dir` | `/var/lib/techulus-agent` | Data directory for agent state |
| `--logs-endpoint` | | VictoriaLogs endpoint for log shipping |
| `--proxy` | `false` | Run as proxy node (handles TLS/public traffic) |
diff --git a/web/public/setup.sh b/web/public/setup.sh
index f5dea33..ed91d52 100644
--- a/web/public/setup.sh
+++ b/web/public/setup.sh
@@ -579,7 +579,6 @@ step "Creating agent configuration..."
cat > /var/lib/techulus-agent/environment << EOF
AGENT_URL=${CONTROL_PLANE_URL}
-AGENT_DATA_DIR=/var/lib/techulus-agent
EOF
chmod 600 /var/lib/techulus-agent/environment
@@ -610,7 +609,7 @@ Wants=network-online.target
[Service]
Type=simple
EnvironmentFile=/var/lib/techulus-agent/environment
-ExecStart=/usr/local/bin/techulus-agent --url \${AGENT_URL} --data-dir \${AGENT_DATA_DIR} ${PROXY_ARG}
+ExecStart=/usr/local/bin/techulus-agent --url \${AGENT_URL} ${PROXY_ARG}
Restart=always
RestartSec=10
KillMode=process
@@ -636,7 +635,7 @@ if [ "$NEW_SETUP" = true ]; then
REGISTER_PROXY_ARG="--proxy"
fi
- /usr/local/bin/techulus-agent --url "$CONTROL_PLANE_URL" --token "$REGISTRATION_TOKEN" --data-dir /var/lib/techulus-agent $REGISTER_PROXY_ARG &
+ /usr/local/bin/techulus-agent --url "$CONTROL_PLANE_URL" --token "$REGISTRATION_TOKEN" $REGISTER_PROXY_ARG &
AGENT_PID=$!
REGISTERED=false
From c2565de3348c63756e63a5d2fe623ba60ffca115 Mon Sep 17 00:00:00 2001
From: Arjun Komath
Date: Mon, 23 Mar 2026 22:47:37 +1100
Subject: [PATCH 12/12] Address lint error
---
agent/internal/logs/state.go | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/agent/internal/logs/state.go b/agent/internal/logs/state.go
index 54764d2..2e5309b 100644
--- a/agent/internal/logs/state.go
+++ b/agent/internal/logs/state.go
@@ -1,7 +1,9 @@
+// Package logs provides log collection and state tracking for containers.
package logs
import (
"encoding/json"
+ "maps"
"os"
"path/filepath"
"sync"
@@ -73,9 +75,8 @@ func (s *State) Save(dataDir string) error {
sf := stateFile{
Positions: make(map[string]string, len(s.positions)),
}
- for k, v := range s.positions {
- sf.Positions[k] = v
- }
+
+ maps.Copy(sf.Positions, s.positions)
s.mu.RUnlock()
data, err := json.MarshalIndent(sf, "", " ")
@@ -84,5 +85,5 @@ func (s *State) Save(dataDir string) error {
}
path := filepath.Join(dataDir, stateFileName)
- return os.WriteFile(path, data, 0600)
+ return os.WriteFile(path, data, 0o600)
}