diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c218caf265..b31da6c011 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -207,7 +207,7 @@ jobs: # present or enabled on the runner. - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: - version: 11.25.0 + version: 11.28.7 run_install: false - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 @@ -316,7 +316,7 @@ jobs: - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: - version: 11.25.0 + version: 11.28.7 run_install: false - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 @@ -392,7 +392,7 @@ jobs: - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: - version: 11.25.0 + version: 11.28.7 run_install: false - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 @@ -455,7 +455,7 @@ jobs: - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: - version: 11.25.0 + version: 11.28.7 run_install: false - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 @@ -509,7 +509,7 @@ jobs: - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: - version: 11.25.0 + version: 11.28.7 run_install: false # setup-node and setup-go include runner OS and architecture in their cache @@ -574,7 +574,7 @@ jobs: # present or enabled on the runner. - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: - version: 11.25.0 + version: 11.28.7 run_install: false - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 @@ -1805,7 +1805,7 @@ jobs: - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: - version: 11.25.0 + version: 11.28.7 run_install: false - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 diff --git a/.github/workflows/release-sdk-typescript.yml b/.github/workflows/release-sdk-typescript.yml index f8c0e75e04..17239b0ca7 100644 --- a/.github/workflows/release-sdk-typescript.yml +++ b/.github/workflows/release-sdk-typescript.yml @@ -38,7 +38,7 @@ jobs: - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: - version: 11.25.0 + version: 11.28.7 run_install: false - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 diff --git a/apps/Dockerfile b/apps/Dockerfile index ac9474ab87..ef39148d29 100644 --- a/apps/Dockerfile +++ b/apps/Dockerfile @@ -12,7 +12,7 @@ # one commit, and a change spanning all three needs no intermediate SDK release. # # Shape (multi-stage): -# 1. build — node:26-slim (Debian + shell + toolchain): pnpm 12.4.2 via +# 1. build — node:26-slim (Debian + shell + toolchain): pnpm 12.15.0 via # corepack (the `packageManager` pin in package.json; Node 25+ # no longer bundles corepack, so it is installed first), a frozen # lockfile installs for SDK and Studio, `pnpm build` (contracts diff --git a/apps/README.md b/apps/README.md index 390c2390cb..625873cef1 100644 --- a/apps/README.md +++ b/apps/README.md @@ -13,13 +13,13 @@ product features, starting with chat. The published image is `ghcr.io/stacklok/mecatl/studio`. Mecatl Studio is a browser UI for a mecatl deployment, split in three packages that form -one self-contained pnpm workspace (pnpm 12.4.2, Node 26, see `package.json`): +one self-contained pnpm workspace (pnpm 12.15.0, Node 26, see `package.json`): -| Package | What it is | -| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `server/` (`@mecatl-studio/server`) | A Hono **backend for frontend (BFF)**. Holds the user's mecatl credential, talks to the daemon through the checked-out `@stacklok-oss/mecatl-sdk`, serves the SPA and `/api` from one origin. | -| `web/` (`@mecatl-studio/web`) | A Vite + React SPA. Calls only the BFF's `/api/v1`; imports neither the SDK nor daemon protocol types. | -| `contracts/` (`@mecatl-studio/contracts`) | Zod schemas, the generated `openapi.json`, and the generated Hey API / TanStack Query client. Generated files are committed and drift-gated. | +| Package | What it is | +| ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `server/` (`@mecatl-studio/server`) | A Hono **backend for frontend (BFF)**. Holds the user's mecatl credential, talks to the daemon through the checked-out `@stacklok-oss/mecatl-sdk`, serves the SPA and `/api` from one origin. | +| `web/` (`@mecatl-studio/web`) | A Vite + React SPA. Calls only the BFF's `/api/v1`; imports neither the SDK nor daemon protocol types. | +| `contracts/` (`@mecatl-studio/contracts`) | Zod schemas, the generated `openapi.json`, and the generated Hey API / TanStack Query client. Generated files are committed and drift-gated. | The architecture guide has a [Mecatl Studio](../docs/architecture/api-surface.md#mecatl-studio) section. @@ -27,7 +27,6 @@ section. ## Boundary Studio is a consumer of Mecatl's public surface, not part of the Go build: - - **Checked-out SDK.** `server/` uses the repository's `sdk/typescript` through a frozen `file:` dependency, so Studio, its SDK, and the daemon contract it targets are built from one commit, and a change spanning all three lands without an @@ -103,14 +102,14 @@ The BFF connects to a mecatl runtime in exactly one of three modes, chosen from environment at startup (a conflicting combination exits non-zero before listening, naming the offending variable): -| Mode | Selected by | What happens | -| ---------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -| `external` | `MECATL_BASE_URL` | Connects to an existing mecatl gRPC listener. The only mode allowed inside the image. Interactive login is discovered from the deployment's RFC 9728 resource document. | -| `spawn` | neither `MECATL_BASE_URL` nor `MECATL_DEV_MOCK` | Spawns a local `mecated` from `MECATED_BIN` or `PATH`. Development only; refused when `STUDIO_IMAGE=1`. | -| `mock` | `MECATL_DEV_MOCK=1` | Spawns `mecated --mock` (offline, no model). Development only; refused when `STUDIO_IMAGE=1` or with `MECATL_BASE_URL`. | +| Mode | Selected by | What happens | +| ---------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `external` | `MECATL_BASE_URL` | Connects to an existing mecatl gRPC listener. The only mode allowed inside the image. Interactive login is discovered from the deployment's RFC 9728 resource document. | +| `spawn` | neither `MECATL_BASE_URL` nor `MECATL_DEV_MOCK` | Spawns a local `mecated` from `MECATED_BIN` or `PATH`. Development only; refused when `STUDIO_IMAGE=1`. | +| `mock` | `MECATL_DEV_MOCK=1` | Spawns `mecated --mock` (offline, no model). Development only; refused when `STUDIO_IMAGE=1` or with `MECATL_BASE_URL`. | -Authentication follows from the mode and the target: **interactive** (Authorization Code -+ PKCE against the single issuer the resource document names), **static** +Authentication follows from the mode and the target: **interactive** (Authorization +Code + PKCE against the single issuer the resource document names), **static** (`MECATL_AUTH_TOKEN`, one service identity for every browser), or **none** (the target has no issuer, e.g. a local `mecated` with no auth). Static and none WARN at startup and are reported as `mode: "static"` / `"none"`; inside the image they additionally require @@ -128,12 +127,12 @@ only local development. All configuration is environment variables read once at Variables that matter only for development: -| Variable | Default | Meaning | -| ----------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------- | -| `MECATL_DEV_MOCK` | unset | `1` only. Spawns `mecated --mock`. Rejected together with `MECATL_BASE_URL` and inside the image. | -| `MECATED_BIN` | `PATH` lookup | Path of the `mecated` binary for spawn mode (`task studio:dev` sets it to `bin/mecated`). | -| `STUDIO_HOST` | `127.0.0.1` outside the image | Listen address. The development server binds loopback only unless you set this. | -| `STUDIO_WEB_DIST` | `../web/dist` relative to the server package | Directory holding the built SPA the BFF serves. The Dockerfile sets it for the image. | +| Variable | Default | Meaning | +| ----------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| `MECATL_DEV_MOCK` | unset | `1` only. Spawns `mecated --mock`. Rejected together with `MECATL_BASE_URL` and inside the image. | +| `MECATED_BIN` | `PATH` lookup | Path of the `mecated` binary for spawn mode (`task studio:dev` sets it to `bin/mecated`). | +| `STUDIO_HOST` | `127.0.0.1` outside the image | Listen address. The development server binds loopback only unless you set this. | +| `STUDIO_WEB_DIST` | `../web/dist` relative to the server package | Directory holding the built SPA the BFF serves. The Dockerfile sets it for the image. | Any startup error exits non-zero before listening, with a stderr line naming the variable. diff --git a/apps/Taskfile.yml b/apps/Taskfile.yml index 7e88c99044..4f0f3fe6a9 100644 --- a/apps/Taskfile.yml +++ b/apps/Taskfile.yml @@ -3,7 +3,7 @@ # Taskfile for Mecatl Studio (apps/), included in the root Taskfile as `studio:`. # The checked-out SDK is compiled before pnpm installs the BFF's local file # dependency; the browser never imports SDK sources. -version: '3' +version: "3" tasks: install: @@ -116,7 +116,7 @@ tasks: `task build` from the repository root first (for bin/mecated). deps: [install] env: - MECATED_BIN: '{{.TASKFILE_DIR}}/../bin/mecated' + MECATED_BIN: "{{.TASKFILE_DIR}}/../bin/mecated" cmds: - cmd: | test -x "$MECATED_BIN" || { diff --git a/apps/biome.json b/apps/biome.json index 83483bb073..17e363d5f5 100644 --- a/apps/biome.json +++ b/apps/biome.json @@ -1,10 +1,11 @@ { - "$schema": "https://biomejs.dev/schemas/2.5.14/schema.json", + "$schema": "https://biomejs.dev/schemas/2.6.2/schema.json", "files": { "includes": [ "**", "!**/dist", "!**/node_modules", + "!pnpm-lock.yaml", "!web/src/routeTree.gen.ts", "!contracts/openapi.json", "!contracts/src/generated" diff --git a/apps/contracts/package.json b/apps/contracts/package.json index a3f381ac3b..72a1a0eb4b 100644 --- a/apps/contracts/package.json +++ b/apps/contracts/package.json @@ -17,7 +17,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@tanstack/react-query": "5.104.4", + "@tanstack/react-query": "5.104.5", "zod": "4.6.7" }, "devDependencies": { diff --git a/apps/package.json b/apps/package.json index 9ac7846690..edffd7e5d5 100644 --- a/apps/package.json +++ b/apps/package.json @@ -7,7 +7,7 @@ "engines": { "node": ">=26 <27" }, - "packageManager": "pnpm@12.4.2", + "packageManager": "pnpm@12.15.0", "scripts": { "build": "pnpm generate && pnpm -r --if-present run build", "check": "biome check . && pnpm typecheck && pnpm test && pnpm generated:check", @@ -20,7 +20,7 @@ "typecheck": "pnpm -r --if-present run typecheck" }, "devDependencies": { - "@biomejs/biome": "2.5.15", + "@biomejs/biome": "2.6.2", "@playwright/test": "1.64.1", "@types/node": "26.6.5", "typescript": "6.0.3" diff --git a/apps/pnpm-lock.yaml b/apps/pnpm-lock.yaml index c00b8dabef..a6c927ee8f 100644 --- a/apps/pnpm-lock.yaml +++ b/apps/pnpm-lock.yaml @@ -7,153 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.4.2 - version: 12.4.2 + specifier: 12.15.0 + version: 12.15.0 packages: - '@pnpm/exe.android-arm64@12.4.2': - resolution: {integrity: sha512-E255MbcQ0V1577M2BV0ajWuP7KmTPYA0jqZnk3rK6Lq3kTvZWulMMb7iqRmnLsQbyWTkMEB2CfyM70loVDA8xg==} + '@pnpm/exe.android-arm64@12.15.0': + resolution: {integrity: sha512-eVCqmscY70LGvgRzu3mi8IBWBFGix+a6mNZoWmXxESsBdeiKEF9xQSuaeel10yn+zI7TXy2jlI63vFLzETk+aQ==} cpu: [arm64] os: [android] - '@pnpm/exe.android-x64@12.4.2': - resolution: {integrity: sha512-J1pSeCUwuKxMG70ZzpWn8JzElxiEa8NN/3N0SlZRtU2xbztChaJCKF3HaBNIj9yPfeofWzJo/lwNvDDjraQuZw==} + '@pnpm/exe.android-x64@12.15.0': + resolution: {integrity: sha512-Gx/WbkFcdUFUg8g8AShezcS9EiQxfYvdAm2hfKLO8sfJmJvKOCt5fzlgHWDzmGhoclibgW+tUGZ/KF4F4wOTCA==} cpu: [x64] os: [android] - '@pnpm/exe.darwin-arm64@12.4.2': - resolution: {integrity: sha512-A0WDo8iErfZBXgrLseQxw8i8Y9ctUpOEl/Uu+cubnTzpD8tT9ykIB548L8YTM2WD4OS+ZOHSxy8aGZcvKq8PaQ==} + '@pnpm/exe.darwin-arm64@12.15.0': + resolution: {integrity: sha512-N0ZykiDWCvqSBJvt71j7cSoBR993FqvYZFtmpCtqvW3pguiI+NAgraLPA5OTwu5mV+/d8hYpVcPktJA3xFDLtA==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.4.2': - resolution: {integrity: sha512-MSgJdovBWHcb5DEOvfPH9yNi/T5O1Xa4ess+E1ESGo/5yuty7S4JoiIjami+fsNXfnoQMlwsMUqYU4zAvBcNCw==} + '@pnpm/exe.darwin-x64@12.15.0': + resolution: {integrity: sha512-7Ntr2HlBUxzwWOg7NwDxCbRW/3vXuqKO+hcXm+w3SBi9rrHY53li1wLqWVT7Gjxd+lVEHM1QJZo6WJEGFU8C6A==} cpu: [x64] os: [darwin] - '@pnpm/exe.freebsd-x64@12.4.2': - resolution: {integrity: sha512-h2YumlQSNvgbRPv+RXwABohX65f9bOBZn+jMIt7bFDISZPCzQ+Nvpt6Awbp4ip5PwQgYxbu5iREJ1fHE39Fm8A==} + '@pnpm/exe.freebsd-x64@12.15.0': + resolution: {integrity: sha512-btOiyL7fL7W4uQGH0aqFai2TNC3IoKcZ7gNHBVbEFZt2dWrnrD0SufL3iGs3fLlmb4OtuU35uf4Zpr9V9Jh9mA==} cpu: [x64] os: [freebsd] - '@pnpm/exe.linux-arm64-musl@12.4.2': - resolution: {integrity: sha512-LwSEtSEDTv6S51YLs3YvSkPyun/QmfMic1UGICUkPWFu6ByP43RdMlkKvmVkfGhAYCpnxO057vrmyJqtfZrPCA==} + '@pnpm/exe.linux-arm64-musl@12.15.0': + resolution: {integrity: sha512-pNC38k+O+90FOjbPNSnw0E7apq1PKTmz3fFe1amn+lys/U5kL++uzir8bRiho8ONcyA3d9EU7wdqcY0DKkj+JA==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.4.2': - resolution: {integrity: sha512-2dSiDXyhx+RTHsewxex8f/jVjqQXWJ2oow4kCVHEWdZKeBpgMxvZ6fHkTAUBJXgqhbKIDHvuNlZBP7gJfUWL5A==} + '@pnpm/exe.linux-arm64@12.15.0': + resolution: {integrity: sha512-qML/8aCXslh8td/w4U+HJNqUcZ2+m6EfTbWScIzZRmyPsRFN+xB4LP1U/hymxc1iSJiKtG56HJx2fvUErWFIGw==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-ppc64@12.4.2': - resolution: {integrity: sha512-8Itc+jQk+MTz04LS9D1RcH+VctAWmzM4l1cJQ+Sx7pAJNo7EKHdRMbC0Tok1jyQ7eEHNJZD5EleYneZqWfZM+g==} + '@pnpm/exe.linux-ppc64@12.15.0': + resolution: {integrity: sha512-tjRDUUl7RCJ6T/6eoNPxOqkwU4Mzi5RtTXmSAxujyz37OTwwsMU7Ps087Zk4gHcUvRSeyF40ZFsew3vtE+nmUA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-riscv64@12.4.2': - resolution: {integrity: sha512-hleOeqhTVpH+z9RVMGnxvU4ZnrkBUClWjCbHD9u6kwyqhGSpevoU1wTGish+CBRhmIgMAy9pAfFpqhbAKOKNfw==} + '@pnpm/exe.linux-riscv64@12.15.0': + resolution: {integrity: sha512-bF1uBWEfbwaeryz6lIiaJ8AWD082otZfvzGX5l+6LZRpRwUEpJHUsJrORaYP5/cNMv5ZR2p6TvvcJcQzwtDzmw==} cpu: [riscv64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-s390x@12.4.2': - resolution: {integrity: sha512-LAsQRRdP9aToENR6dtcIJ9l+e1zMYOX0tQcLGpRyLPVBQcYRLlvAPcmDshsiIHQjp05SDa9FI0czX1ZQ1a7a/A==} + '@pnpm/exe.linux-s390x@12.15.0': + resolution: {integrity: sha512-zKMhIzsexYMToeLmqV5jPsvV/f9vwsJb2kUH2NFYzalbxImeBrlA4kL7GwF8gD4pagV6jYYcJb8RjbZIdjHptg==} cpu: [s390x] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.4.2': - resolution: {integrity: sha512-kzfzH2/0BWdTABK14Yj5a1xsdkTEQUp2eXEPNakaD9jKL025lq3hyaKHIz/gIZaPDMe/1bFFK/En4ztFlbBJxw==} + '@pnpm/exe.linux-x64-musl@12.15.0': + resolution: {integrity: sha512-A9J0Jg0Rdx+qQU4qXtwyST5tto9IOu1zi4fDk35nbc6DWahggbcKtFvZPKFwL2qgUXGXOX//hXv6z/sp6emO8A==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.4.2': - resolution: {integrity: sha512-/pbt0UVTa8NMDhzOWLQRfZ6G9ROKXlJPZtx845BqyWfc7hCrWXhTLBd70yO2y8+E+IWN3oHM1s/JsIQNGk1yvg==} + '@pnpm/exe.linux-x64@12.15.0': + resolution: {integrity: sha512-yc+QlZR+9+nr29J4fRzhMoapgxTBDndq/+peyoq1XUufnQFnfbXUMFudDIKzHi545linGqmOmXfn0NoufNgcOg==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.4.2': - resolution: {integrity: sha512-PsW19e4dAUNpZ0cS9flaxFuAmpt2dKlH/Vvi8TZ4qyJjjQzue/CEsWm+6wKVP4CJ7IT8RdL4qh+soOPWIgF2Zw==} + '@pnpm/exe.win32-arm64@12.15.0': + resolution: {integrity: sha512-fPXZxuY1VclkOga9bc53qNCXcegfeoBR8+Ue+AospDwKzuGGSHll0oDxkLfkmpjyRqpe7bH5DyQPYp/xSMaIVA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.4.2': - resolution: {integrity: sha512-+xGoeE0g55ztWvl8i5QqdmNfW3nIrTVcoQrNshEOwxthm9Ag48oXton3uxOA3/SANyz5AXexEjj2KO20NnOrEw==} + '@pnpm/exe.win32-x64@12.15.0': + resolution: {integrity: sha512-nrd+Tp1We1DGj4DGG5Bea9lZNh9y1PjlLBdEwdInS4D0h0UIDtM7JaGGGDJhNzIwcHASyihWI7HLV+dtG+fhYg==} cpu: [x64] os: [win32] - pnpm@12.4.2: - resolution: {integrity: sha512-CK3GYTGAJ1x8ntraOdzwjJxhrU5+rzMKTzRh8QKw+QdCNFTRF/mOctR/7wYWBwZE17/8lzpqV/UJCm18NosHyQ==} - engines: {node: '>=18.*'} + pnpm@12.15.0: + resolution: {integrity: sha512-s5UdbW/0qfE9x89WzSjSuOs328ycaOUuHhGRhz6p+CoBcoerULqtxczElPA2xnwOR+sTYIwvo29HcRth6hKOYQ==} + engines: {node: '>=18'} hasBin: true snapshots: - '@pnpm/exe.android-arm64@12.4.2': + '@pnpm/exe.android-arm64@12.15.0': optional: true - '@pnpm/exe.android-x64@12.4.2': + '@pnpm/exe.android-x64@12.15.0': optional: true - '@pnpm/exe.darwin-arm64@12.4.2': + '@pnpm/exe.darwin-arm64@12.15.0': optional: true - '@pnpm/exe.darwin-x64@12.4.2': + '@pnpm/exe.darwin-x64@12.15.0': optional: true - '@pnpm/exe.freebsd-x64@12.4.2': + '@pnpm/exe.freebsd-x64@12.15.0': optional: true - '@pnpm/exe.linux-arm64-musl@12.4.2': + '@pnpm/exe.linux-arm64-musl@12.15.0': optional: true - '@pnpm/exe.linux-arm64@12.4.2': + '@pnpm/exe.linux-arm64@12.15.0': optional: true - '@pnpm/exe.linux-ppc64@12.4.2': + '@pnpm/exe.linux-ppc64@12.15.0': optional: true - '@pnpm/exe.linux-riscv64@12.4.2': + '@pnpm/exe.linux-riscv64@12.15.0': optional: true - '@pnpm/exe.linux-s390x@12.4.2': + '@pnpm/exe.linux-s390x@12.15.0': optional: true - '@pnpm/exe.linux-x64-musl@12.4.2': + '@pnpm/exe.linux-x64-musl@12.15.0': optional: true - '@pnpm/exe.linux-x64@12.4.2': + '@pnpm/exe.linux-x64@12.15.0': optional: true - '@pnpm/exe.win32-arm64@12.4.2': + '@pnpm/exe.win32-arm64@12.15.0': optional: true - '@pnpm/exe.win32-x64@12.4.2': + '@pnpm/exe.win32-x64@12.15.0': optional: true - pnpm@12.4.2: + pnpm@12.15.0: optionalDependencies: - '@pnpm/exe.android-arm64': 12.4.2 - '@pnpm/exe.android-x64': 12.4.2 - '@pnpm/exe.darwin-arm64': 12.4.2 - '@pnpm/exe.darwin-x64': 12.4.2 - '@pnpm/exe.freebsd-x64': 12.4.2 - '@pnpm/exe.linux-arm64': 12.4.2 - '@pnpm/exe.linux-arm64-musl': 12.4.2 - '@pnpm/exe.linux-ppc64': 12.4.2 - '@pnpm/exe.linux-riscv64': 12.4.2 - '@pnpm/exe.linux-s390x': 12.4.2 - '@pnpm/exe.linux-x64': 12.4.2 - '@pnpm/exe.linux-x64-musl': 12.4.2 - '@pnpm/exe.win32-arm64': 12.4.2 - '@pnpm/exe.win32-x64': 12.4.2 + '@pnpm/exe.android-arm64': 12.15.0 + '@pnpm/exe.android-x64': 12.15.0 + '@pnpm/exe.darwin-arm64': 12.15.0 + '@pnpm/exe.darwin-x64': 12.15.0 + '@pnpm/exe.freebsd-x64': 12.15.0 + '@pnpm/exe.linux-arm64': 12.15.0 + '@pnpm/exe.linux-arm64-musl': 12.15.0 + '@pnpm/exe.linux-ppc64': 12.15.0 + '@pnpm/exe.linux-riscv64': 12.15.0 + '@pnpm/exe.linux-s390x': 12.15.0 + '@pnpm/exe.linux-x64': 12.15.0 + '@pnpm/exe.linux-x64-musl': 12.15.0 + '@pnpm/exe.win32-arm64': 12.15.0 + '@pnpm/exe.win32-x64': 12.15.0 --- lockfileVersion: '9.0' @@ -167,8 +167,8 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 2.5.15 - version: 2.5.15 + specifier: 2.6.2 + version: 2.6.2 '@playwright/test': specifier: 1.64.1 version: 1.64.1 @@ -182,8 +182,8 @@ importers: contracts: dependencies: '@tanstack/react-query': - specifier: 5.104.4 - version: 5.104.4(@types/react@19.3.0)(react@19.3.1) + specifier: 5.104.5 + version: 5.104.5(@types/react@19.3.0)(react@19.3.1) zod: specifier: 4.6.7 version: 4.6.7 @@ -233,7 +233,7 @@ importers: version: 6.0.3 vitest: specifier: 5.0.5 - version: 5.0.5(@types/node@26.6.5)(happy-dom@20.14.5)(jsdom@30.1.1)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + version: 5.0.5(@types/node@26.6.5)(happy-dom@21.0.4)(jsdom@30.1.1)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) web: dependencies: @@ -304,8 +304,8 @@ importers: specifier: 1.4.1 version: 1.4.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@tanstack/react-query': - specifier: 5.104.4 - version: 5.104.4(@types/react@19.3.0)(react@19.3.1) + specifier: 5.104.5 + version: 5.104.5(@types/react@19.3.0)(react@19.3.1) '@tanstack/react-router': specifier: 1.170.45 version: 1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1) @@ -319,11 +319,11 @@ importers: specifier: 1.1.1 version: 1.1.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) cronstrue: - specifier: 3.33.0 - version: 3.33.0 + specifier: 3.38.0 + version: 3.38.0 lucide-react: - specifier: 1.59.0 - version: 1.59.0(@types/react@19.3.0)(react@19.3.1) + specifier: 1.61.0 + version: 1.61.0(@types/react@19.3.0)(react@19.3.1) react: specifier: 19.3.1 version: 19.3.1 @@ -348,13 +348,13 @@ importers: devDependencies: '@tailwindcss/vite': specifier: 4.3.3 - version: 4.3.3(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + version: 4.3.3(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@tanstack/router-cli': specifier: 1.167.45 version: 1.167.45 '@tanstack/router-plugin': specifier: 1.168.47 - version: 1.168.47(@tanstack/react-router@1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(esbuild@0.28.2)(rolldown@1.2.9)(rollup@4.63.4)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + version: 1.168.47(@tanstack/react-router@1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(esbuild@0.28.2)(rolldown@1.2.14)(rollup@4.63.4)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@testing-library/react': specifier: 16.3.3 version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) @@ -369,7 +369,7 @@ importers: version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: 6.1.2 - version: 6.1.2(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + version: 6.1.2(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) happy-dom: specifier: 21.0.4 version: 21.0.4 @@ -380,11 +380,11 @@ importers: specifier: 6.0.3 version: 6.0.3 vite: - specifier: 8.3.4 - version: 8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + specifier: 8.3.5 + version: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) vitest: specifier: 5.0.5 - version: 5.0.5(@types/node@26.6.5)(happy-dom@21.0.4)(jsdom@30.1.1)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + version: 5.0.5(@types/node@26.6.5)(happy-dom@21.0.4)(jsdom@30.1.1)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) packages: @@ -472,59 +472,71 @@ packages: resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} - '@biomejs/biome@2.5.15': - resolution: {integrity: sha512-WZTW4slm/pdkh92K6t/3aEN++44JD1PQ7squ7RCMLI1flHGl43DVOIGXvCjHiZgBMO1V4uYxoFNtqrIA4qGuIQ==} + '@biomejs/biome@2.6.2': + resolution: {integrity: sha512-JLTFAFF9vfJcWwLhwuL4ZHflLg+XfTEC4IUnAlJRX1cMRt57++Xd1Ysb9Fdmlh9YUrvyCXfPEHjjEIqKJGdPKw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.5.15': - resolution: {integrity: sha512-BZVzFhJ/mUvTLMYbc9x6el0o2Uv5zP7bACYyhFb6fSc1giroXm7PL0a5KqMJ9F+/BnkYRjagD/ROSDVOZ6eapg==} + '@biomejs/cli-android-arm64@2.6.2': + resolution: {integrity: sha512-dMpdpH7zFEL5FxuIA9LJW+RoNyC3oeDB7PJyjqVVwtMNoKB5uo8OZYmrVSBikn71txzYwy/3xga7UME6bJQZ6A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [android] + + '@biomejs/cli-android-x64@2.6.2': + resolution: {integrity: sha512-XCwEhPBGYzuRA502dRkCcQ+5cefQwuxQR7f9wa4do92dvIcuBL6VMLMFB/fL9hlpZ4dGSfHdpGFSIDlp52mg0A==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [android] + + '@biomejs/cli-darwin-arm64@2.6.2': + resolution: {integrity: sha512-rpXtabRgyZNz3aCjd/cRoSZGYi92R9eAXdUUe1sigIsRDyfMwgThaa98Yxt1fiZ7mxquqkAyIHIo08N/e1ToBA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.5.15': - resolution: {integrity: sha512-V5Kw63V+fVGNFhFrizDxMbGXAzZCh8kYzJpy3GI6gTapWDg7bZK9oYC9CbVgQSEdTnupz0U5Efz8Ev+5vdBBXw==} + '@biomejs/cli-darwin-x64@2.6.2': + resolution: {integrity: sha512-7GGzlm1GxUKoQ9CNV8tQZ+XXad4sz+v+uzNsWlhaGjsnZqUOVBw1OmAMpG3uNV/Mr0UrCpRJvSK0qvfuqSQOjg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.5.15': - resolution: {integrity: sha512-tGzZUTcJCV7tj5Adh/Gn6nR4MycqA3iohq2LEcrarAgRBkU0h0OKd2UzCRkOsOYOuUGaUJb4YmqRqyy2feGGSw==} + '@biomejs/cli-linux-arm64-musl@2.6.2': + resolution: {integrity: sha512-I+FYCLVSmR3cYfKcQ+KNeLOZ5w0wRd9fQFlw3JbSvy7bkegvTqdHaBRRcJzHQB/1ldldTLIcG21ka6X2cTWmJw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.5.15': - resolution: {integrity: sha512-XaG7P7eeSLYETD3K9grfB0mQmpLQZjygdbsxekWBJAg4am79fGAtRpfRyNnTvXB2fZFNnJZG3nXm7HBat0+VUw==} + '@biomejs/cli-linux-arm64@2.6.2': + resolution: {integrity: sha512-Qs4CofCE8MdkjZFfEjswh2NAcbyQ7IVYtGSzQBvLqFlla/CSXroGbktUFndWG/kVSTywadauzAspYWtSfqAc2g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.5.15': - resolution: {integrity: sha512-IlxUcyxilVGPsE008x13pWdkTbU3nQpP2i9b5UrbOYj6goBkKsRX1XB7yJLcV+O1H9LBchIIm4adOaVLZBX0ZQ==} + '@biomejs/cli-linux-x64-musl@2.6.2': + resolution: {integrity: sha512-wnjEXAK2pDd2j8r9gKI3L+44sIxjkYzS5aHmD1+K57RNJ3sFyT4n22NH6QFPqqeVdRBxN54H3kckUUCrFKCcJw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.5.15': - resolution: {integrity: sha512-xE4iEW/3LqlYj9GFgGrFsFSH51dEEpUbYWBfeOv0q87WkUDxK2o/HhreSb7qMJqck70RVM6Lg96hgedcAYcOkA==} + '@biomejs/cli-linux-x64@2.6.2': + resolution: {integrity: sha512-FJKsb95418139xDdbv9XnNJsIIwvsgR21Of0aE9B9U+nQlOtRq5gJl2ps0jZUmYBxTaOlP9BKo8N+Ff8+Rui1g==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.5.15': - resolution: {integrity: sha512-2kPKzhNlm8C+Ru3GcO0Me2ODkCBLrVOUNuyi84RJyWDVKAA4+Kjj3jMjL938lF6BRfvltC4vB2nPY9SvN51Ovg==} + '@biomejs/cli-win32-arm64@2.6.2': + resolution: {integrity: sha512-/PEOo6evlgrQOfKhMNtC/4Gk8ai3hySXXEtjUzCqZe/4iAbMdqelpp7qvZEDyLxlZS+BjOMQFpq2gXI/BPaAqw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.5.15': - resolution: {integrity: sha512-yAzh4UqEImV6Hcy0zjUqNfJAsUhoD64FBQCdTG8Md/Z2wQeVP/ZmJ3XRYAs1g8J9fjTFyl2fCtc5FB5til47+g==} + '@biomejs/cli-win32-x64@2.6.2': + resolution: {integrity: sha512-FVlWD+mDDz8nN5LWKRWUhhb7wKIK0VE3oXQvQBX7Fwwj00CvqMVhMyiz1iz8O5aZGmnkhFlKSwJPrUvMh5prQw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -844,9 +856,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-project/types@0.150.0': - resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} - '@oxc-project/types@0.154.0': resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} @@ -1386,72 +1395,36 @@ packages: cpu: [arm] os: [android] - '@rolldown/binding-android-arm-eabi@1.2.9': - resolution: {integrity: sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [android] - '@rolldown/binding-android-arm64@1.2.14': resolution: {integrity: sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.2.9': - resolution: {integrity: sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - '@rolldown/binding-darwin-arm64@1.2.14': resolution: {integrity: sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.2.9': - resolution: {integrity: sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - '@rolldown/binding-darwin-x64@1.2.14': resolution: {integrity: sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.9': - resolution: {integrity: sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.14': resolution: {integrity: sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.2.9': - resolution: {integrity: sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.14': resolution: {integrity: sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.2.9': - resolution: {integrity: sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.14': resolution: {integrity: sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1459,13 +1432,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.2.9': - resolution: {integrity: sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.14': resolution: {integrity: sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1473,13 +1439,6 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.2.9': - resolution: {integrity: sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.14': resolution: {integrity: sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1487,13 +1446,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-ppc64-gnu@1.2.9': - resolution: {integrity: sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.14': resolution: {integrity: sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1501,13 +1453,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.9': - resolution: {integrity: sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.14': resolution: {integrity: sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1515,13 +1460,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.9': - resolution: {integrity: sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.14': resolution: {integrity: sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1529,49 +1467,24 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-musl@1.2.9': - resolution: {integrity: sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.14': resolution: {integrity: sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.2.9': - resolution: {integrity: sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.14': resolution: {integrity: sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.2.9': - resolution: {integrity: sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.14': resolution: {integrity: sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.9': - resolution: {integrity: sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} @@ -1846,11 +1759,11 @@ packages: resolution: {integrity: sha512-w1+YvwmTkwt5n8yUqEH3IWZ9DsmorCZW/EQ3KYHnqEgIkOZpH54NvW6/Epq3Dzb8H0ifIeYX8PExvrNLIH5FIA==} engines: {node: '>=20.19'} - '@tanstack/query-core@5.104.4': - resolution: {integrity: sha512-nU4Yrb8Sjn0DeVb7PKG9uiepNavys3yoxy1FX0hViY4/P6Ng/mBje2SMl7i9812rtyHKtHyqiaC/td6GkI8StA==} + '@tanstack/query-core@5.104.5': + resolution: {integrity: sha512-Q94gI8Opd+CbdVNOdj8ZCyV8WqLYitrDq1t96Xc8WZT6lY0r5iRnJLXYDxMex7EEf2v+mXvn4FcjaBKSxXZQ9A==} - '@tanstack/react-query@5.104.4': - resolution: {integrity: sha512-YD5QkvUNy8Ey3LbOy2vwL97JjoYycwDv++cWAibTe+9BLYvl3c09XpYp5dZ2VcxcguwoDhGF+utYJYb79RB36w==} + '@tanstack/react-query@5.104.5': + resolution: {integrity: sha512-RORgFe052U+93weaNuqg7qHq7vNVNzXN/VrXqD4bbAuQCWUqOl2lV5Ui9flWk5CVvMyL/Bh27QWhzwH0aaOx9g==} peerDependencies: '@types/react': ^18 || ^19 react: ^18 || ^19 @@ -2164,8 +2077,8 @@ packages: cookie-es@3.1.1: resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} - cronstrue@3.33.0: - resolution: {integrity: sha512-vyatYcfUXxPZxv8/zwC+j9LZNfSdn1k5t3sCLFZrLw+HvU6H4pNhUulPKgtji9tLTTAUCJs45z2+rJrPsbPxlw==} + cronstrue@3.38.0: + resolution: {integrity: sha512-i10xR7fS4AH9LKwmt3gYdt/5lSsB2qFGSNfC8aeyYybxo48DCMz+nUrSVI4kUj8yo+SgTbMJqp/BWEem9avlcA==} hasBin: true cross-spawn@7.0.6: @@ -2326,10 +2239,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - happy-dom@20.14.5: - resolution: {integrity: sha512-x/RzkpWO40bTjIoT30iQtt64FLLmH/iRcUCN2X//bLx7H3ifkdfPXyqsro/OYtqzIAhiLMMA7mmiOR9C3NOKjQ==} - engines: {node: '>=20.0.0'} - happy-dom@21.0.4: resolution: {integrity: sha512-tFm+GaLBgo6o0awHnvHaNoraVo27qJ+2tZEtZ+cIa08hXbeitrxAJajLI05hsUy/2/YTKcUjQYzHe5mCcraLBw==} engines: {node: '>=20.0.0'} @@ -2598,8 +2507,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@1.59.0: - resolution: {integrity: sha512-5qgMyyCPU6OvnKpLS2t693+ZtiqA8oaSweWoUows0BLFKFf6V75m4+CptpmohZHpD5IuOVIBXHBBiv2vpLJmtw==} + lucide-react@1.61.0: + resolution: {integrity: sha512-v2SQPPPNjnr+BlhL9Spuzmo5yR+hLkftfuE4E3jaxdNPgSH0hJKPcLJBP7yAta87jQNPsSERS59PJjCJ/CorBA==} peerDependencies: '@types/react': '*' react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -2938,11 +2847,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.2.9: - resolution: {integrity: sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - rollup@4.63.4: resolution: {integrity: sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3065,11 +2969,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.23.13: - resolution: {integrity: sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==} - engines: {node: '>=18.0.0'} - hasBin: true - tsx@4.23.15: resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} engines: {node: '>=18.0.0'} @@ -3181,13 +3080,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@8.3.4: - resolution: {integrity: sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==} + vite@8.3.5: + resolution: {integrity: sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.7.1 + '@vitejs/devtools': ^0.7.1 || ^0.8.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -3465,39 +3364,47 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@biomejs/biome@2.5.15': + '@biomejs/biome@2.6.2': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.5.15 - '@biomejs/cli-darwin-x64': 2.5.15 - '@biomejs/cli-linux-arm64': 2.5.15 - '@biomejs/cli-linux-arm64-musl': 2.5.15 - '@biomejs/cli-linux-x64': 2.5.15 - '@biomejs/cli-linux-x64-musl': 2.5.15 - '@biomejs/cli-win32-arm64': 2.5.15 - '@biomejs/cli-win32-x64': 2.5.15 + '@biomejs/cli-android-arm64': 2.6.2 + '@biomejs/cli-android-x64': 2.6.2 + '@biomejs/cli-darwin-arm64': 2.6.2 + '@biomejs/cli-darwin-x64': 2.6.2 + '@biomejs/cli-linux-arm64': 2.6.2 + '@biomejs/cli-linux-arm64-musl': 2.6.2 + '@biomejs/cli-linux-x64': 2.6.2 + '@biomejs/cli-linux-x64-musl': 2.6.2 + '@biomejs/cli-win32-arm64': 2.6.2 + '@biomejs/cli-win32-x64': 2.6.2 - '@biomejs/cli-darwin-arm64@2.5.15': + '@biomejs/cli-android-arm64@2.6.2': optional: true - '@biomejs/cli-darwin-x64@2.5.15': + '@biomejs/cli-android-x64@2.6.2': optional: true - '@biomejs/cli-linux-arm64-musl@2.5.15': + '@biomejs/cli-darwin-arm64@2.6.2': optional: true - '@biomejs/cli-linux-arm64@2.5.15': + '@biomejs/cli-darwin-x64@2.6.2': optional: true - '@biomejs/cli-linux-x64-musl@2.5.15': + '@biomejs/cli-linux-arm64-musl@2.6.2': optional: true - '@biomejs/cli-linux-x64@2.5.15': + '@biomejs/cli-linux-arm64@2.6.2': optional: true - '@biomejs/cli-win32-arm64@2.5.15': + '@biomejs/cli-linux-x64-musl@2.6.2': optional: true - '@biomejs/cli-win32-x64@2.5.15': + '@biomejs/cli-linux-x64@2.6.2': + optional: true + + '@biomejs/cli-win32-arm64@2.6.2': + optional: true + + '@biomejs/cli-win32-x64@2.6.2': optional: true '@bramus/specificity@2.4.2': @@ -3741,9 +3648,6 @@ snapshots: '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true - '@oxc-project/types@0.150.0': - optional: true - '@oxc-project/types@0.154.0': {} '@playwright/test@1.64.1': @@ -4305,93 +4209,48 @@ snapshots: '@rolldown/binding-android-arm-eabi@1.2.14': optional: true - '@rolldown/binding-android-arm-eabi@1.2.9': - optional: true - '@rolldown/binding-android-arm64@1.2.14': optional: true - '@rolldown/binding-android-arm64@1.2.9': - optional: true - '@rolldown/binding-darwin-arm64@1.2.14': optional: true - '@rolldown/binding-darwin-arm64@1.2.9': - optional: true - '@rolldown/binding-darwin-x64@1.2.14': optional: true - '@rolldown/binding-darwin-x64@1.2.9': - optional: true - '@rolldown/binding-freebsd-x64@1.2.14': optional: true - '@rolldown/binding-freebsd-x64@1.2.9': - optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.14': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.9': - optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.14': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.9': - optional: true - '@rolldown/binding-linux-arm64-musl@1.2.14': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.9': - optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.14': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.9': - optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.14': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.9': - optional: true - '@rolldown/binding-linux-x64-gnu@1.2.14': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.9': - optional: true - '@rolldown/binding-linux-x64-musl@1.2.14': optional: true - '@rolldown/binding-linux-x64-musl@1.2.9': - optional: true - '@rolldown/binding-openharmony-arm64@1.2.14': optional: true - '@rolldown/binding-openharmony-arm64@1.2.9': - optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.14': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.9': - optional: true - '@rolldown/binding-win32-x64-msvc@1.2.14': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.9': - optional: true - '@rolldown/pluginutils@1.0.1': {} '@rollup/rollup-android-arm-eabi@4.63.4': @@ -4578,20 +4437,20 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - '@tailwindcss/vite@4.3.3(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tailwindcss/vite@4.3.3(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: 8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) '@tanstack/history@1.162.5': {} - '@tanstack/query-core@5.104.4': {} + '@tanstack/query-core@5.104.5': {} - '@tanstack/react-query@5.104.4(@types/react@19.3.0)(react@19.3.1)': + '@tanstack/react-query@5.104.5(@types/react@19.3.0)(react@19.3.1)': dependencies: - '@tanstack/query-core': 5.104.4 + '@tanstack/query-core': 5.104.5 react: 19.3.1 optionalDependencies: '@types/react': 19.3.0 @@ -4640,7 +4499,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.47(@tanstack/react-router@1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(esbuild@0.28.2)(rolldown@1.2.9)(rollup@4.63.4)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tanstack/router-plugin@1.168.47(@tanstack/react-router@1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(esbuild@0.28.2)(rolldown@1.2.14)(rollup@4.63.4)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7 '@babel/template': 7.29.7 @@ -4649,11 +4508,11 @@ snapshots: '@tanstack/router-generator': 1.167.45 '@tanstack/router-utils': 1.162.4 chokidar: 5.0.0 - unplugin: 3.4.0(esbuild@0.28.2)(rolldown@1.2.9)(rollup@4.63.4)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + unplugin: 3.4.0(esbuild@0.28.2)(rolldown@1.2.14)(rollup@4.63.4)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) zod: 4.6.7 optionalDependencies: '@tanstack/react-router': 1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - vite: 8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -4765,28 +4624,19 @@ snapshots: '@ungap/structured-clone@1.4.0': {} - '@vitejs/plugin-react@6.1.2(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@vitejs/plugin-react@6.1.2(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) - - '@vitest/mocker@5.0.5(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.5 - estree-walker: 3.0.3 - magic-string: 1.4.3 - optionalDependencies: - vite: 8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) - '@vitest/mocker@5.0.5(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': + '@vitest/mocker@5.0.5(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.5 estree-walker: 3.0.3 magic-string: 1.4.3 optionalDependencies: - vite: 8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + vite: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) '@vitest/spy@5.0.5': {} @@ -4918,7 +4768,7 @@ snapshots: cookie-es@3.1.1: {} - cronstrue@3.33.0: {} + cronstrue@3.38.0: {} cross-spawn@7.0.6: dependencies: @@ -5064,20 +4914,6 @@ snapshots: graceful-fs@4.2.11: {} - happy-dom@20.14.5: - dependencies: - '@types/node': 26.6.5 - '@types/whatwg-mimetype': 3.0.2 - '@types/ws': 8.18.1 - buffer-image-size: 0.6.4 - entities: 7.0.1 - whatwg-mimetype: 3.0.0 - ws: 8.21.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - optional: true - happy-dom@21.0.4: dependencies: '@types/node': 26.6.5 @@ -5325,7 +5161,7 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@1.59.0(@types/react@19.3.0)(react@19.3.1): + lucide-react@1.61.0(@types/react@19.3.0)(react@19.3.1): dependencies: react: 19.3.1 optionalDependencies: @@ -5916,28 +5752,6 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.14 '@rolldown/binding-win32-x64-msvc': 1.2.14 - rolldown@1.2.9: - dependencies: - '@oxc-project/types': 0.150.0 - '@rolldown/pluginutils': 1.0.1 - optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.9 - '@rolldown/binding-android-arm64': 1.2.9 - '@rolldown/binding-darwin-arm64': 1.2.9 - '@rolldown/binding-darwin-x64': 1.2.9 - '@rolldown/binding-freebsd-x64': 1.2.9 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.9 - '@rolldown/binding-linux-arm64-gnu': 1.2.9 - '@rolldown/binding-linux-arm64-musl': 1.2.9 - '@rolldown/binding-linux-ppc64-gnu': 1.2.9 - '@rolldown/binding-linux-s390x-gnu': 1.2.9 - '@rolldown/binding-linux-x64-gnu': 1.2.9 - '@rolldown/binding-linux-x64-musl': 1.2.9 - '@rolldown/binding-openharmony-arm64': 1.2.9 - '@rolldown/binding-win32-arm64-msvc': 1.2.9 - '@rolldown/binding-win32-x64-msvc': 1.2.9 - optional: true - rollup@4.63.4: dependencies: '@types/estree': 1.0.9 @@ -6072,13 +5886,6 @@ snapshots: tslib@2.8.1: {} - tsx@4.23.13: - dependencies: - esbuild: 0.28.2 - optionalDependencies: - fsevents: 2.3.3 - optional: true - tsx@4.23.15: dependencies: esbuild: 0.28.2 @@ -6127,16 +5934,16 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - unplugin@3.4.0(esbuild@0.28.2)(rolldown@1.2.9)(rollup@4.63.4)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)): + unplugin@3.4.0(esbuild@0.28.2)(rolldown@1.2.14)(rollup@4.63.4)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 optionalDependencies: esbuild: 0.28.2 - rolldown: 1.2.9 + rolldown: 1.2.14 rollup: 4.63.4 - vite: 8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) update-browserslist-db@1.3.3(browserslist@4.29.0): dependencies: @@ -6173,22 +5980,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1): - dependencies: - lightningcss: 1.33.0 - picomatch: 4.0.7 - postcss: 8.5.31 - rolldown: 1.2.14 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 26.6.5 - esbuild: 0.28.2 - fsevents: 2.3.3 - jiti: 2.7.0 - tsx: 4.23.13 - yaml: 2.9.1 - - vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1): + vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -6203,33 +5995,10 @@ snapshots: tsx: 4.23.15 yaml: 2.9.1 - vitest@5.0.5(@types/node@26.6.5)(happy-dom@20.14.5)(jsdom@30.1.1)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): - dependencies: - '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.5(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) - chai: 6.3.0 - es-module-lexer: 2.3.2 - expect-type: 1.4.0 - magic-string: 1.4.3 - obug: 3.0.0 - picomatch: 4.0.7 - std-env: 4.3.0 - tinybench: 6.2.2 - tinyexec: 1.3.1 - tinyglobby: 0.2.17 - vite: 8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) - why-is-node-running: 3.2.1 - optionalDependencies: - '@types/node': 26.6.5 - happy-dom: 20.14.5 - jsdom: 30.1.1 - transitivePeerDependencies: - - msw - - vitest@5.0.5(@types/node@26.6.5)(happy-dom@21.0.4)(jsdom@30.1.1)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)): + vitest@5.0.5(@types/node@26.6.5)(happy-dom@21.0.4)(jsdom@30.1.1)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.5(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + '@vitest/mocker': 5.0.5(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -6240,7 +6009,7 @@ snapshots: tinybench: 6.2.2 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 26.6.5 diff --git a/apps/web/package.json b/apps/web/package.json index 700d9b80a6..6e48c687df 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -34,13 +34,13 @@ "@radix-ui/react-toggle": "1.2.1", "@radix-ui/react-toggle-group": "1.2.1", "@radix-ui/react-tooltip": "1.4.1", - "@tanstack/react-query": "5.104.4", + "@tanstack/react-query": "5.104.5", "@tanstack/react-router": "1.170.45", "class-variance-authority": "0.7.1", "clsx": "2.1.1", "cmdk": "1.1.1", - "cronstrue": "3.33.0", - "lucide-react": "1.59.0", + "cronstrue": "3.38.0", + "lucide-react": "1.61.0", "react": "19.3.1", "react-dom": "19.3.1", "react-markdown": "10.1.0", @@ -61,7 +61,7 @@ "happy-dom": "21.0.4", "tailwindcss": "4.3.3", "typescript": "6.0.3", - "vite": "8.3.4", + "vite": "8.3.5", "vitest": "5.0.5" } } diff --git a/apps/web/src/components/error-page/error-routes.test.tsx b/apps/web/src/components/error-page/error-routes.test.tsx index 0bcf839aea..cd992bf40b 100644 --- a/apps/web/src/components/error-page/error-routes.test.tsx +++ b/apps/web/src/components/error-page/error-routes.test.tsx @@ -28,6 +28,10 @@ const chatApi = { broken: false }; let container: HTMLDivElement; let reactRoot: Root; +function CrashedRoot(): React.ReactNode { + throw new Error(privateError); +} + async function mount(element: React.ReactNode) { container = document.createElement("div"); document.body.append(container); @@ -260,9 +264,6 @@ describe("Studio error routes", () => { it("keeps a root render failure generic and offers reload and home", async () => { vi.spyOn(console, "error").mockImplementation(() => undefined); const reload = vi.fn(); - function CrashedRoot(): React.ReactNode { - throw new Error(privateError); - } await mount( diff --git a/apps/web/src/components/palette-swatch.tsx b/apps/web/src/components/palette-swatch.tsx index 7eb934fbbc..da693da08d 100644 --- a/apps/web/src/components/palette-swatch.tsx +++ b/apps/web/src/components/palette-swatch.tsx @@ -8,6 +8,7 @@ const swatches = new Map>(); export function paletteSwatch(color: string): ComponentType<{ className?: string }> { const cached = swatches.get(color); if (cached) return cached; + // biome-ignore lint/correctness/noComponentHookFactories: the module-level cache returns one stable component per color, so callers never see a new component identity; option icons must be component types. function PaletteSwatch({ className }: { className?: string }) { return ( void }) { + const [open, setOpen] = React.useState(true); + return ( + { + onToggle(); + setOpen((current) => !current); + }} + open={open} + > + Outer + + + Inner + Nested body + + + + ); +} + describe("Collapsible", () => { it("shows and hides its content from a trigger that controls it", async () => { const user = userEvent.setup(); @@ -109,30 +132,14 @@ describe("Collapsible", () => { }); it("leaves an open outer collapsible alone when a match opens a nested one", () => { - // A toggle-style owner, like the tool-call list: it flips on any change - // request and ignores the value, so a stray request would close it. let outerToggles = 0; - function Outer() { - const [open, setOpen] = React.useState(true); - return ( - { - outerToggles += 1; - setOpen((current) => !current); - }} - open={open} - > - Outer - - - Inner - Nested body - - - - ); - } - render(); + render( + { + outerToggles += 1; + }} + />, + ); const outer = screen.getByRole("button", { name: "Outer" }); const inner = screen.getByRole("button", { name: "Inner" }); const nested = screen.getByText("Nested body"); diff --git a/apps/web/src/components/ui/error-boundary.test.tsx b/apps/web/src/components/ui/error-boundary.test.tsx index 0b7ac79d41..54c3acd8c6 100644 --- a/apps/web/src/components/ui/error-boundary.test.tsx +++ b/apps/web/src/components/ui/error-boundary.test.tsx @@ -23,6 +23,10 @@ function Flaky() { return

Recovered panel

; } +function Thrower(): never { + throw new Error("boom"); +} + describe("ErrorBoundary", () => { it("renders its children when nothing throws", () => { render( @@ -54,9 +58,6 @@ describe("ErrorBoundary", () => { }); it("prefers a caller-supplied fallback", () => { - function Thrower(): never { - throw new Error("boom"); - } render( Custom fallback

}> diff --git a/apps/web/src/features/chat/chat-composer.alignment.test.tsx b/apps/web/src/features/chat/chat-composer.alignment.test.tsx index 768e720f77..7687c35015 100644 --- a/apps/web/src/features/chat/chat-composer.alignment.test.tsx +++ b/apps/web/src/features/chat/chat-composer.alignment.test.tsx @@ -48,6 +48,12 @@ const models = [ }, ]; +/** Records the global shortcuts-help binding so a test can prove it is blocked. */ +function ShortcutProbe({ onOpen }: { onOpen: () => void }) { + useShortcut("shortcuts.open", onOpen); + return null; +} + function composerInput() { return screen.getByRole("textbox", { name: "Message Mecatl" }); } @@ -638,13 +644,9 @@ describe("composer pills", () => { it("blocks app shortcuts while the phone sheet is open", async () => { const user = userEvent.setup(); const openShortcuts = vi.fn(); - function ShortcutProbe() { - useShortcut("shortcuts.open", openShortcuts); - return null; - } render( - + + + + {JSON.stringify(configuration.execution)} + + ); +} + afterEach(() => { cleanup(); vi.restoreAllMocks(); @@ -112,26 +134,7 @@ describe("composer configuration selectors", () => { declaredExecutionFiles: true, declaredBuiltInShell: false, }; - function Picker() { - const [configuration, setConfiguration] = useState(initialConfiguration); - const [items, setItems] = useState([item]); - return ( - <> - - - {JSON.stringify(configuration.execution)} - - ); - } - render(); + render(); expect(screen.getByRole("option", { name: /declared files: true, Shell: false/ })).toBeTruthy(); await user.selectOptions( screen.getByLabelText("Execution"), diff --git a/apps/web/src/features/chat/delegation-panel.pinning.test.tsx b/apps/web/src/features/chat/delegation-panel.pinning.test.tsx index c10ae7d1c9..1c96dc1066 100644 --- a/apps/web/src/features/chat/delegation-panel.pinning.test.tsx +++ b/apps/web/src/features/chat/delegation-panel.pinning.test.tsx @@ -116,7 +116,34 @@ const fleet: DelegationFleet = { teams: [team], }; -/** Holds the chosen activity the way the chat surface does, and records every change. */ +/** Holds the chosen activity the way the chat surface does. */ +function Harness({ + family, + initialFocus, + onFocusChange, +}: { + family?: DelegationFocus["family"]; + initialFocus?: DelegationFocus; + onFocusChange: (focus?: DelegationFocus) => void; +}) { + const [focus, setFocus] = useState(initialFocus); + return ( + <> + + { + onFocusChange(next); + setFocus(next); + }} + /> + + ); +} + +/** Renders the held panel and records every change. */ function renderPanel({ family, focus: initialFocus, @@ -125,24 +152,7 @@ function renderPanel({ focus?: DelegationFocus; } = {}) { const onFocusChange = vi.fn<(focus?: DelegationFocus) => void>(); - function Harness() { - const [focus, setFocus] = useState(initialFocus); - return ( - <> - - { - onFocusChange(next); - setFocus(next); - }} - /> - - ); - } - render(); + render(); return { onFocusChange, user: userEvent.setup() }; } diff --git a/apps/web/src/features/chat/delegation-panel.test.tsx b/apps/web/src/features/chat/delegation-panel.test.tsx index 6ad2abc2ae..71bb2a7703 100644 --- a/apps/web/src/features/chat/delegation-panel.test.tsx +++ b/apps/web/src/features/chat/delegation-panel.test.tsx @@ -128,6 +128,72 @@ const parallel: ParallelGroupActivity = { ], }; +const journeyFleet = { + ...createDelegationFleet("session-a"), + subagents: [subagent], + parallelGroups: [parallel], + teams: [team], +}; + +/** Opens activity from a card or the session control the way the chat surface does. */ +function Journey() { + const [preview, setPreview] = useState(); + const [focus, setFocus] = useState(); + const [focusRequest, setFocusRequest] = useState(0); + const [revision, setRevision] = useState(0); + const opener = useRef(null); + const openerFocus = useRef(undefined); + const sessionControl = useRef(null); + return ( + <> + + { + opener.current = button; + openerFocus.current = next; + setFocus(next); + setFocusRequest((value) => value + 1); + setPreview({ kind: "activity" }); + }} + /> + + {preview && ( + {}} + onClose={() => setPreview(undefined)} + preview={preview} + /> + )} + + ); +} + describe("session activity content", () => { it("leaves panel Escape to the owning chat when managed externally", async () => { let closes = 0; @@ -222,69 +288,6 @@ describe("session activity content", () => { }); it("opens activity from a card and restores focus on close", async () => { - const fleet = { - ...createDelegationFleet("session-a"), - subagents: [subagent], - parallelGroups: [parallel], - teams: [team], - }; - function Journey() { - const [preview, setPreview] = useState(); - const [focus, setFocus] = useState(); - const [focusRequest, setFocusRequest] = useState(0); - const [revision, setRevision] = useState(0); - const opener = useRef(null); - const openerFocus = useRef(undefined); - const sessionControl = useRef(null); - return ( - <> - - { - opener.current = button; - openerFocus.current = next; - setFocus(next); - setFocusRequest((value) => value + 1); - setPreview({ kind: "activity" }); - }} - /> - - {preview && ( - {}} - onClose={() => setPreview(undefined)} - preview={preview} - /> - )} - - ); - } const node = await mount(); const card = node.querySelector("fieldset button") as HTMLButtonElement; card.focus(); diff --git a/apps/web/src/features/chat/delegation-workspace.test.tsx b/apps/web/src/features/chat/delegation-workspace.test.tsx index 99b9a6d4d8..de965a9961 100644 --- a/apps/web/src/features/chat/delegation-workspace.test.tsx +++ b/apps/web/src/features/chat/delegation-workspace.test.tsx @@ -79,6 +79,19 @@ let container: HTMLDivElement | undefined; let root: Root | undefined; let queryClient: QueryClient | undefined; +/** A chat route whose session can be switched from A to B mid-stream. */ +function Switchable() { + const [sessionId, setSessionId] = useState("session-a"); + return ( + <> + + + + ); +} + async function mountWorkspace( fetcher: (request: Request) => Promise, component: () => React.ReactNode, @@ -438,18 +451,6 @@ describe("mounted delegated activity", () => { } throw new Error(`Unexpected request ${path}`); }; - function Switchable() { - const [sessionId, setSessionId] = useState("session-a"); - return ( - <> - - - - ); - } - await mountWorkspace(fetcher, Switchable); await act(async () => vi.waitFor(() => expect(oldSignal).toBeDefined())); await act(async () => { @@ -1191,17 +1192,6 @@ describe("mounted delegated activity", () => { } throw new Error(`Unexpected request ${path}`); }; - function Switchable() { - const [sessionId, setSessionId] = useState("session-a"); - return ( - <> - - - - ); - } await mountWorkspace(fetcher, Switchable); await act(async () => vi.waitFor(() => expect(oldSignal).toBeDefined())); await act(async () => { diff --git a/apps/web/src/features/chat/side-panel-shell.test.tsx b/apps/web/src/features/chat/side-panel-shell.test.tsx index ae5ece641d..1d11079418 100644 --- a/apps/web/src/features/chat/side-panel-shell.test.tsx +++ b/apps/web/src/features/chat/side-panel-shell.test.tsx @@ -25,6 +25,23 @@ import { SideThreadPanel } from "./side-thread-panel"; beforeEach(() => clearUserScopedStorage()); afterEach(() => cleanup()); +/** Owns its own selection and decision state, as activity and authorization content do. */ +function OwnedContent({ delivery }: { delivery: string }) { + const [selection, setSelection] = useState("activity-a"); + const [decision, setDecision] = useState("pending"); + return ( + <> + + +

{delivery}

+ + ); +} + describe("shared side panel frame", () => { it("preserves the active panel and width during stream updates", () => { const onClose = vi.fn(); @@ -88,21 +105,6 @@ describe("shared side panel frame", () => { }); it("hosts activity and authorization without owning their content", () => { - function OwnedContent({ delivery }: { delivery: string }) { - const [selection, setSelection] = useState("activity-a"); - const [decision, setDecision] = useState("pending"); - return ( - <> - - -

{delivery}

- - ); - } const { rerender } = render( {}} title="Activity"> diff --git a/apps/web/src/features/chat/side-panels.alignment.test.tsx b/apps/web/src/features/chat/side-panels.alignment.test.tsx index a3318ae067..c60ffb410e 100644 --- a/apps/web/src/features/chat/side-panels.alignment.test.tsx +++ b/apps/web/src/features/chat/side-panels.alignment.test.tsx @@ -19,6 +19,12 @@ afterEach(() => { vi.restoreAllMocks(); }); +/** Records the global shortcuts-help binding so a test can prove it is blocked. */ +function ShortcutProbe({ onOpen }: { onOpen: () => void }) { + useShortcut("shortcuts.open", onOpen); + return null; +} + function Canvas({ initial }: { initial: string }) { const [value, setValue] = useState(initial); return ( @@ -133,13 +139,9 @@ describe("side panel frames", () => { it("blocks app shortcuts while the Clear confirmation is open", async () => { const user = userEvent.setup(); const openShortcuts = vi.fn(); - function ShortcutProbe() { - useShortcut("shortcuts.open", openShortcuts); - return null; - } render( - + , ); diff --git a/apps/web/src/features/schedules/schedules-workspace.test.tsx b/apps/web/src/features/schedules/schedules-workspace.test.tsx index 1564a1baf2..c87d3c830d 100644 --- a/apps/web/src/features/schedules/schedules-workspace.test.tsx +++ b/apps/web/src/features/schedules/schedules-workspace.test.tsx @@ -397,6 +397,12 @@ describe("schedule detail delete", () => { }); }); +/** Records the schedules filter binding so a test can prove open dialogs block it. */ +function Probe({ handler }: { handler: () => void }) { + useShortcut("schedules.filter", handler); + return null; +} + describe("schedule keyboard focus and shortcuts", () => { const alpha = schedule({ name: "Alpha" }); @@ -456,11 +462,6 @@ describe("schedule keyboard focus and shortcuts", () => { }); describe("on the detail page", () => { - function Probe({ handler }: { handler: () => void }) { - useShortcut("schedules.filter", handler); - return null; - } - function detailApi() { fakeApi((method, path) => { if (method !== "GET") return undefined; diff --git a/sdk/typescript/README.md b/sdk/typescript/README.md index 6dd269c250..d4fc740ed5 100644 --- a/sdk/typescript/README.md +++ b/sdk/typescript/README.md @@ -21,7 +21,6 @@ for release notes. ## Public entry points The package has four public entry points: - - `@stacklok-oss/mecatl-sdk` - transport-neutral core plus browser and Deno remote HTTP/SSE; - `@stacklok-oss/mecatl-sdk/node` - Node/Bun gRPC and local-process features; - `@stacklok-oss/mecatl-sdk/deno` - Deno gRPC plus `Deno.Command` local-process features; diff --git a/sdk/typescript/Taskfile.yml b/sdk/typescript/Taskfile.yml index 47dedfc39c..da70abc2de 100644 --- a/sdk/typescript/Taskfile.yml +++ b/sdk/typescript/Taskfile.yml @@ -1,4 +1,4 @@ -version: '3' +version: "3" tasks: install: diff --git a/sdk/typescript/biome.json b/sdk/typescript/biome.json index f74b022e29..04a8aa8bd3 100644 --- a/sdk/typescript/biome.json +++ b/sdk/typescript/biome.json @@ -1,7 +1,7 @@ { - "$schema": "https://biomejs.dev/schemas/2.5.13/schema.json", + "$schema": "https://biomejs.dev/schemas/2.6.2/schema.json", "files": { - "includes": ["**", "!dist", "!.api-extractor-temp", "!examples/slack-bot"] + "includes": ["**", "!dist", "!.api-extractor-temp", "!examples/slack-bot", "!pnpm-lock.yaml"] }, "formatter": { "enabled": true, diff --git a/sdk/typescript/examples/README.md b/sdk/typescript/examples/README.md index 61cafaa21b..8d1de6b68d 100644 --- a/sdk/typescript/examples/README.md +++ b/sdk/typescript/examples/README.md @@ -7,27 +7,27 @@ Node.js 22+ and Bun. The MCP authorization example uses `./node` for gRPC. Other examples that need gRPC or local spawn also use `./node`. Deno 2.9.3 through Deno 2.x uses `./deno` for gRPC and `Deno.Command` local ownership, or `.` for remote HTTP/SSE. -| Example | Focus | -| --- | --- | -| [`quickstart.ts`](./quickstart.ts) | Run one prompt against a private offline daemon. | -| [`remote-connect.ts`](./remote-connect.ts) | Connect to an operator-owned daemon from Node or Bun. | -| [`deno-remote.ts`](./deno-remote.ts) | Connect to an operator-owned daemon from Deno over gRPC. | -| [`deno-local.ts`](./deno-local.ts) | Start and own a local daemon with `Deno.Command`. | -| [`local-spawn.ts`](./local-spawn.ts) | Spawn and dispose a private local daemon. | -| [`one-shot-query.ts`](./one-shot-query.ts) | Run one local prompt with `query()`. | -| [`callback-tool.ts`](./callback-tool.ts) | Register one local callback tool before session creation. | -| [`session-lifecycle.ts`](./session-lifecycle.ts) | Inspect and rename a session, then fork and clear into independent successors. | -| [`capability-discovery.ts`](./capability-discovery.ts) | Check deployment capabilities and safe server identity before creating a session. | -| [`mcp-workspace-enrollment.ts`](./mcp-workspace-enrollment.ts) | Inspect connectors, start enrollment, and observe it after an application-controlled authorization step. | -| [`browser-bff.ts`](./browser-bff.ts) | Show the browser side of the recommended same-origin BFF deployment. This is guidance, not shipped BFF server code. | -| [`permissions.ts`](./permissions.ts) | Resolve permission asks with a narrow callback. | -| [`mcp-authorization.ts`](./mcp-authorization.ts) | Present and explicitly recheck a parked MCP authorization, including chained authorization and bounded recovery. | -| [`run-events.ts`](./run-events.ts) | Consume one run as a typed event stream. | -| [`multimodal.ts`](./multimodal.ts) | Send text and a local image in one prompt. | -| [`durable-attachment.ts`](./durable-attachment.ts) | Resume durable cross-run activity from an application-owned cursor. | -| [`teams.ts`](./teams.ts) | Create, run, and explicitly clean up a direct team. | -| [`schedules.ts`](./schedules.ts) | Create a recurring schedule through the typed namespace. | -| [`plan-resolution.ts`](./plan-resolution.ts) | Resolve a parked plan across its resumed and continuation runs. | +| Example | Focus | +| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| [`quickstart.ts`](./quickstart.ts) | Run one prompt against a private offline daemon. | +| [`remote-connect.ts`](./remote-connect.ts) | Connect to an operator-owned daemon from Node or Bun. | +| [`deno-remote.ts`](./deno-remote.ts) | Connect to an operator-owned daemon from Deno over gRPC. | +| [`deno-local.ts`](./deno-local.ts) | Start and own a local daemon with `Deno.Command`. | +| [`local-spawn.ts`](./local-spawn.ts) | Spawn and dispose a private local daemon. | +| [`one-shot-query.ts`](./one-shot-query.ts) | Run one local prompt with `query()`. | +| [`callback-tool.ts`](./callback-tool.ts) | Register one local callback tool before session creation. | +| [`session-lifecycle.ts`](./session-lifecycle.ts) | Inspect and rename a session, then fork and clear into independent successors. | +| [`capability-discovery.ts`](./capability-discovery.ts) | Check deployment capabilities and safe server identity before creating a session. | +| [`mcp-workspace-enrollment.ts`](./mcp-workspace-enrollment.ts) | Inspect connectors, start enrollment, and observe it after an application-controlled authorization step. | +| [`browser-bff.ts`](./browser-bff.ts) | Show the browser side of the recommended same-origin BFF deployment. This is guidance, not shipped BFF server code. | +| [`permissions.ts`](./permissions.ts) | Resolve permission asks with a narrow callback. | +| [`mcp-authorization.ts`](./mcp-authorization.ts) | Present and explicitly recheck a parked MCP authorization, including chained authorization and bounded recovery. | +| [`run-events.ts`](./run-events.ts) | Consume one run as a typed event stream. | +| [`multimodal.ts`](./multimodal.ts) | Send text and a local image in one prompt. | +| [`durable-attachment.ts`](./durable-attachment.ts) | Resume durable cross-run activity from an application-owned cursor. | +| [`teams.ts`](./teams.ts) | Create, run, and explicitly clean up a direct team. | +| [`schedules.ts`](./schedules.ts) | Create a recurring schedule through the typed namespace. | +| [`plan-resolution.ts`](./plan-resolution.ts) | Resolve a parked plan across its resumed and continuation runs. | Run the compiler gate from the repository root: diff --git a/sdk/typescript/examples/slack-bot/docker/bot.Dockerfile b/sdk/typescript/examples/slack-bot/docker/bot.Dockerfile index 8f4cc9d584..03062b224b 100644 --- a/sdk/typescript/examples/slack-bot/docker/bot.Dockerfile +++ b/sdk/typescript/examples/slack-bot/docker/bot.Dockerfile @@ -13,15 +13,15 @@ FROM cgr.dev/chainguard/node:latest-dev@sha256:13afe2c05d49286578b74c4a14b8e4bbe WORKDIR /home/node/src COPY --chown=65532:65532 . . -RUN corepack pnpm@11.25.0 install --frozen-lockfile \ - && corepack pnpm@11.25.0 run build +RUN corepack pnpm@11.28.7 install --frozen-lockfile \ + && corepack pnpm@11.28.7 run build RUN cd examples/slack-bot \ - && corepack pnpm@11.25.0 install --frozen-lockfile \ - && corepack pnpm@11.25.0 run build + && corepack pnpm@11.28.7 install --frozen-lockfile \ + && corepack pnpm@11.28.7 run build FROM builder AS production-dependencies -RUN cd examples/slack-bot && corepack pnpm@11.25.0 prune --prod -RUN corepack pnpm@11.25.0 prune --prod +RUN cd examples/slack-bot && corepack pnpm@11.28.7 prune --prod +RUN corepack pnpm@11.28.7 prune --prod FROM cgr.dev/chainguard/node:latest@sha256:88c4f6e6941bdd4fb9039d98ad05384e1bfe5693dd31ccc8eb2f0c8522bdb40e diff --git a/sdk/typescript/examples/slack-bot/package.json b/sdk/typescript/examples/slack-bot/package.json index e5319997cb..109e61ce4e 100644 --- a/sdk/typescript/examples/slack-bot/package.json +++ b/sdk/typescript/examples/slack-bot/package.json @@ -8,7 +8,7 @@ "engines": { "node": ">=24" }, - "packageManager": "pnpm@11.25.0", + "packageManager": "pnpm@11.28.7", "scripts": { "lint": "biome check .", "format": "biome check --write .", diff --git a/sdk/typescript/package.json b/sdk/typescript/package.json index 86eccf9501..cdf8ea4bd5 100644 --- a/sdk/typescript/package.json +++ b/sdk/typescript/package.json @@ -22,7 +22,7 @@ "deno": ">=2.9.3 <3", "node": ">=22" }, - "packageManager": "pnpm@11.25.0", + "packageManager": "pnpm@11.28.7", "files": [ "dist", "LICENSE" @@ -62,7 +62,7 @@ "prepack": "pnpm run build" }, "devDependencies": { - "@biomejs/biome": "2.5.15", + "@biomejs/biome": "2.6.2", "@microsoft/api-extractor": "7.59.4", "@playwright/test": "1.64.1", "typescript": "6.0.3", diff --git a/sdk/typescript/pnpm-lock.yaml b/sdk/typescript/pnpm-lock.yaml index c4f3f74bc9..ddd8015f07 100644 --- a/sdk/typescript/pnpm-lock.yaml +++ b/sdk/typescript/pnpm-lock.yaml @@ -29,8 +29,8 @@ importers: version: 8.20.0 devDependencies: '@biomejs/biome': - specifier: 2.5.15 - version: 2.5.15 + specifier: 2.6.2 + version: 2.6.2 '@microsoft/api-extractor': specifier: 7.59.4 version: 7.59.4(@types/node@24.19.2) @@ -49,59 +49,71 @@ importers: packages: - '@biomejs/biome@2.5.15': - resolution: {integrity: sha512-WZTW4slm/pdkh92K6t/3aEN++44JD1PQ7squ7RCMLI1flHGl43DVOIGXvCjHiZgBMO1V4uYxoFNtqrIA4qGuIQ==} + '@biomejs/biome@2.6.2': + resolution: {integrity: sha512-JLTFAFF9vfJcWwLhwuL4ZHflLg+XfTEC4IUnAlJRX1cMRt57++Xd1Ysb9Fdmlh9YUrvyCXfPEHjjEIqKJGdPKw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.5.15': - resolution: {integrity: sha512-BZVzFhJ/mUvTLMYbc9x6el0o2Uv5zP7bACYyhFb6fSc1giroXm7PL0a5KqMJ9F+/BnkYRjagD/ROSDVOZ6eapg==} + '@biomejs/cli-android-arm64@2.6.2': + resolution: {integrity: sha512-dMpdpH7zFEL5FxuIA9LJW+RoNyC3oeDB7PJyjqVVwtMNoKB5uo8OZYmrVSBikn71txzYwy/3xga7UME6bJQZ6A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [android] + + '@biomejs/cli-android-x64@2.6.2': + resolution: {integrity: sha512-XCwEhPBGYzuRA502dRkCcQ+5cefQwuxQR7f9wa4do92dvIcuBL6VMLMFB/fL9hlpZ4dGSfHdpGFSIDlp52mg0A==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [android] + + '@biomejs/cli-darwin-arm64@2.6.2': + resolution: {integrity: sha512-rpXtabRgyZNz3aCjd/cRoSZGYi92R9eAXdUUe1sigIsRDyfMwgThaa98Yxt1fiZ7mxquqkAyIHIo08N/e1ToBA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.5.15': - resolution: {integrity: sha512-V5Kw63V+fVGNFhFrizDxMbGXAzZCh8kYzJpy3GI6gTapWDg7bZK9oYC9CbVgQSEdTnupz0U5Efz8Ev+5vdBBXw==} + '@biomejs/cli-darwin-x64@2.6.2': + resolution: {integrity: sha512-7GGzlm1GxUKoQ9CNV8tQZ+XXad4sz+v+uzNsWlhaGjsnZqUOVBw1OmAMpG3uNV/Mr0UrCpRJvSK0qvfuqSQOjg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.5.15': - resolution: {integrity: sha512-tGzZUTcJCV7tj5Adh/Gn6nR4MycqA3iohq2LEcrarAgRBkU0h0OKd2UzCRkOsOYOuUGaUJb4YmqRqyy2feGGSw==} + '@biomejs/cli-linux-arm64-musl@2.6.2': + resolution: {integrity: sha512-I+FYCLVSmR3cYfKcQ+KNeLOZ5w0wRd9fQFlw3JbSvy7bkegvTqdHaBRRcJzHQB/1ldldTLIcG21ka6X2cTWmJw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.5.15': - resolution: {integrity: sha512-XaG7P7eeSLYETD3K9grfB0mQmpLQZjygdbsxekWBJAg4am79fGAtRpfRyNnTvXB2fZFNnJZG3nXm7HBat0+VUw==} + '@biomejs/cli-linux-arm64@2.6.2': + resolution: {integrity: sha512-Qs4CofCE8MdkjZFfEjswh2NAcbyQ7IVYtGSzQBvLqFlla/CSXroGbktUFndWG/kVSTywadauzAspYWtSfqAc2g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.5.15': - resolution: {integrity: sha512-IlxUcyxilVGPsE008x13pWdkTbU3nQpP2i9b5UrbOYj6goBkKsRX1XB7yJLcV+O1H9LBchIIm4adOaVLZBX0ZQ==} + '@biomejs/cli-linux-x64-musl@2.6.2': + resolution: {integrity: sha512-wnjEXAK2pDd2j8r9gKI3L+44sIxjkYzS5aHmD1+K57RNJ3sFyT4n22NH6QFPqqeVdRBxN54H3kckUUCrFKCcJw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.5.15': - resolution: {integrity: sha512-xE4iEW/3LqlYj9GFgGrFsFSH51dEEpUbYWBfeOv0q87WkUDxK2o/HhreSb7qMJqck70RVM6Lg96hgedcAYcOkA==} + '@biomejs/cli-linux-x64@2.6.2': + resolution: {integrity: sha512-FJKsb95418139xDdbv9XnNJsIIwvsgR21Of0aE9B9U+nQlOtRq5gJl2ps0jZUmYBxTaOlP9BKo8N+Ff8+Rui1g==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.5.15': - resolution: {integrity: sha512-2kPKzhNlm8C+Ru3GcO0Me2ODkCBLrVOUNuyi84RJyWDVKAA4+Kjj3jMjL938lF6BRfvltC4vB2nPY9SvN51Ovg==} + '@biomejs/cli-win32-arm64@2.6.2': + resolution: {integrity: sha512-/PEOo6evlgrQOfKhMNtC/4Gk8ai3hySXXEtjUzCqZe/4iAbMdqelpp7qvZEDyLxlZS+BjOMQFpq2gXI/BPaAqw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.5.15': - resolution: {integrity: sha512-yAzh4UqEImV6Hcy0zjUqNfJAsUhoD64FBQCdTG8Md/Z2wQeVP/ZmJ3XRYAs1g8J9fjTFyl2fCtc5FB5til47+g==} + '@biomejs/cli-win32-x64@2.6.2': + resolution: {integrity: sha512-FVlWD+mDDz8nN5LWKRWUhhb7wKIK0VE3oXQvQBX7Fwwj00CvqMVhMyiz1iz8O5aZGmnkhFlKSwJPrUvMh5prQw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -718,39 +730,47 @@ packages: snapshots: - '@biomejs/biome@2.5.15': + '@biomejs/biome@2.6.2': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.5.15 - '@biomejs/cli-darwin-x64': 2.5.15 - '@biomejs/cli-linux-arm64': 2.5.15 - '@biomejs/cli-linux-arm64-musl': 2.5.15 - '@biomejs/cli-linux-x64': 2.5.15 - '@biomejs/cli-linux-x64-musl': 2.5.15 - '@biomejs/cli-win32-arm64': 2.5.15 - '@biomejs/cli-win32-x64': 2.5.15 - - '@biomejs/cli-darwin-arm64@2.5.15': + '@biomejs/cli-android-arm64': 2.6.2 + '@biomejs/cli-android-x64': 2.6.2 + '@biomejs/cli-darwin-arm64': 2.6.2 + '@biomejs/cli-darwin-x64': 2.6.2 + '@biomejs/cli-linux-arm64': 2.6.2 + '@biomejs/cli-linux-arm64-musl': 2.6.2 + '@biomejs/cli-linux-x64': 2.6.2 + '@biomejs/cli-linux-x64-musl': 2.6.2 + '@biomejs/cli-win32-arm64': 2.6.2 + '@biomejs/cli-win32-x64': 2.6.2 + + '@biomejs/cli-android-arm64@2.6.2': + optional: true + + '@biomejs/cli-android-x64@2.6.2': + optional: true + + '@biomejs/cli-darwin-arm64@2.6.2': optional: true - '@biomejs/cli-darwin-x64@2.5.15': + '@biomejs/cli-darwin-x64@2.6.2': optional: true - '@biomejs/cli-linux-arm64-musl@2.5.15': + '@biomejs/cli-linux-arm64-musl@2.6.2': optional: true - '@biomejs/cli-linux-arm64@2.5.15': + '@biomejs/cli-linux-arm64@2.6.2': optional: true - '@biomejs/cli-linux-x64-musl@2.5.15': + '@biomejs/cli-linux-x64-musl@2.6.2': optional: true - '@biomejs/cli-linux-x64@2.5.15': + '@biomejs/cli-linux-x64@2.6.2': optional: true - '@biomejs/cli-win32-arm64@2.5.15': + '@biomejs/cli-win32-arm64@2.6.2': optional: true - '@biomejs/cli-win32-x64@2.5.15': + '@biomejs/cli-win32-x64@2.6.2': optional: true '@bufbuild/protobuf@2.16.0': {} diff --git a/sdk/typescript/test/package.test.ts b/sdk/typescript/test/package.test.ts index 136f713300..183b5e0128 100644 --- a/sdk/typescript/test/package.test.ts +++ b/sdk/typescript/test/package.test.ts @@ -179,7 +179,7 @@ test("exports map exposes exactly ., ./node, ./deno, ./gen", () => { test("packed tarball carries dist and license only", () => { expect(packageJson.engines).toEqual({ deno: ">=2.9.3 <3", node: ">=22" }); - expect(packageJson.packageManager).toBe("pnpm@11.25.0"); + expect(packageJson.packageManager).toBe("pnpm@11.28.7"); const expectedFiles = [ "package/LICENSE", diff --git a/website/package-lock.json b/website/package-lock.json index 2aaf6b86fa..be5321b879 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -17,17 +17,17 @@ "@mdx-js/react": "^3.1.1", "@signalwire/docusaurus-plugin-llms-txt": "1.2.2", "clsx": "^2.1.1", - "lucide-react": "^1.52.0", + "lucide-react": "^1.61.0", "prism-react-renderer": "^2.4.1", - "react": "^19.3.0", - "react-dom": "^19.3.0" + "react": "^19.3.1", + "react-dom": "^19.3.1" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.10.2", "@docusaurus/tsconfig": "3.10.2", "@docusaurus/types": "3.10.2", "@types/react": "^19.3.0", - "prettier": "^3.9.9", + "prettier": "^3.9.10", "prettier-plugin-compact-markdown-table": "^0.1.0", "typescript": "~6.0.3" }, @@ -13458,9 +13458,9 @@ } }, "node_modules/lucide-react": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.52.0.tgz", - "integrity": "sha512-TUgPtl5ZI9WgxOcbu4ckaC5B3l1qxPQrCMgb6OfUB9owx/OvSJfcf93SMgUWAxRw5/1XDfh9uI5F5iNGXCcGDQ==", + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.61.0.tgz", + "integrity": "sha512-v2SQPPPNjnr+BlhL9Spuzmo5yR+hLkftfuE4E3jaxdNPgSH0hJKPcLJBP7yAta87jQNPsSERS59PJjCJ/CorBA==", "license": "ISC", "peerDependencies": { "@types/react": "*", @@ -18221,9 +18221,9 @@ } }, "node_modules/prettier": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.9.tgz", - "integrity": "sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz", + "integrity": "sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==", "dev": true, "license": "MIT", "bin": { @@ -18530,24 +18530,24 @@ } }, "node_modules/react": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", - "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", + "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", - "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.1.tgz", + "integrity": "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==", "license": "MIT", "dependencies": { "scheduler": "^0.28.0" }, "peerDependencies": { - "react": "^19.3.0" + "react": "^19.3.1" } }, "node_modules/react-fast-compare": { diff --git a/website/package.json b/website/package.json index 393afd6a8b..38aa97f2bf 100644 --- a/website/package.json +++ b/website/package.json @@ -26,17 +26,17 @@ "@mdx-js/react": "^3.1.1", "@signalwire/docusaurus-plugin-llms-txt": "1.2.2", "clsx": "^2.1.1", - "lucide-react": "^1.52.0", + "lucide-react": "^1.61.0", "prism-react-renderer": "^2.4.1", - "react": "^19.3.0", - "react-dom": "^19.3.0" + "react": "^19.3.1", + "react-dom": "^19.3.1" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.10.2", "@docusaurus/tsconfig": "3.10.2", "@docusaurus/types": "3.10.2", "@types/react": "^19.3.0", - "prettier": "^3.9.9", + "prettier": "^3.9.10", "prettier-plugin-compact-markdown-table": "^0.1.0", "typescript": "~6.0.3" },