create-stitchkit 0.6.2 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -12,6 +12,54 @@ step is overwritten by the next release.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.6.4] — 2026-09-23
16
+
17
+ ### Fixed
18
+
19
+ - **The board reaches the API on two local ports.** The base template's board
20
+ posts to its own origin (`/api/…`), and the README said the web role forwards
21
+ that — but the forwarding route lived only in the repository example, so a
22
+ blank scaffold answered 404. The route
23
+ (`packages/frontend/src/app/api/[...path]/route.ts`) is now in the base
24
+ template, and says in words when `INTERNAL_API_URL` is unset.
25
+ - **The browser build carries the socket client.** The board passes
26
+ `peers: { client: () => import('socket.io-client') }` to
27
+ `createRealtimeClient`; without the literal loader the bundle had no
28
+ `socket.io-client` and the page failed with "needs the socket.io-client peer".
29
+ - **The socket dials the API role in development.** `.env.example` now sets
30
+ `INTERNAL_API_URL`, `PUBLIC_REALTIME_ORIGIN` and `CORS_ORIGIN` for the two
31
+ local ports, and the repository example passes its realtime origin to the
32
+ board. A two-tab browser test proves a note posted in one tab reaches the
33
+ other in both variants.
34
+
35
+ ### Changed
36
+
37
+ - **A scaffold starts on stitchkit 0.95.3**, whose watch client no longer drops
38
+ the values of a restarted API. The template's range moves from `^0.94.0` to
39
+ `^0.95.3`, over a lockfile resolving 0.95.3.
40
+
41
+ A project generated from 0.6.3 adds the route file above, the `peers` line in
42
+ `features/board/board-live.ts` and the three variables to its `.env`.
43
+
44
+ ## [0.6.3] — 2026-09-23
45
+
46
+ ### Changed
47
+
48
+ - **A scaffold starts on stitchkit 0.94.0.** The template's one framework range
49
+ moves from `^0.90.7` to `^0.94.0`, over a lockfile resolving 0.94.0; the
50
+ template itself needed no change for 0.91–0.94 beyond the example below.
51
+ - Updated the template's dependencies to their current compatible releases: AI
52
+ SDK 7.0.111, Next.js 16.3.6, next-intl 4.14.6, TanStack Query 5.103.2,
53
+ Tabler icons 3.48.0, framer-motion 13.4.1, dotenv 18.0.3, oxc-parser 0.151.0.
54
+ `@wrksz/themes` stays on 1.x (2.0 is a breaking major) and Prisma on 7.x (8 is
55
+ a release candidate).
56
+ - **The repository example names its tools in the `tool` group.** Stitchkit
57
+ 0.94.0 moved an endpoint's tool options into `tool: { name, … }` and refuses
58
+ the old top-level `toolName` at startup, so the example's contract now writes
59
+ `tool: { name: 'repository_read' }` and `tool: { name: 'repository_refresh' }`.
60
+ A project generated from it that moves to 0.94.0 follows the framework's
61
+ [upgrading guide](../../docs/guide/upgrading.md) — one codemod run.
62
+
15
63
  ## [0.6.2] — 2026-09-21
16
64
 
17
65
  ### Fixed
package/dist/cli.js CHANGED
@@ -9,7 +9,7 @@ var {spawn } = globalThis.Bun;
9
9
  // src/identity.ts
10
10
  import { basename } from "path";
11
11
 
12
- // ../core/src/declaration.ts
12
+ // ../core/src/declaration/declaration.ts
13
13
  import { z } from "zod";
14
14
  var PROJECT_DECLARATION_SCHEMA_VERSION = 1;
15
15
  var MACHINE_PATTERNS = [
@@ -164,7 +164,6 @@ function parseProjectDeclaration(source) {
164
164
  }
165
165
  return ProjectDeclarationSchema.parse(source);
166
166
  }
167
-
168
167
  // src/identity.ts
169
168
  var APP_IDENTITY_PATH = "packages/config/src/app-identity.generated.ts";
170
169
  function renderAppIdentityModule(identity) {
@@ -198,8 +197,8 @@ function createApplicationIdentity(destination, displayName) {
198
197
  }
199
198
  });
200
199
  }
201
- function withIdentity(declaration, identity) {
202
- const copied = parseProjectDeclaration(declaration);
200
+ function withIdentity(declaration2, identity) {
201
+ const copied = parseProjectDeclaration(declaration2);
203
202
  return parseProjectDeclaration({ ...copied, identity });
204
203
  }
205
204
 
@@ -425,13 +424,13 @@ async function scaffoldProject(templateDirectory, destination, options = {}) {
425
424
  await rm(join(resolvedDestination, "bun.lock"), { force: true });
426
425
  }
427
426
  const declarationPath = join(resolvedDestination, "project.json");
428
- const declaration = withIdentity(JSON.parse(await readFile(declarationPath, "utf8")), identity);
429
- await writeFile(declarationPath, `${JSON.stringify(declaration, undefined, 2)}
427
+ const declaration2 = withIdentity(JSON.parse(await readFile(declarationPath, "utf8")), identity);
428
+ await writeFile(declarationPath, `${JSON.stringify(declaration2, undefined, 2)}
430
429
  `);
431
430
  if (options.identityModule !== false) {
432
431
  const identityPath = join(resolvedDestination, APP_IDENTITY_PATH);
433
432
  await mkdir(dirname(identityPath), { recursive: true });
434
- await writeFile(identityPath, renderAppIdentityModule(declaration.identity));
433
+ await writeFile(identityPath, renderAppIdentityModule(declaration2.identity));
435
434
  }
436
435
  const manifestPath = join(resolvedDestination, "package.json");
437
436
  const manifest = RootManifestSchema.parse(JSON.parse(await readFile(manifestPath, "utf8")));
@@ -536,10 +535,10 @@ if (import.meta.main) {
536
535
  }
537
536
  async function roleAddresses(destination) {
538
537
  try {
539
- const declaration = parseProjectDeclaration(JSON.parse(await readFile2(join2(destination, "project.json"), "utf8")));
538
+ const declaration2 = parseProjectDeclaration(JSON.parse(await readFile2(join2(destination, "project.json"), "utf8")));
540
539
  const environment = readEnvironmentExample(await readFile2(join2(destination, ".env.example"), "utf8"));
541
540
  const host = environment.BIND_HOST ?? "127.0.0.1";
542
- return declaration.roles.flatMap((role) => {
541
+ return declaration2.roles.flatMap((role) => {
543
542
  const port = role.listener && environment[role.listener.portVariable];
544
543
  if (!role.listener || !port)
545
544
  return [];
@@ -1,17 +1,3 @@
1
- # The web role reaches the API role internally, and forwards the browser's
2
- # same-origin `/api/…` calls to it. This one is required.
3
- INTERNAL_API_URL=http://127.0.0.1:3211
4
-
5
- # The realtime socket, and ONLY it. A WebSocket upgrade does not survive the
6
- # route handler that forwards `/api`, so two roles on two loopback ports must
7
- # name the socket's origin even though their HTTP is already same-origin.
8
- # Behind one routing layer that forwards `/socket.io`, leave this unset.
9
- PUBLIC_REALTIME_ORIGIN=http://127.0.0.1:3211
10
-
11
- # The browser origin the API role admits — for HTTP and for the realtime
12
- # handshake alike. Needed here because the socket above is cross-origin.
13
- CORS_ORIGIN=http://127.0.0.1:3210
14
-
15
1
  # THE CROSS-ORIGIN HTTP VARIANT — unset, and unnecessary for this example.
16
2
  # Set it only for a frontend that dials the API role itself instead of calling
17
3
  # its own `/api`: separate hostnames with nothing in front of them. Setting it
@@ -3,6 +3,7 @@ import { dehydrate, HydrationBoundary } from '@tanstack/react-query';
3
3
  import type { Metadata } from 'next';
4
4
  import { getTranslations } from 'next-intl/server';
5
5
  import { LocaleSchema } from '@/i18n/locales';
6
+ import { publicRealtimeOrigin } from '@/lib/api/place';
6
7
  import { useRepository } from '@/lib/api/queries';
7
8
  import { createServerRepositoryApi } from '@/lib/api/server-client';
8
9
  import { getQueryClient } from '@/lib/query-client';
@@ -39,6 +40,7 @@ export default async function Page({ params }: { params: Promise<{ locale: strin
39
40
  heroTitle={t('heroTitle')}
40
41
  catalogueLabel={t('ui')}
41
42
  locale={appLocale}
43
+ realtimeOrigin={publicRealtimeOrigin()}
42
44
  />
43
45
  </HydrationBoundary>
44
46
  );
@@ -14,7 +14,7 @@ export const repositoryContract = defineContract(
14
14
  desc: 'Read the server-cached repository snapshot',
15
15
  output: RepositorySnapshotSchema,
16
16
  expose: ['HTTP', 'MCP', 'AGENT', 'CLI'],
17
- toolName: 'repository_read',
17
+ tool: { name: 'repository_read' },
18
18
  },
19
19
  refresh: {
20
20
  method: 'POST',
@@ -22,7 +22,7 @@ export const repositoryContract = defineContract(
22
22
  desc: 'Refresh the repository snapshot from GitHub',
23
23
  output: RepositorySnapshotSchema,
24
24
  expose: ['HTTP', 'MCP', 'AGENT', 'CLI'],
25
- toolName: 'repository_refresh',
25
+ tool: { name: 'repository_refresh' },
26
26
  },
27
27
  },
28
28
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-stitchkit",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
4
4
  "description": "Create a production-shaped Stitchkit application",
5
5
  "license": "MIT",
6
6
  "author": "Max Listov <maxlistov@gmail.com>",
@@ -76,14 +76,14 @@
76
76
  "zod": "^4.6.5"
77
77
  },
78
78
  "devDependencies": {
79
- "@opentui/core": "^0.5.11",
80
- "@opentui/react": "^0.5.11",
79
+ "@opentui/core": "^0.5.12",
80
+ "@opentui/react": "^0.5.12",
81
81
  "@openrouter/ai-sdk-provider": "^3.1.0",
82
82
  "@types/bun": "^1.4.2",
83
83
  "@types/react": "^19.3.0",
84
- "ai": "^7.0.107",
84
+ "ai": "^7.0.111",
85
85
  "react": "^19.3.0",
86
- "stitchkit": "0.90.5",
86
+ "stitchkit": "0.95.3",
87
87
  "typescript": "^7.0.2"
88
88
  },
89
89
  "engines": {
@@ -72,10 +72,12 @@ Two things can pull a deployment out of that, and they are separate questions,
72
72
  so they have separate variables. **`PUBLIC_REALTIME_ORIGIN`** is the socket: a
73
73
  WebSocket upgrade does not survive the route handler that forwards `/api`, so
74
74
  two roles on two ports with nothing in front of them must name the socket's
75
- origin even though their HTTP is already same-origin. Behind one routing layer
76
- that forwards `/socket.io`, leave it unset. **`PUBLIC_API_ORIGIN`** is HTTP, for
77
- a frontend that genuinely dials the API role itself — and setting it changes
78
- nothing on its own: switching is one import in
75
+ origin even though their HTTP is already same-origin — `.env.example` sets it,
76
+ with `CORS_ORIGIN` admitting the web origin, for the two local ports. Behind one
77
+ routing layer that forwards `/socket.io`, leave both unset.
78
+ **`PUBLIC_API_ORIGIN`** is HTTP, for a frontend that genuinely dials the API
79
+ role itself — and setting it changes nothing on its own: with
80
+ `--example repository`, switching is one import in
79
81
  `packages/frontend/src/lib/api/queries.ts`, documented in
80
82
  `packages/frontend/src/lib/api/cross-origin.ts`. That variant costs a
81
83
  server-delivered address, a client built on first use (hence the parentheses),
@@ -22,5 +22,17 @@ SMOKE_WEB_ORIGIN=http://127.0.0.1:3210
22
22
  # carries. List here only the hosts this deployment really answers for.
23
23
  PUBLIC_WEB_HOSTS=127.0.0.1:3210
24
24
  LOG_FORMAT=pretty
25
- # CORS_ORIGIN is only needed for a genuinely cross-origin browser.
26
- # CORS_ORIGIN=http://127.0.0.1:3210
25
+
26
+ # The web role reaches the API role internally, and forwards the browser's
27
+ # same-origin `/api/…` calls to it (packages/frontend/src/app/api/[...path]).
28
+ INTERNAL_API_URL=http://127.0.0.1:3211
29
+
30
+ # The realtime socket, and ONLY it. A WebSocket upgrade does not survive the
31
+ # route handler that forwards `/api`, so two roles on two loopback ports must
32
+ # name the socket's origin even though their HTTP is already same-origin.
33
+ # Behind one routing layer that forwards `/socket.io`, leave this unset.
34
+ PUBLIC_REALTIME_ORIGIN=http://127.0.0.1:3211
35
+
36
+ # The browser origin the API role admits — for HTTP and for the realtime
37
+ # handshake alike. Needed here because the socket above is cross-origin.
38
+ CORS_ORIGIN=http://127.0.0.1:3210
package/template/bun.lock CHANGED
@@ -5,7 +5,7 @@
5
5
  "": {
6
6
  "name": "stitchkit-starter",
7
7
  "dependencies": {
8
- "dotenv": "^18.0.1",
8
+ "dotenv": "^18.0.3",
9
9
  },
10
10
  "devDependencies": {
11
11
  "@app/config": "workspace:*",
@@ -16,7 +16,7 @@
16
16
  "@playwright/test": "^1.63.0",
17
17
  "@types/bun": "^1.4.2",
18
18
  "@types/node": "^26.6.2",
19
- "oxc-parser": "^0.150.0",
19
+ "oxc-parser": "^0.151.0",
20
20
  "socket.io-client": "^4.8.3",
21
21
  "stitchkit": "catalog:",
22
22
  "typescript": "^7.0.2",
@@ -33,7 +33,7 @@
33
33
  "@modelcontextprotocol/server": "^2.0.0",
34
34
  "@prisma/adapter-pg": "^7.10.0",
35
35
  "@socket.io/bun-engine": "^0.1.2",
36
- "ai": "^7.0.107",
36
+ "ai": "^7.0.111",
37
37
  "socket.io": "^4.8.3",
38
38
  "stitchkit": "catalog:",
39
39
  "zod": "^4.6.5",
@@ -48,7 +48,7 @@
48
48
  "version": "0.1.0",
49
49
  "dependencies": {
50
50
  "@t3-oss/env-core": "^0.13.11",
51
- "dotenv": "^18.0.1",
51
+ "dotenv": "^18.0.3",
52
52
  "stitchkit": "catalog:",
53
53
  "zod": "^4.6.5",
54
54
  },
@@ -90,17 +90,17 @@
90
90
  "@radix-ui/react-tabs": "^1.1.21",
91
91
  "@radix-ui/react-tooltip": "^1.2.16",
92
92
  "@t3-oss/env-nextjs": "^0.13.11",
93
- "@tabler/icons-react": "^3.47.0",
94
- "@tanstack/react-query": "^5.103.1",
93
+ "@tabler/icons-react": "^3.48.0",
94
+ "@tanstack/react-query": "^5.103.2",
95
95
  "@tanstack/react-table": "^9.2.4",
96
96
  "@wrksz/themes": "^1.2.0",
97
97
  "class-variance-authority": "^0.7.1",
98
98
  "clsx": "^2.1.1",
99
99
  "date-fns": "^4.4.0",
100
- "dotenv": "^18.0.1",
101
- "framer-motion": "^13.4.0",
102
- "next": "^16.3.5",
103
- "next-intl": "^4.14.5",
100
+ "dotenv": "^18.0.3",
101
+ "framer-motion": "^13.4.1",
102
+ "next": "^16.3.6",
103
+ "next-intl": "^4.14.6",
104
104
  "react": "^19.3.0",
105
105
  "react-dom": "^19.3.0",
106
106
  "react-query-kit": "^3.3.4",
@@ -145,10 +145,10 @@
145
145
  "zod": "4.6.5",
146
146
  },
147
147
  "catalog": {
148
- "stitchkit": "^0.90.7",
148
+ "stitchkit": "^0.95.3",
149
149
  },
150
150
  "packages": {
151
- "@ai-sdk/gateway": ["@ai-sdk/gateway@4.0.87", "", { "dependencies": { "@ai-sdk/provider": "4.0.17", "@ai-sdk/provider-utils": "5.0.45", "@vercel/oidc": "3.2.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6wJmX/D5OO7tvDJbtFdXdBuRt8AkCnW+FLK+W35UHe/tHgolAa4hclXtJcMSYnlTDy/t5DNRgdesVaoMXtwzow=="],
151
+ "@ai-sdk/gateway": ["@ai-sdk/gateway@4.0.89", "", { "dependencies": { "@ai-sdk/provider": "4.0.17", "@ai-sdk/provider-utils": "5.0.45", "@vercel/oidc": "3.2.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-n0Q88UUASYQBGK3Ogs9pCe8h3ZXeTHFSuGOLBJAyH73MVGNKUv9w8EJX2f340WUF3eDWWOV305gO7YBpSCPblA=="],
152
152
 
153
153
  "@ai-sdk/provider": ["@ai-sdk/provider@4.0.17", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-VYMBxIQdcHqbIf1j+YZlI9Ati6LZ4wJe0GGd4z4a5H/KxTggjeOiyaVYTnfF7LHZK5jMQ+rofmzz4QPqf++NUw=="],
154
154
 
@@ -292,63 +292,63 @@
292
292
 
293
293
  "@modelcontextprotocol/server": ["@modelcontextprotocol/server@2.0.0", "", { "dependencies": { "@modelcontextprotocol/core": "2.0.0", "zod": "^4.2.0" } }, "sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw=="],
294
294
 
295
- "@next/env": ["@next/env@16.3.5", "", {}, "sha512-NWEXVDMqoEo0ktmU6u0sE2Vg0LOcsD7NnOTJNo3/fEaTfsg+F1bMIxuDmQbda4e3yTIQwVdUREF2yIuMOusKtg=="],
295
+ "@next/env": ["@next/env@16.3.6", "", {}, "sha512-x9Vblze1EbtltQYnNH38xCPWU3TVfBd1eXqA3+w9+BTpedkkdNpAaltXlGQ/nsc1+E0mVTNrtcbX3GoO09zeLQ=="],
296
296
 
297
- "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.3.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-pMmGgETfKvElucLHtVaeiMRbp2zUbvKx7b1yGko0liBz3cw1mKSggWN/Rp/wPz8z+E1O82u3r4L1Co+ZS5hokQ=="],
297
+ "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.3.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-E/7GEqaUkt8mk/T8v9lAnrhzR06kdq1ZBkC12F8tAMkdIadwNp3H1KqHynDHrpcTlGCUdq/qu6vUL2aYVyYBdw=="],
298
298
 
299
- "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.3.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-76VaGYvf6HPa5/w12yLkE3dXTn9AfdEviI79oEL3aZoAmRLc9rWitjWqyjViVysK/ht/y9YKzFkBrUdi/wGkow=="],
299
+ "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.3.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-yBE893/nDWTlaiBD1p+qgt7NUen4U5R6FXyH0s67Npq1S3E0cVSef1WIXC2xBRgQvwAvJq6DnS6Y6PrY0cy4Ew=="],
300
300
 
301
- "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-zKDELJ5jSQMHeO/hmXUQsAzagX4bQD4OiMi3pQ5FbUj+yK506oLVHnKA2YXMlbg1EHHqJYtyePOgByIDXD1lqw=="],
301
+ "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.3.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-KJDpjBqBPYlvkivmyrp+Qys6k/7ksbqGQvRVc6ZEGfR+cjQxx+nUkJaWmNZJsmoOrqYNbaXByF8wa0lBwDhB3Q=="],
302
302
 
303
- "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-7Vql0pgzCoHagv6+FNOZoqmJqA52c6zeVbhtS/47qFozO1MSx4ms7x7GHiciY8R5CDsSMKMQjJEryoJLcsBIbA=="],
303
+ "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.3.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-mqNg2K+hvWskSRb/QM+Ix412DvBsuSF0XV+frTSw5vmoucNnIlynFwKYew8D01bfATErMOM7Bujrf0BA5DRKFA=="],
304
304
 
305
- "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-NH/xzehyHEFWE2nlcZon7TB/0+H4shfWCi7S1zka815XCOhJDYZhoeJtOYy0dh0WVRWACVXSyGNFFytoMxUhRg=="],
305
+ "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.3.6", "", { "os": "linux", "cpu": "x64" }, "sha512-nFncBNGAYouRHjRVaITs9beZRfhX4ssVwpnvPIAbkZVH6LtGoAVlH4bJ8Cnf9SOo9bsXgPFer/GdHtEE3JNOkw=="],
306
306
 
307
- "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-lV4+EhWMfS8jcC+EH2nn/Cm5cn6XsgbE07bU9tMH8fCo0tNAqhyzi1b5wQ/Tn6NGFTvKDY65w3ZH95EjwBRAnQ=="],
307
+ "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.3.6", "", { "os": "linux", "cpu": "x64" }, "sha512-5Mf3cHDGR/Iz0ng2Bj3zUR3p5QS9YK3Hn2QiAfavFmyF48zwThAjpFoiTKNIcOHLYS4zEk+gzyJ/9deQ2ZB8yQ=="],
308
308
 
309
- "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.3.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-/wKzAREX2RF++MhicjDbg8tGn2AiBIM0+EFeTFKoUEUbW5D6amCJehd5Z5G1H5/gxNdgnwoXMcHz24H/c2tGkQ=="],
309
+ "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.3.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-0jkJy0C2kbrJWTk4YLa3xk80pVBpx8FCHJym7CnUfDAXe/FWv5qT7SQJbR0KuemyxaEDlEx5WT4VQJoTW+/9Qw=="],
310
310
 
311
- "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.3.5", "", { "os": "win32", "cpu": "x64" }, "sha512-LNdCHzgLFc+UeqMS84LzXPaeBRKyqDN9OMyFAr1OrB0XrNw78IRrEVtZvvA7245W/HsaoeVOQX9jPjPk8jojwA=="],
311
+ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.3.6", "", { "os": "win32", "cpu": "x64" }, "sha512-/YXjI1e5OXcZ7YpxRwgP/1jAV/SBKTzeVKqN2mk7mLpcICsyn3Gl5+dIfDTJp70M0ccMhyMMRso4v6mPDCGepg=="],
312
312
 
313
- "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.150.0", "", { "os": "android", "cpu": "arm" }, "sha512-oQef2Zu4Prz1KLKznz3HqZzU9uVoA5PMoDZuuLmqms7hKmKSAPzlaMnLllJq3t+rgKmfJJ2siPrpZfFrW06btw=="],
313
+ "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.151.0", "", { "os": "android", "cpu": "arm" }, "sha512-QLfrdT2XmHMo8krBiKHtnTtU2ugxruwnIWMcIl5qpCRV9KPZk1s2YZzSHkIjzabLxG6/1yOoDLvqfS3TrJhfWA=="],
314
314
 
315
- "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.150.0", "", { "os": "android", "cpu": "arm64" }, "sha512-B6ofpoFiAUwIZ0MJ2IgHPvZK8FAtL4qzSZRwOkAKIfxEobE1mQC8nDdiFZj7pUaJiVUVCsfkMsBJKedzO8rZvA=="],
315
+ "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.151.0", "", { "os": "android", "cpu": "arm64" }, "sha512-APzs9QxkLGR85I6Slb93Onsd+9ZdR+PdKIy0g8oOuipiBRtXbEE3PW1QpRn3O2C9dCsfAC8+t7dWGRyByiTqJQ=="],
316
316
 
317
- "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.150.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-J+9IHKzx/bSz1JetOfD4zKXSK9sOm4/a7+0qomJODcTL6JsRXGeV/ZdkAPSIDydfFmWzYCraMlQEosSZEyBYkQ=="],
317
+ "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.151.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-uPj085g+2TcYKm4LrPOF6mU/ilb48ghAfLMA+YIxaSAasgDAXO0c5UMjRrB9L59A1aMU9fvPtCGoW9cov9UtFQ=="],
318
318
 
319
- "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.150.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-v6IPfcAcSYrBWXV5Tce1DmxDMXLhEYpIIWiRFPJopgCVscZdLaV4MRQOUxvL3usQlw+yrwYOjBFB9IwBx+jUiQ=="],
319
+ "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.151.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-gqOyGZsEX9r8i37ONL2X8heUKCbTAY3UvaWlEJKPJYdgaYoIAXSuZrG27legT+0e4m0X/53RupoH6lfbxtMiMw=="],
320
320
 
321
- "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.150.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-AoR/4jD02HET0KO0yNT4nbTE+XJUxiO9jB1X/ycEjUE3WrIJ3IjV/Vf+gskhWLcqqeXfvNnkDtBR7epllAm88A=="],
321
+ "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.151.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Uih9lYFoB9k87b8jZ2263b8/HC0AuCQo9qPfu14KjoDmC7AmGvo4pCLiuEVVHjQycUjTO2dNtG39MIGUuCOx3A=="],
322
322
 
323
- "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.150.0", "", { "os": "linux", "cpu": "arm" }, "sha512-A/hycCFjLUrCmLoL5O/vBp40ohlaXO1Ta3v5hqYZxicYFs129wZmgZJggcW4mYGYbZebQLhup+N8JjeQl8qwyw=="],
323
+ "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.151.0", "", { "os": "linux", "cpu": "arm" }, "sha512-BW9ryFV0V7h37xAEpb1rx+jI/ArFjXlSvJ2CaPwqxCj+kcJdDMvt5/PpWLRRk56UpNpxpq/5+puTUd0/4OPCZw=="],
324
324
 
325
- "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.150.0", "", { "os": "linux", "cpu": "arm" }, "sha512-pbqahg1Pkz7J4RKmXm30s/iQu99hv64ayXCu8P4p75HcEH5azOdR4eGqiB6lFGkFR3mMpzaYsSKLkS8oJbjmeQ=="],
325
+ "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.151.0", "", { "os": "linux", "cpu": "arm" }, "sha512-68zJuPgiFpZ9FF5WgpJiE9cukBZVNv79Yod2VV/wJLaiws+abCEfcxwVEH0608a7E/0zOO1Pj2iY7UrnUS8ydg=="],
326
326
 
327
- "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.150.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-HV11aRbBQGwqv8bEo+K/6qr88uB4fEe1mhXncMhlVCrj+WpBSraxrUzHaPVmeQRU6x6x8v/3DuCbbo93rpp+fw=="],
327
+ "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.151.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-s/CCfZQcqoRo4Ij7ML43Yhe+gJZU7zmudd6StA0T9WDFPLaiWMoBlPRmoS39jPpODxPwI/6yPoiyjKOMNzSqCg=="],
328
328
 
329
- "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.150.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-k6pVkJqALwtEuP4zukVhGRhdIy4+ofChUIUUsAHHyqDZlNsknmel3JjbggrJiWGaes6h/dIcWmEXsKW4SmK9oQ=="],
329
+ "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.151.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-QSjn7WWZNGDTRlMT0SUGDHZNI9XOhGXWdqhL/FuDR/nh0MOqGQT8OHGBy95mZHne4WvoS0OgnUl/+55u07yBiQ=="],
330
330
 
331
- "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.150.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tEFg39mw/rHO5n8GK2DR4ZMFfsPQZtnQIPbsIpjoQRomJc/2tRfsCSmCT6gNit+NZGoeJG5aH9ATDH5bf0WnoQ=="],
331
+ "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.151.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RnvhC+cOND1dsNqbsirtZa9IWVJCCnxIZxs7nAvW0ZFjqqofwKbR3+TNKPqx2eASRC6+b78rZMLiNbDeDUp8+w=="],
332
332
 
333
- "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.150.0", "", { "os": "linux", "cpu": "none" }, "sha512-0JO7IFkoek6HqV589Menx3hJySNXi6quRhO4tq2P7kpEHKEXoDATnoPVUpn5B7gDH2KLkdo751N0uIrGJFCTCw=="],
333
+ "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.151.0", "", { "os": "linux", "cpu": "none" }, "sha512-fpwItfDNVDgXOMV6GdMHD3QV3NdYWhwDH0E8BRuYNeQyUKchb8sNLvAQg+g1HxENvrYjiLqLWAafOja44/sLig=="],
334
334
 
335
- "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.150.0", "", { "os": "linux", "cpu": "none" }, "sha512-7XPzREnyAS5wHU9aB+49Uaqgoo1gVCklHc3DRlc3fJy2tXD/eAJFN1QFz/crj+Ulup5P1+axNREF+/RGaB/IRA=="],
335
+ "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.151.0", "", { "os": "linux", "cpu": "none" }, "sha512-fKchmw5aUlZem7uZZfxsQAl53cFiGWrAKhwjYxvJFiBPQyC9CZ2P7Qhv9unDJSezChu6iJ6XGQWQnRUyLp7j5g=="],
336
336
 
337
- "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.150.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-7n7ZxcbRWDFaTdyj8M8p0O9OfzoMKm8O6syBAIgcSutbOALq0Bb9G52Me+XH0anMLZV+NgXc726gqgG2q39vcQ=="],
337
+ "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.151.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-vDtxikQV1AixMY5pFAW5tDtGHmoexjGpEgtmPBAF3tXvEubm9KucxV0CxtuAIGEZ1aGyvZ74Hfryb7Vvq52F3Q=="],
338
338
 
339
- "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.150.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Vx0GSA9ZCRTUiczoEQnIIyXkMvtEY8uc6IiwLQtMe5ci2sXPqjrry0Ek5fsPP1k2kCzkML3ow9UOOEgnEDi7Bw=="],
339
+ "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.151.0", "", { "os": "linux", "cpu": "x64" }, "sha512-JHB/TuPCUdnkMq9RXB7C/SZuauJUp1EYHi5DaH7ge7uNlCY4AOhc0QeWOjo2rj308+NjxgTwminglWpqlllAig=="],
340
340
 
341
- "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.150.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ii4/9m3viDLssMnfXU7/Pni/3nYplApuGayceX4qsVGaqqQJCx3tHIH9M/HWIeSty5i8LjS21zPYT6lVIkwLxw=="],
341
+ "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.151.0", "", { "os": "linux", "cpu": "x64" }, "sha512-rkoZa4Wv5LbUHdCJ+3vC9G68r49gaoaQPg52Jx7+aC60q3QHIiysrDHQlQ3hiIevsmDl0RgzD+Y389q/hb34WA=="],
342
342
 
343
- "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.150.0", "", { "os": "none", "cpu": "arm64" }, "sha512-ZtoxX5rez36ZWkwtiEhjkCPnlTPoQ2I7lIL0IYZ1yjxMYohbvoOjBmUIZzrf9W/HouONq0omIfTeCWEY+R380w=="],
343
+ "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.151.0", "", { "os": "none", "cpu": "arm64" }, "sha512-zp74XxS9WHSp6ct8LEoTa87F5pJOjFPG0o7dg2YCXaKo0raxabpFMC7NTbefIzWmF9KLIuJF/Rg6CPIu6P/Aaw=="],
344
344
 
345
- "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.150.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-VqeRb5JX/bKYBrff7TUDvJyKY0914UzuCkuXIGxJS4FUmvMNfqkCbc7Sq90iMz9DlmAtlggwaBYQ9eg3h3ltiw=="],
345
+ "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.151.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-xtqapASyiSTv6rdm29kKFoDsxTo1oCmMfhPLGCDbZQ0Y6sU4m7IPEH05NgNEs2SrTErBuldkvS6e0Aqzmu0BgQ=="],
346
346
 
347
- "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.150.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-EPqJfeZ4Pgg2BJSsCV8GozxV0FDltRzpVtGVa1r2noJu1iu+opOw3gtBWXwIo9odCT/MdFfyHxdy0/CRqs3OqA=="],
347
+ "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.151.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-9s4L40gxkolXQx1Q675XEZqgI4j+7+os4kZAFHdrDQVapjB9J2iodub7A8VAZ0cGTfhZNLH4D9L26fwEyqu3fg=="],
348
348
 
349
- "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.150.0", "", { "os": "win32", "cpu": "x64" }, "sha512-n5YMzbqwPQqozbkrexi0lNZrUz5cnPHalYpFWe6Dau7AmKIWNo+y24IwzDuZEQtEdUHuKhXmMMih/MPjOI+CMw=="],
349
+ "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.151.0", "", { "os": "win32", "cpu": "x64" }, "sha512-temy3DJf08taii88l13vfs5Om/HWECLSAj5Ca7ANMvocrekAgCuPC4GeHLi0mJ0cmGPznfeaaj80wqQoPIRYPA=="],
350
350
 
351
- "@oxc-project/types": ["@oxc-project/types@0.150.0", "", {}, "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw=="],
351
+ "@oxc-project/types": ["@oxc-project/types@0.151.0", "", {}, "sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA=="],
352
352
 
353
353
  "@parcel/watcher": ["@parcel/watcher@2.6.0", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.4" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.6.0", "@parcel/watcher-darwin-arm64": "2.6.0", "@parcel/watcher-darwin-x64": "2.6.0", "@parcel/watcher-freebsd-x64": "2.6.0", "@parcel/watcher-linux-arm-glibc": "2.6.0", "@parcel/watcher-linux-arm-musl": "2.6.0", "@parcel/watcher-linux-arm64-glibc": "2.6.0", "@parcel/watcher-linux-arm64-musl": "2.6.0", "@parcel/watcher-linux-x64-glibc": "2.6.0", "@parcel/watcher-linux-x64-musl": "2.6.0", "@parcel/watcher-win32-arm64": "2.6.0", "@parcel/watcher-win32-x64": "2.6.0" } }, "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w=="],
354
354
 
@@ -548,9 +548,9 @@
548
548
 
549
549
  "@t3-oss/env-nextjs": ["@t3-oss/env-nextjs@0.13.11", "", { "dependencies": { "@t3-oss/env-core": "0.13.11" }, "peerDependencies": { "arktype": "^2.1.0", "typescript": ">=5.0.0", "valibot": "^1.0.0-beta.7 || ^1.0.0", "zod": "^3.24.0 || ^4.0.0" }, "optionalPeers": ["arktype", "typescript", "valibot", "zod"] }, "sha512-NC+3j7YWgpzdFu1t5y/8wqibTK0lm5RS4bjXA1n8uwik3wIR4iZM4Fa+U2BaMa5k3Qk8RZiYhoAIX0WogmGkzg=="],
550
550
 
551
- "@tabler/icons": ["@tabler/icons@3.47.0", "", {}, "sha512-aCbSemVrGvSA3w0sJi8mka6QrnQCN8wCD1jKNXXIR/h6Q4ffov/yFPyzjTULDM8ETtK4DABUZhWdYlygqy3npA=="],
551
+ "@tabler/icons": ["@tabler/icons@3.48.0", "", {}, "sha512-lQk06gVHNVBnJp0UOgtth54mcZBJM7rdYKsAxKOProj1bbSAx+/xiuOWfHlyvgdL3M+Y+I0HINrjHa3ygp8eXQ=="],
552
552
 
553
- "@tabler/icons-react": ["@tabler/icons-react@3.47.0", "", { "dependencies": { "@tabler/icons": "3.47.0" }, "peerDependencies": { "react": ">= 16" } }, "sha512-lQkDkYwqTzRNt+MYNinu+fkcIZLKjYBcI37RWkcY72doOgE/vMVFvrFrGZ2cVo2ueB3zH1dWMIhnGgi8Y5mFJA=="],
553
+ "@tabler/icons-react": ["@tabler/icons-react@3.48.0", "", { "dependencies": { "@tabler/icons": "3.48.0" }, "peerDependencies": { "react": ">= 16" } }, "sha512-OCeAlpaWHEMV+EsgdVeGQ3YuKfmfnThZhc++CaZ/ujYzi5+/DONDQlX4OGvH1ikYhIfmc0grI4otJgHy7QAvng=="],
554
554
 
555
555
  "@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="],
556
556
 
@@ -582,9 +582,9 @@
582
582
 
583
583
  "@tailwindcss/postcss": ["@tailwindcss/postcss@4.3.3", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "postcss": "^8.5.16", "tailwindcss": "4.3.3" } }, "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg=="],
584
584
 
585
- "@tanstack/query-core": ["@tanstack/query-core@5.103.1", "", {}, "sha512-rms8HqTGp6zA00dM+cUQ2eBcgzNJefuu5CAMB37i/6MiGT1zulPOytCFu2a0qjLqVR2n1jENPj9woqFQNuCzWA=="],
585
+ "@tanstack/query-core": ["@tanstack/query-core@5.103.2", "", {}, "sha512-I8DkFXls5jXLqtm8+QpOhEmG07hIblhSZFzafg9wHsMSEvMzULy9hK17wU1T/ahfhMbtITJhbxutwwCoihkR7A=="],
586
586
 
587
- "@tanstack/react-query": ["@tanstack/react-query@5.103.1", "", { "dependencies": { "@tanstack/query-core": "5.103.1" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-rmAPPApNEK17VXRJhtE1rja53n23VV5w30C0saCgJhhX+EpdUnVqMGV/s5nnzV43X75KTHKzuoiuxSzGTBIkag=="],
587
+ "@tanstack/react-query": ["@tanstack/react-query@5.103.2", "", { "dependencies": { "@tanstack/query-core": "5.103.2" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-B+fWiYZBc+0uUD5zDZAeLw9dKj7XEsdnuu6zRZ+no6LNKpeE3P3bJ+N6HINjcIlWR6fW3vUoTneEaGa2V6ehqw=="],
588
588
 
589
589
  "@tanstack/react-store": ["@tanstack/react-store@0.11.1", "", { "dependencies": { "@tanstack/store": "0.11.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-HaIGKI3YLmjBYIvy5DFDY23oNaYZIsTZfngey07Uh5iLVJgM3bIGCnZeOFOqzjFld9JHWcaHJnasD/bKoGKwJQ=="],
590
590
 
@@ -714,7 +714,7 @@
714
714
 
715
715
  "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="],
716
716
 
717
- "ai": ["ai@7.0.107", "", { "dependencies": { "@ai-sdk/gateway": "4.0.87", "@ai-sdk/provider": "4.0.17", "@ai-sdk/provider-utils": "5.0.45" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-PVYQ3W9kR8oYiGQxbg4aFIlhQzKskZm8UV+4E0zB2uKOzFr8ju3bXQncOOZtLsOgJY8vdpgyu3cXtomsfcdQYg=="],
717
+ "ai": ["ai@7.0.111", "", { "dependencies": { "@ai-sdk/gateway": "4.0.89", "@ai-sdk/provider": "4.0.17", "@ai-sdk/provider-utils": "5.0.45" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-jd35WisL5FT7lFB6wIsZ38G0EaL4p1o+bUuRfkZGTXqO21U3SWyEZ+muV7N191QQfNeExgoyaeFoa8Jx6Uo+0A=="],
718
718
 
719
719
  "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
720
720
 
@@ -816,7 +816,7 @@
816
816
 
817
817
  "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
818
818
 
819
- "dotenv": ["dotenv@18.0.1", "", { "bin": { "dotenv": "dist/index.cjs" } }, "sha512-0eR4m4D/jH5eaI3evo2ZqqMii5mrTCR12v12VChdie6O1gPHs7XAjzTep0CWc1Bd+oNx3vVfbi734dK4zghigw=="],
819
+ "dotenv": ["dotenv@18.0.3", "", { "bin": { "dotenv": "dist/index.cjs" } }, "sha512-/8CJTyL817qPnfbQrJgOEcrU3fDrJkRIoXBE566wHuvIXKOCHUZhPqGPbCPi9SogjdGnreF0TlvnTgK6J/8zpA=="],
820
820
 
821
821
  "effect": ["effect@3.20.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw=="],
822
822
 
@@ -858,7 +858,7 @@
858
858
 
859
859
  "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
860
860
 
861
- "framer-motion": ["framer-motion@13.4.0", "", { "dependencies": { "motion-dom": "^13.3.0", "motion-utils": "^13.3.0", "tslib": "^2.4.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-HCpqKM9BTu6UYKtj0u6J1QNxojnnirNcghcSDZ+SkpiL3myxvtsgXPS3ZGEELC2eSma7YiA937rAEXtRyydSXQ=="],
861
+ "framer-motion": ["framer-motion@13.4.1", "", { "dependencies": { "motion-dom": "^13.4.1", "motion-utils": "^13.3.0", "tslib": "^2.4.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-6DsbU4hsNsokXkwSp3ezdMWMiv5yWzCcdjFgakkeUC6FVIK01Py8ToSzsXvBw8cYA5hff/oXFvZFU7ltbVyUYA=="],
862
862
 
863
863
  "generate-function": ["generate-function@2.3.1", "", { "dependencies": { "is-property": "^1.0.2" } }, "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ=="],
864
864
 
@@ -882,7 +882,7 @@
882
882
 
883
883
  "iconv-lite": ["iconv-lite@0.7.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ=="],
884
884
 
885
- "icu-minify": ["icu-minify@4.14.5", "", { "dependencies": { "@formatjs/icu-messageformat-parser": "^3.4.0" } }, "sha512-5RQ5fP5inR+VZRTR4KwYBzy217ua4E9lxBT+zFHZcJv0dTOtRs9xXECSIWMQHAfmd0Hq2RXSSP2Gmyw/oQQY6A=="],
885
+ "icu-minify": ["icu-minify@4.14.6", "", { "dependencies": { "@formatjs/icu-messageformat-parser": "^3.4.0" } }, "sha512-NlyqnxOx8UptHjxu+XcaAM0FbnnYRPlv0n8JsOSIykaw2qALrXkC0ODAjdnF9DLlt1O5HNjM3q7cPC3/4WQb4g=="],
886
886
 
887
887
  "immer": ["immer@11.1.16", "", {}, "sha512-Xs7H9rBc+kti1J6RueUvbEBkmOz7jqj11XYgf+YMXAYzu8EeE7hwZ9poLXdVfVnGmJu7QAf41T7H2KuF6QoK6Q=="],
888
888
 
@@ -956,7 +956,7 @@
956
956
 
957
957
  "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
958
958
 
959
- "motion-dom": ["motion-dom@13.3.0", "", { "dependencies": { "motion-utils": "^13.3.0" } }, "sha512-AmAnB6pHdZ1vHGzWzuzteG6Q3j1lHKeX/lbST6jGlgm0cjvLUgaCk1xhOuPMOy5SgovN6wnnUdwFrkcsus7Ftg=="],
959
+ "motion-dom": ["motion-dom@13.4.1", "", { "dependencies": { "motion-utils": "^13.3.0" } }, "sha512-qw6ILBFHrIPQd3k9Dd1fNlCLHTNzvMXW2zpeTlxn4wZXX02m0Dnsf8ycyvcjtAZtBiBnL4SfbyDIXWg+b1x/Ig=="],
960
960
 
961
961
  "motion-utils": ["motion-utils@13.3.0", "", {}, "sha512-sgSschQp7EseHInIlR7hBbMuvet3RA0bs28KPZAXJcGKGdxHGvh1ogpYDilY3bOMtl73EqPNmp75sAKHYPU5sg=="],
962
962
 
@@ -970,11 +970,11 @@
970
970
 
971
971
  "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
972
972
 
973
- "next": ["next@16.3.5", "", { "dependencies": { "@next/env": "16.3.5", "@swc/helpers": "0.5.23", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.5.23", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.3.5", "@next/swc-darwin-x64": "16.3.5", "@next/swc-linux-arm64-gnu": "16.3.5", "@next/swc-linux-arm64-musl": "16.3.5", "@next/swc-linux-x64-gnu": "16.3.5", "@next/swc-linux-x64-musl": "16.3.5", "@next/swc-win32-arm64-msvc": "16.3.5", "@next/swc-win32-x64-msvc": "16.3.5", "sharp": "^0.35.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-MdtsTgzyfCPRLC6uJ1mN8ao7lyJ4BB0U6Inhnx3gta1UcCIdHK3yxLG0E8OWQteWD8/Q0qb8A5o7wJaL8M9y2w=="],
973
+ "next": ["next@16.3.6", "", { "dependencies": { "@next/env": "16.3.6", "@swc/helpers": "0.5.23", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.5.23", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.3.6", "@next/swc-darwin-x64": "16.3.6", "@next/swc-linux-arm64-gnu": "16.3.6", "@next/swc-linux-arm64-musl": "16.3.6", "@next/swc-linux-x64-gnu": "16.3.6", "@next/swc-linux-x64-musl": "16.3.6", "@next/swc-win32-arm64-msvc": "16.3.6", "@next/swc-win32-x64-msvc": "16.3.6", "sharp": "^0.35.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-L+otWM/aQbYTx98aZhgEoMb4bZAXx1YVW4UMA/vuCyCoWG5HJyZUili8QAkqzrcC+5///tsz3s0M+SlyB5bLMw=="],
974
974
 
975
- "next-intl": ["next-intl@4.14.5", "", { "dependencies": { "@eloqnt/config": "^0.1.0", "@eloqnt/format-json": "^0.1.0", "@eloqnt/format-po": "^0.1.0", "@formatjs/intl-localematcher": "^0.8.1", "@parcel/watcher": "^2.4.1", "@swc/core": "~1.16.0", "icu-minify": "^4.14.5", "negotiator": "^1.0.0", "next-intl-swc-plugin-extractor": "4.14.5", "use-intl": "^4.14.5" }, "peerDependencies": { "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-9sPJh5ITJbP28HZ5obuFAMC4RwW/mhEvHiGVHXPWL0uRbF2RrjHWz8PcUmLaH2oca79ak2ayQz+uRSALZN9xSw=="],
975
+ "next-intl": ["next-intl@4.14.6", "", { "dependencies": { "@eloqnt/config": "^0.1.0", "@eloqnt/format-json": "^0.1.0", "@eloqnt/format-po": "^0.1.0", "@formatjs/intl-localematcher": "^0.8.1", "@parcel/watcher": "^2.4.1", "@swc/core": "~1.16.0", "icu-minify": "^4.14.6", "negotiator": "^1.0.0", "next-intl-swc-plugin-extractor": "4.14.6", "use-intl": "^4.14.6" }, "peerDependencies": { "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-YRsXs/zqfz1cw/Lw7phGwvRwG6jzjtFuRdWrQj13vwWKwNSj8y1FXD40KYmLnnANnWqcuWhc1RIL1s47c2sM0Q=="],
976
976
 
977
- "next-intl-swc-plugin-extractor": ["next-intl-swc-plugin-extractor@4.14.5", "", {}, "sha512-dbpsjHmwbqn795z7eDI7HHL+jxyvZ5CNF40sbGx+nkjM4pCs7HdTzGQnQ84mjF/WWZa/w9pJ6M74prh+3vnbGQ=="],
977
+ "next-intl-swc-plugin-extractor": ["next-intl-swc-plugin-extractor@4.14.6", "", {}, "sha512-0xchoaNMF8dZTZaXz5fYsxjiU0/YnyTSewNdicrxYJn3922QwSswApYQQGMOmKiZjE55aK2sGjUg7P1HPDgqZg=="],
978
978
 
979
979
  "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="],
980
980
 
@@ -986,7 +986,7 @@
986
986
 
987
987
  "oniguruma-to-es": ["oniguruma-to-es@4.3.6", "", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="],
988
988
 
989
- "oxc-parser": ["oxc-parser@0.150.0", "", { "dependencies": { "@oxc-project/types": "^0.150.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.150.0", "@oxc-parser/binding-android-arm64": "0.150.0", "@oxc-parser/binding-darwin-arm64": "0.150.0", "@oxc-parser/binding-darwin-x64": "0.150.0", "@oxc-parser/binding-freebsd-x64": "0.150.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.150.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.150.0", "@oxc-parser/binding-linux-arm64-gnu": "0.150.0", "@oxc-parser/binding-linux-arm64-musl": "0.150.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.150.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.150.0", "@oxc-parser/binding-linux-riscv64-musl": "0.150.0", "@oxc-parser/binding-linux-s390x-gnu": "0.150.0", "@oxc-parser/binding-linux-x64-gnu": "0.150.0", "@oxc-parser/binding-linux-x64-musl": "0.150.0", "@oxc-parser/binding-openharmony-arm64": "0.150.0", "@oxc-parser/binding-win32-arm64-msvc": "0.150.0", "@oxc-parser/binding-win32-ia32-msvc": "0.150.0", "@oxc-parser/binding-win32-x64-msvc": "0.150.0" } }, "sha512-zwajKw1GUa57IOdafIS7/yOObGF2NihwIfZfs5yJTRprMSkiwhWOc/k+n8bwnUPbHr2/XsjfBO8KyTPaW3VpWg=="],
989
+ "oxc-parser": ["oxc-parser@0.151.0", "", { "dependencies": { "@oxc-project/types": "^0.151.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.151.0", "@oxc-parser/binding-android-arm64": "0.151.0", "@oxc-parser/binding-darwin-arm64": "0.151.0", "@oxc-parser/binding-darwin-x64": "0.151.0", "@oxc-parser/binding-freebsd-x64": "0.151.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.151.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.151.0", "@oxc-parser/binding-linux-arm64-gnu": "0.151.0", "@oxc-parser/binding-linux-arm64-musl": "0.151.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.151.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.151.0", "@oxc-parser/binding-linux-riscv64-musl": "0.151.0", "@oxc-parser/binding-linux-s390x-gnu": "0.151.0", "@oxc-parser/binding-linux-x64-gnu": "0.151.0", "@oxc-parser/binding-linux-x64-musl": "0.151.0", "@oxc-parser/binding-openharmony-arm64": "0.151.0", "@oxc-parser/binding-win32-arm64-msvc": "0.151.0", "@oxc-parser/binding-win32-ia32-msvc": "0.151.0", "@oxc-parser/binding-win32-x64-msvc": "0.151.0" } }, "sha512-cX++XpBDCtSe52KKH3rhbh6xIRidYPpyB2reI3azD4l+Y0ci4JZiUgVXyM/r9rrMnYZf9gdWi+9fvFl1wol7nA=="],
990
990
 
991
991
  "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
992
992
 
@@ -1128,14 +1128,12 @@
1128
1128
 
1129
1129
  "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="],
1130
1130
 
1131
- "stitchkit": ["stitchkit@0.90.7", "", { "dependencies": { "ky": "^2.1.0" }, "peerDependencies": { "@modelcontextprotocol/ext-apps": "^1.7.2 || ^2.0.0", "@modelcontextprotocol/server": "^2.0.0", "@openrouter/ai-sdk-provider": "^3.1.0", "@opentelemetry/api": "^1.9.0", "@socket.io/bun-engine": "^0.1.2", "@socket.io/component-emitter": "^3.1.2", "@tanstack/react-query": ">=5", "@types/bun": "^1.4.2", "ai": "^7.0.107", "google-auth-library": "^11.1.0", "grammy": "^1.46.0", "maxmind": "^5.0.7", "react": ">=18", "react-query-kit": "^3.3.3", "socket.io": "^4.8.3", "socket.io-client": "^4.8.3", "srvx": "^0.12.5 || ^1.0.5", "zod": "^4.6.5" }, "optionalPeers": ["@modelcontextprotocol/ext-apps", "@modelcontextprotocol/server", "@openrouter/ai-sdk-provider", "@opentelemetry/api", "@socket.io/bun-engine", "@socket.io/component-emitter", "@tanstack/react-query", "@types/bun", "ai", "google-auth-library", "grammy", "maxmind", "react", "react-query-kit", "socket.io", "socket.io-client", "srvx"], "bin": { "stitchkit": "dist/upgrade-cli.js" } }, "sha512-My36iuzUc4FULJ26jIQK/czwY+uBy8MRh6AgbnvQNBIvo4fghuiINmN501uoJzeN7JM8v4J1C6fqjwA/XNxf/A=="],
1131
+ "stitchkit": ["stitchkit@0.95.3", "", { "dependencies": { "ky": "^2.1.0" }, "peerDependencies": { "@modelcontextprotocol/ext-apps": "^1.7.2 || ^2.0.0", "@modelcontextprotocol/server": "^2.0.0", "@openrouter/ai-sdk-provider": "^3.1.0", "@opentelemetry/api": "^1.9.0", "@socket.io/bun-engine": "^0.1.2", "@socket.io/component-emitter": "^3.1.2", "@tanstack/react-query": ">=5", "@types/bun": "^1.4.2", "ai": "^7.0.107", "google-auth-library": "^11.1.0", "grammy": "^1.46.0", "maxmind": "^5.0.7", "react": ">=18", "react-query-kit": "^3.3.3", "socket.io": "^4.8.3", "socket.io-client": "^4.8.3", "srvx": "^0.12.5 || ^1.0.5", "zod": "^4.6.5" }, "optionalPeers": ["@modelcontextprotocol/ext-apps", "@modelcontextprotocol/server", "@openrouter/ai-sdk-provider", "@opentelemetry/api", "@socket.io/bun-engine", "@socket.io/component-emitter", "@tanstack/react-query", "@types/bun", "ai", "google-auth-library", "grammy", "maxmind", "react", "react-query-kit", "socket.io", "socket.io-client", "srvx"], "bin": { "stitchkit": "dist/entrypoints/bin/upgrade-cli.js" } }, "sha512-IVIf7CF951Q4Olfiu+wONxAmc802zvPwGYWjNo+657OHua4gzc91XNo4/zmmPPZzkvA6iyOQmzFurgrbmJ9SrQ=="],
1132
1132
 
1133
1133
  "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
1134
1134
 
1135
1135
  "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "@babel/core": "*", "babel-plugin-macros": "*", "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" }, "optionalPeers": ["@babel/core", "babel-plugin-macros"] }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="],
1136
1136
 
1137
- "supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="],
1138
-
1139
1137
  "tailwind-merge": ["tailwind-merge@3.7.0", "", {}, "sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA=="],
1140
1138
 
1141
1139
  "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="],
@@ -1168,7 +1166,7 @@
1168
1166
 
1169
1167
  "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
1170
1168
 
1171
- "use-intl": ["use-intl@4.14.5", "", { "dependencies": { "@formatjs/fast-memoize": "^3.1.0", "@schummar/icu-type-parser": "1.21.5", "icu-minify": "^4.14.5", "intl-messageformat": "^11.1.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-NNGSInks18BAasPgnMrnahNkEZSkWpbWE70IcEDWPUZwS39tVuDB/Vo6J3FaDnYwwKioR33JfWFOzEFnhuJcJw=="],
1169
+ "use-intl": ["use-intl@4.14.6", "", { "dependencies": { "@formatjs/fast-memoize": "^3.1.0", "@schummar/icu-type-parser": "1.21.5", "icu-minify": "^4.14.6", "intl-messageformat": "^11.1.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-NZ2I5EPPh/SkdBE35/GTM5TWqtqZK1+R4ICZyW6OHupZHspqof61pNLAFVj1weAfuRzZjsy+0w3z2/AvO4qVIw=="],
1172
1170
 
1173
1171
  "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="],
1174
1172
 
@@ -35,6 +35,24 @@ test('calls the live backend through the typed contract client', async () => {
35
35
  }).toPass({ timeout: 5_000 });
36
36
  });
37
37
 
38
+ test('a note posted in one tab reaches another through the web origin and the socket', async ({
39
+ browser,
40
+ }) => {
41
+ // The browser's own origin carries HTTP (`/api` is forwarded by the web
42
+ // role) and the socket dials the API role; a post in one tab must reach a
43
+ // second tab that never asked for it. Both halves failed silently before:
44
+ // `/api` was a 404 on the web port, and the browser build had no socket.
45
+ const writer = await browser.newPage();
46
+ const reader = await browser.newPage();
47
+ await Promise.all([writer.goto('/en'), reader.goto('/en')]);
48
+ const note = `note ${Date.now()}`;
49
+ await writer.getByRole('textbox', { name: 'Note' }).fill(note);
50
+ await writer.getByRole('button', { name: 'Post' }).click();
51
+ await expect(writer.getByText(note)).toBeVisible();
52
+ await expect(reader.getByText(note)).toBeVisible({ timeout: 10_000 });
53
+ await Promise.all([writer.close(), reader.close()]);
54
+ });
55
+
38
56
  test('publishes complete page metadata', async ({ page }) => {
39
57
  await page.goto('/en/ui/themes');
40
58
  await expect(page).toHaveTitle(`Theme system · ${appDeclaration.identity.name}`);
@@ -7,7 +7,7 @@
7
7
  "packages/*"
8
8
  ],
9
9
  "catalog": {
10
- "stitchkit": "^0.90.7"
10
+ "stitchkit": "^0.95.3"
11
11
  },
12
12
  "overrides": {
13
13
  "@playwright/test": "1.63.0",
@@ -43,7 +43,7 @@
43
43
  "gen:declaration": "bun scripts/declaration.ts"
44
44
  },
45
45
  "dependencies": {
46
- "dotenv": "^18.0.1"
46
+ "dotenv": "^18.0.3"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@app/config": "workspace:*",
@@ -54,7 +54,7 @@
54
54
  "@playwright/test": "^1.63.0",
55
55
  "@types/bun": "^1.4.2",
56
56
  "@types/node": "^26.6.2",
57
- "oxc-parser": "^0.150.0",
57
+ "oxc-parser": "^0.151.0",
58
58
  "socket.io-client": "^4.8.3",
59
59
  "stitchkit": "catalog:",
60
60
  "typescript": "^7.0.2",
@@ -19,7 +19,7 @@
19
19
  "@modelcontextprotocol/server": "^2.0.0",
20
20
  "@prisma/adapter-pg": "^7.10.0",
21
21
  "@socket.io/bun-engine": "^0.1.2",
22
- "ai": "^7.0.107",
22
+ "ai": "^7.0.111",
23
23
  "socket.io": "^4.8.3",
24
24
  "stitchkit": "catalog:",
25
25
  "zod": "^4.6.5"
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "dependencies": {
18
18
  "@t3-oss/env-core": "^0.13.11",
19
- "dotenv": "^18.0.1",
19
+ "dotenv": "^18.0.3",
20
20
  "stitchkit": "catalog:",
21
21
  "zod": "^4.6.5"
22
22
  },
@@ -25,17 +25,17 @@
25
25
  "@radix-ui/react-tabs": "^1.1.21",
26
26
  "@radix-ui/react-tooltip": "^1.2.16",
27
27
  "@t3-oss/env-nextjs": "^0.13.11",
28
- "@tabler/icons-react": "^3.47.0",
29
- "@tanstack/react-query": "^5.103.1",
28
+ "@tabler/icons-react": "^3.48.0",
29
+ "@tanstack/react-query": "^5.103.2",
30
30
  "@tanstack/react-table": "^9.2.4",
31
31
  "@wrksz/themes": "^1.2.0",
32
32
  "class-variance-authority": "^0.7.1",
33
33
  "clsx": "^2.1.1",
34
34
  "date-fns": "^4.4.0",
35
- "dotenv": "^18.0.1",
36
- "framer-motion": "^13.4.0",
37
- "next": "^16.3.5",
38
- "next-intl": "^4.14.5",
35
+ "dotenv": "^18.0.3",
36
+ "framer-motion": "^13.4.1",
37
+ "next": "^16.3.6",
38
+ "next-intl": "^4.14.6",
39
39
  "react": "^19.3.0",
40
40
  "react-dom": "^19.3.0",
41
41
  "react-query-kit": "^3.3.4",
@@ -1,10 +1,10 @@
1
- import { internalApiUrl } from '@/lib/api/place';
1
+ import { env } from '@/env';
2
2
 
3
3
  /**
4
4
  * The default shape: the browser talks to its OWN origin, and the web role
5
- * forwards to the API role.
5
+ * forwards `/api/…` to the API role.
6
6
  *
7
- * This is what makes the example's client a plain module constant. A browser
7
+ * This is what makes the board's client a plain module constant. A browser
8
8
  * that dials the API role directly needs that role's public address, which is a
9
9
  * property of the place — so the address has to arrive from the server at
10
10
  * runtime, the client cannot exist until it does, and every call site pays for
@@ -13,9 +13,9 @@ import { internalApiUrl } from '@/lib/api/place';
13
13
  *
14
14
  * What it costs: one extra hop through the web role, and no WebSocket — a
15
15
  * route handler cannot proxy an upgrade. The realtime socket is therefore the
16
- * one place this example still needs the API role's address, or a routing layer
17
- * in front of both roles that serves them on one origin (see
18
- * `lib/api/cross-origin.ts`).
16
+ * one place the browser still needs the API role's address
17
+ * (`PUBLIC_REALTIME_ORIGIN`), or a routing layer in front of both roles that
18
+ * serves them on one origin.
19
19
  */
20
20
  export const dynamic = 'force-dynamic';
21
21
 
@@ -28,10 +28,18 @@ const FORWARDED_REQUEST_HEADERS = [
28
28
  const FORWARDED_RESPONSE_HEADERS = ['content-type', 'cache-control', 'etag'];
29
29
 
30
30
  async function forward(request: Request): Promise<Response> {
31
+ const apiUrl = env.INTERNAL_API_URL;
32
+ if (!apiUrl) {
33
+ // Said here, in words, rather than as a 404 from a route that is not there.
34
+ return Response.json(
35
+ { error: 'INTERNAL_API_URL is not set, so the web role cannot reach the API role' },
36
+ { status: 503 },
37
+ );
38
+ }
31
39
  const incoming = new URL(request.url);
32
40
  // Rebuilt from the incoming pathname rather than from the matched segments,
33
41
  // so an encoded segment reaches the API role exactly as it arrived.
34
- const target = new URL(`${incoming.pathname}${incoming.search}`, internalApiUrl());
42
+ const target = new URL(`${incoming.pathname}${incoming.search}`, apiUrl);
35
43
 
36
44
  const headers = new Headers();
37
45
  for (const name of FORWARDED_REQUEST_HEADERS) {
@@ -27,6 +27,10 @@ let shared: ReturnType<typeof connect> | undefined;
27
27
  function connect(realtimeOrigin?: string) {
28
28
  const realtime = createRealtimeClient(liveContract, {
29
29
  url: realtimeOrigin ?? window.location.origin,
30
+ // The literal loader is what puts the socket client into this bundle.
31
+ // Stitchkit's own import of the peer is left alone by bundlers on purpose,
32
+ // so without this line the browser build has no `socket.io-client` in it.
33
+ peers: { client: () => import('socket.io-client') },
30
34
  });
31
35
  realtime.connect();
32
36
  return {
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "@openrouter/ai-sdk-provider": "^3.1.0",
20
- "ai": "^7.0.107",
20
+ "ai": "^7.0.111",
21
21
  "stitchkit": "file:../../../core",
22
22
  "stitchkit-tui": "file:../../../tui",
23
23
  "zod": "4.6.5"