1 Commits

Author SHA1 Message Date
Devin Zuczek e62cb19b97 [rooms] role refactor 2026-09-03 11:56:18 -04:00
51 changed files with 869 additions and 1603 deletions
-5
View File
@@ -87,11 +87,6 @@ RECFLARE_DOMAIN=rec.example.com
# RECFLARE_MAX_ROOMS_PER_ACCOUNT=10 # RECFLARE_MAX_ROOMS_PER_ACCOUNT=10
# RECFLARE_MAX_CLUBS_PER_ACCOUNT=10 # RECFLARE_MAX_CLUBS_PER_ACCOUNT=10
# Largest binary the storage worker accepts in one upload, in bytes. The default is
# 64 MiB. The endpoint rejects larger files with HTTP 413 before writing to R2. This
# value must be a positive integer; zero or an invalid value restores the default.
# RECFLARE_MAX_UPLOAD_BYTES=67108864
# Rooms to switch out at matchmake time (`match`), as comma-separated <fromRoomId>=<to> # Rooms to switch out at matchmake time (`match`), as comma-separated <fromRoomId>=<to>
# pairs, where <to> is a room id or room name. This is how a stock RRO room is replaced # pairs, where <to> is a room id or room name. This is how a stock RRO room is replaced
# with your own: 2=MyHub sends everyone who matchmakes into the Rec Center (room 2) to the # with your own: 2=MyHub sends everyone who matchmakes into the Rec Center (room 2) to the
+10 -11
View File
@@ -193,17 +193,16 @@ the same `.env` you already created. `.env.example` carries each one commented o
its built-in default: copy the lines you want to change into your `.env`, uncomment them, its built-in default: copy the lines you want to change into your `.env`, uncomment them,
edit the value, then re-deploy the worker that reads them. edit the value, then re-deploy the worker that reads them.
| `.env` variable | Read by | Default | What it does | | `.env` variable | Read by | Default | What it does |
| --------------------------------------- | --------- | ---------- | -------------------------------------------------------------- | | --------------------------------------- | ------- | ------- | -------------------------------------------------------------- |
| `RECFLARE_MAX_ACCOUNTS_PER_PLATFORM_ID` | `auth` | `3` | Accounts one Steam-verified identity may create. `0` disables. | | `RECFLARE_MAX_ACCOUNTS_PER_PLATFORM_ID` | `auth` | `3` | Accounts one Steam-verified identity may create. `0` disables. |
| `RECFLARE_MAX_ACCOUNTS_PER_IP` | `auth` | `3` | Accounts one signup IP may create. `0` disables. | | `RECFLARE_MAX_ACCOUNTS_PER_IP` | `auth` | `3` | Accounts one signup IP may create. `0` disables. |
| `RECFLARE_STARTING_TOKENS` | `econ` | `10000` | RecCenterTokens a new player is granted. | | `RECFLARE_STARTING_TOKENS` | `econ` | `10000` | RecCenterTokens a new player is granted. |
| `RECFLARE_MAX_UPLOAD_BYTES` | `storage` | `67108864` | Maximum binary upload size; larger files receive HTTP 413. | | `RECFLARE_ROOM_REDIRECTS` | `match` | unset | Rooms to switch out on matchmake, e.g. `2=MyHub`. |
| `RECFLARE_ROOM_REDIRECTS` | `match` | unset | Rooms to switch out on matchmake, e.g. `2=MyHub`. | | `RECFLARE_PHOTON_REALTIME_APP_ID` | `match` | empty | Your Photon Realtime app id. No app ships with recflare. |
| `RECFLARE_PHOTON_REALTIME_APP_ID` | `match` | empty | Your Photon Realtime app id. No app ships with recflare. | | `RECFLARE_PHOTON_VOICE_APP_ID` | `match` | empty | Your Photon Voice app id. |
| `RECFLARE_PHOTON_VOICE_APP_ID` | `match` | empty | Your Photon Voice app id. | | `RECFLARE_PHOTON_CHAT_APP_ID` | `match` | empty | Your Photon Chat app id. |
| `RECFLARE_PHOTON_CHAT_APP_ID` | `match` | empty | Your Photon Chat app id. | | `RECFLARE_PHOTON_REGION` | `match` | `us` | Photon region every session is pinned to. |
| `RECFLARE_PHOTON_REGION` | `match` | `us` | Photon region every session is pinned to. |
Then deploy just the worker that reads it: Then deploy just the worker that reads it:
+2 -2
View File
@@ -20,7 +20,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -32,6 +32,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+7 -32
View File
@@ -149,15 +149,6 @@ describe('auth-gated endpoints', () => {
expect(res.status).toBe(401) expect(res.status).toBe(401)
}) })
test('GET /account/me rejects a signed token with a non-canonical account subject', async () => {
for (const sub of ['42junk', '42.5', '042', '-42', '9007199254740992']) {
const res = await exports.default.fetch(`${ORIGIN}/account/me`, {
headers: await bearer(sub),
})
expect(res.status, sub).toBe(401)
}
})
test('GET /account/me returns the self account with a valid token', async () => { test('GET /account/me returns the self account with a valid token', async () => {
const res = await exports.default.fetch(`${ORIGIN}/account/me`, { headers: await bearer() }) const res = await exports.default.fetch(`${ORIGIN}/account/me`, { headers: await bearer() })
expect(res.status).toBe(200) expect(res.status).toBe(200)
@@ -169,7 +160,7 @@ describe('auth-gated endpoints', () => {
username: 'Player42', username: 'Player42',
personalPronouns: 0, personalPronouns: 0,
identityFlags: 0, identityFlags: 0,
availableUsernameChanges: 3, availableUsernameChanges: 1,
// An unset email is "", not null — the client reads it as a string, and the // An unset email is "", not null — the client reads it as a string, and the
// hub frame this DTO also rides drops null values outright. // hub frame this DTO also rides drops null values outright.
email: '', email: '',
@@ -244,7 +235,7 @@ describe('auth-gated endpoints', () => {
expect(body.value).toBe('') expect(body.value).toBe('')
}) })
test('PUT /account/me/username allows three changes, decrements the counter, then blocks', async () => { test('PUT /account/me/username changes the name, decrements the counter, then blocks', async () => {
const headers = { const headers = {
...(await bearer('892')), ...(await bearer('892')),
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
@@ -269,27 +260,11 @@ describe('auth-gated endpoints', () => {
await exports.default.fetch(`${ORIGIN}/account/me`, { headers: await bearer('892') }) await exports.default.fetch(`${ORIGIN}/account/me`, { headers: await bearer('892') })
).json()) as { username: string; availableUsernameChanges: number } ).json()) as { username: string; availableUsernameChanges: number }
expect(me.username).toBe('coachx') expect(me.username).toBe('coachx')
expect(me.availableUsernameChanges).toBe(2) expect(me.availableUsernameChanges).toBe(0)
// The second and third changes consume the rest of the account's allowance. // A second change is blocked — no changes remaining (still HTTP 200).
for (const username of ['coachy', 'coachz']) {
const changed = await exports.default.fetch(`${ORIGIN}/account/me/username`, {
...form({ username }),
headers,
})
expect(changed.status).toBe(200)
expect(((await changed.json()) as { success: boolean }).success).toBe(true)
}
const exhausted = (await (
await exports.default.fetch(`${ORIGIN}/account/me`, { headers: await bearer('892') })
).json()) as { username: string; availableUsernameChanges: number }
expect(exhausted.username).toBe('coachz')
expect(exhausted.availableUsernameChanges).toBe(0)
// A fourth change is blocked — no changes remaining (still HTTP 200).
const blocked = await exports.default.fetch(`${ORIGIN}/account/me/username`, { const blocked = await exports.default.fetch(`${ORIGIN}/account/me/username`, {
...form({ username: 'coachq' }), ...form({ username: 'coachy' }),
headers, headers,
}) })
expect(blocked.status).toBe(200) expect(blocked.status).toBe(200)
@@ -590,12 +565,12 @@ describe('name, email and bio validation', () => {
expect(body.value).toBe('') expect(body.value).toBe('')
} }
// A rationed change must NOT be spent by a refusal: an account starts with three, // The rationed change must NOT be spent by a refusal: an account starts with one,
// and burning it on a typo would leave the player stuck with a name they never had. // and burning it on a typo would leave the player stuck with a name they never had.
const me = (await ( const me = (await (
await exports.default.fetch(`${ORIGIN}/account/me`, { headers: await bearer('8801') }) await exports.default.fetch(`${ORIGIN}/account/me`, { headers: await bearer('8801') })
).json()) as { availableUsernameChanges: number } ).json()) as { availableUsernameChanges: number }
expect(me.availableUsernameChanges).toBe(3) expect(me.availableUsernameChanges).toBe(1)
// 50 is the client's own cap, so a name that long has to be accepted. // 50 is the client's own cap, so a name that long has to be accepted.
const ok = await exports.default.fetch(`${ORIGIN}/account/me/username`, { const ok = await exports.default.fetch(`${ORIGIN}/account/me/username`, {
+2 -2
View File
@@ -19,7 +19,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -31,6 +31,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -22,7 +22,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -34,6 +34,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+9 -27
View File
@@ -4,7 +4,6 @@ import { describeRoute } from 'hono-openapi'
import { import {
CURRENT_OUTFIT_SLOT, CURRENT_OUTFIT_SLOT,
getOutfit, getOutfit,
getOutfits,
getOutfitsByAccounts, getOutfitsByAccounts,
inventionDescriptionRejection, inventionDescriptionRejection,
inventionLongDescriptionRejection, inventionLongDescriptionRejection,
@@ -1022,46 +1021,29 @@ export const avatarRoutes = new Hono<App>({ strict: false })
} }
) )
// The caller's outfit wardrobe — every slot they have saved, ordered by slot. The same // The caller's outfit wardrobe. An empty list for now — the outfits saved through
// read as `econ`'s `GET /api/avatar/v3/saved`, on the bare path the newer client uses: // `PUT /outfits/me` are in the shared `outfit` table already, but which of them
// both worker's write paths land in the shared `outfit` table, so both list endpoints // belong in this list (and in what shape) has not been pinned down, so it answers []
// serve the same rows. // rather than guessing.
//
// Slot 0 is INCLUDED. It is the outfit being worn (what `/outfits/me` reads), but it is
// also a saved slot: the newer client picks the slot it saves into (`/api/avatar/v4/saved/set`
// 400s without one), so filtering slot 0 out would hide a real saved outfit whenever a
// wardrobe entry lands there. Showing the worn outfit as a wardrobe entry is the cheaper
// mistake of the two.
//
// Rows are served exactly as they were stored, unprojected — see the note atop
// `outfits-db.ts`: econ's saved slots hold the old flat PascalCase outfit while
// `/outfits/me` holds the newer envelope, and neither is converted into the other.
.get( .get(
'/outfits/me/saved', '/outfits/me/saved',
describeRoute({ describeRoute({
tags: ['Avatar', '2025'], tags: ['Avatar', '2025'],
summary: 'The callers saved outfits', summary: 'The callers saved outfits',
description: description:
'The wardrobe behind the newer outfit screen: every slot the caller has saved, ' + 'The wardrobe behind the newer outfit screen. Empty for now: the outfits saved ' +
'ordered by slot, and `[]` when they have saved none. The same rows `econ`s ' + 'through `PUT /outfits/me` are in the shared `outfit` table, but which of them this ' +
'`GET /api/avatar/v3/saved` serves — both write paths land in the shared `outfit` ' + 'list should carry, and in what shape, is not pinned down yet.',
'table.\n\n' +
'Slot 0 is included. It is the outfit being worn (what `GET /outfits/me` reads) but ' +
'it is a saved slot too, and the client chooses the slot it saves into, so omitting ' +
'it would hide a real outfit whenever a wardrobe entry lands there.\n\n' +
'Each outfit is served exactly as it was stored, unprojected: slots written through ' +
'`PUT /outfits/me` hold the newer envelope while `econ`s saved-set slots hold the ' +
'old flat shape, and neither is converted into the other.',
security: AUTHED, security: AUTHED,
responses: { responses: {
200: json(JsonArray, 'The saved outfits, ordered by slot (empty when none)'), 200: json(JsonArray, 'An empty list'),
401: UNAUTHORIZED_RESPONSE, 401: UNAUTHORIZED_RESPONSE,
}, },
}), }),
async (c) => { async (c) => {
const id = await authedId(c) const id = await authedId(c)
if (id === null) return unauthorized(c) if (id === null) return unauthorized(c)
return c.json(await getOutfits(c.env.DB, id)) return c.json([])
} }
) )
+6 -49
View File
@@ -1566,58 +1566,15 @@ describe('public endpoints', () => {
expect(((await worn.json()) as { Name: string | null }).Name).toBe(null) expect(((await worn.json()) as { Name: string | null }).Name).toBe(null)
}) })
test('GET /outfits/me/saved lists every saved slot, ordered by slot', async () => { test('GET /outfits/me/saved 401s without a token, returns [] with one', async () => {
const anon = await exports.default.fetch(`${ORIGIN}/outfits/me/saved`) const anon = await exports.default.fetch(`${ORIGIN}/outfits/me/saved`)
expect(anon.status).toBe(401) expect(anon.status).toBe(401)
// Empty even for account 42, which saved an outfit through PUT /outfits/me above.
// A distinct account, so this doesn't depend on what the tests above saved for 42. const res = await exports.default.fetch(`${ORIGIN}/outfits/me/saved`, {
const saved = async (sub: string) => { headers: await bearer(),
const res = await exports.default.fetch(`${ORIGIN}/outfits/me/saved`, {
headers: await bearer(sub),
})
expect(res.status).toBe(200)
return (await res.json()) as Array<Record<string, unknown>>
}
// A player who has never saved gets [], not the empty-outfit envelope `/outfits/me`
// serves — an empty wardrobe is an empty list.
expect(await saved('4242')).toEqual([])
const outfit = (slot: number, name: string | null) => ({
DataVersion: 2,
LegacyData: {
SelectionsV1: '193a3bf9-abc0-4d78-8d63-92046908b1c5,,0',
SelectionsV2: '{"selections":[]}',
FaceFeatures: '{"ver":7}',
SkinColor: 'Dc6StLFk60u5iUTrb3_C3w',
HairColor: 'UAT0OaWEkUG-mWDIyiX1Kg',
},
CustomizationSettings: '{"AvatarVersion":2,"AvatarBodyType":0}',
Selections: [],
Slot: slot,
Name: name,
Accessibility: 1,
ThumbnailFileName: null,
}) })
expect(res.status).toBe(200)
// Saved out of order, to prove the list is ordered by slot rather than by write time. expect(await res.json()).toEqual([])
for (const [slot, name] of [
[2, 'two'],
[0, null],
] as Array<[number, string | null]>) {
await exports.default.fetch(`${ORIGIN}/outfits/me`, {
method: 'PUT',
headers: { ...(await bearer('4242')), 'content-type': 'application/json' },
body: JSON.stringify(outfit(slot, name)),
})
}
// Slot 0 is in the list: it is the outfit being worn, but it is a saved slot too, and
// the client picks the slot it writes. Each row comes back verbatim.
expect(await saved('4242')).toEqual([outfit(0, null), outfit(2, 'two')])
// Another account's wardrobe is its own.
expect(await saved('4343')).toEqual([])
}) })
test('POST /outfits/bulk serves each accounts worn outfit, keyed by id', async () => { test('POST /outfits/bulk serves each accounts worn outfit, keyed by id', async () => {
+2 -2
View File
@@ -21,7 +21,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -33,6 +33,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -16,7 +16,7 @@
}, },
"dependencies": { "dependencies": {
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"hono": "4.13.5", "hono": "4.12.27",
"workers-tagged-logger": "1.0.1" "workers-tagged-logger": "1.0.1"
}, },
"devDependencies": { "devDependencies": {
@@ -25,6 +25,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -19,7 +19,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -31,6 +31,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -21,7 +21,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -33,6 +33,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -21,7 +21,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -33,6 +33,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -18,7 +18,7 @@
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -30,6 +30,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
-3
View File
@@ -5,9 +5,6 @@
"compatibility_date": "2026-06-16", "compatibility_date": "2026-06-16",
"compatibility_flags": ["nodejs_compat"], "compatibility_flags": ["nodejs_compat"],
"upload_source_maps": true, "upload_source_maps": true,
"cache": {
"enabled": true
},
"observability": { "observability": {
"logs": { "logs": {
"enabled": true, "enabled": true,
+2 -2
View File
@@ -16,7 +16,7 @@
}, },
"dependencies": { "dependencies": {
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"hono": "4.13.5", "hono": "4.12.27",
"workers-tagged-logger": "1.0.1" "workers-tagged-logger": "1.0.1"
}, },
"devDependencies": { "devDependencies": {
@@ -25,6 +25,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -18,7 +18,7 @@
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -30,6 +30,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -22,7 +22,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -34,6 +34,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+16 -58
View File
@@ -504,45 +504,24 @@ function toAvatarV2Dto(avatar: Avatar) {
} }
/** /**
* A storefront catalog entry's `GiftDrop` (`static/storefronts/sf{N}.json`) — what a store * The subset of a storefront catalog (`static/storefronts/sf{N}.json`) that `buyItem`
* item hands over. Field-for-field the client's own `GiftDrop` class, in its declared * reads: each store item carries the `GiftDrop` describing what you get, a list of
* order, so a name here is a name the client reads. * `Prices` per currency, and optionally `SubscriberPrices` — the discounted list a Rec Room
* * Plus subscriber is shown and pays. The catalogs hold more fields (IsFeatured, …) that
* REQUIRED vs OPTIONAL is about what this server produces, not what the client declares: * the purchase path doesn't need.
* the required eleven are the ones every drop-building helper here sets (a game reward, a
* level-up box, a challenge gift — see {@link toGameRewardDrop} and friends), and they are
* the only ones the purchase and roll paths read. The rest are optional because nothing
* here synthesizes one, whether or not a captured catalog carries it — `GiftDropId`,
* `Unique`, `SubscribersOnly`, `ItemSetId` and `ItemSetFriendlyName` are on all 5,875
* captured entries, while `TagList`, `CustomAvatarItemId`, `AvatarItemId`,
* `EquipmentItemId` and `ThumbnailImageName` are on none of them.
*
* The store item around it carries `Prices` per currency and optionally `SubscriberPrices`
* — the discounted list a Rec Room Plus subscriber is shown and pays. Both hold more
* fields (IsFeatured, …) the purchase path doesn't need.
*/ */
interface StoreGiftDrop { interface StoreGiftDrop {
/**
* The drop's own id. Every captured entry has it equal to the item's
* `PurchasableItemId`, which is why the paths that need one (a weekly gift, a skin)
* take it off there instead of from here.
*/
GiftDropId?: number
FriendlyName: string FriendlyName: string
/** Tooltip: string
* NULL on 23 captured entries — the client's field is a plain string, but the catalogs
* keep null and `""` apart, so a reader passing it on has to collapse it (`?? ''`).
*/
Tooltip: string | null
/** Not on any captured entry; nothing here reads or sets one. */
TagList?: string
ConsumableItemDesc: string ConsumableItemDesc: string
AvatarItemDesc: string AvatarItemDesc: string
/** A UGC item's guid. Not on any captured entry — the captures predate them. */
CustomAvatarItemId?: string | null
AvatarItemType: number | null AvatarItemType: number | null
EquipmentPrefabName: string EquipmentPrefabName: string
EquipmentModificationGuid: string EquipmentModificationGuid: string
Rarity: number
Context: number
Currency: number
CurrencyType: number
/** /**
* A QUERY drop — a loot box rather than an item. Its item fields are all empty on * A QUERY drop — a loot box rather than an item. Its item fields are all empty on
* purpose: what the player gets is rolled at grant time from everything of the target * purpose: what the player gets is rolled at grant time from everything of the target
@@ -551,37 +530,16 @@ interface StoreGiftDrop {
* random 4-star item that you don't have." * random 4-star item that you don't have."
*/ */
IsQuery?: boolean IsQuery?: boolean
/** Whether the player may hold only one. Nothing here enforces it. */
Unique?: boolean
/** Whether only a Rec Room Plus subscriber may buy it. Nothing here enforces it. */
SubscribersOnly?: boolean
Rarity: number
CurrencyType: number
Currency: number
Context: number
/** The set the item belongs to; null on 92 captured entries. */
ItemSetId?: number | null
ItemSetFriendlyName?: string
/** Catalog ids for the item the drop carries. Not on any captured entry. */
AvatarItemId?: number | null
EquipmentItemId?: number | null
/** Not on any captured entry; the client falls back to the item's own thumbnail. */
ThumbnailImageName?: string
// ---- Not part of the client's class -------------------------------------
/** /**
* The rarity a query drop rolls at, when it differs from the box's own `Rarity`. The * The rarity a query drop rolls at, when it differs from the box's own `Rarity`. The
* sf2 boxes carry both and they agree; sf3's don't carry it at all, hence the fallback * sf2 boxes carry both and they agree; sf3's don't carry it at all, hence the fallback
* to `Rarity`. The client's `GiftDrop` has no such field — it is the catalog's, and * to `Rarity`.
* only this server reads it.
*/ */
QueryRedirectRarity?: number QueryRedirectRarity?: number
/** /**
* XP the drop pays out. Ours, not the client's and not any catalog's — a bought item is * XP the drop pays out. No storefront catalog sets it — a bought item is an item — but a
* an item, but a game reward is XP in a gift box, so the box and its notification carry * game reward is XP in a gift box, so the box and its notification carry the amount from
* the amount from here. The XP itself is banked in `progression`, not read back off the * here. The XP itself is banked in `progression`, not read back off the box.
* box.
*/ */
Xp?: number Xp?: number
} }
@@ -857,7 +815,7 @@ function toAvatarItem(giftDrop: StoreGiftDrop): AvatarItem {
AvatarItemDesc: giftDrop.AvatarItemDesc, AvatarItemDesc: giftDrop.AvatarItemDesc,
PlatformMask: -1, PlatformMask: -1,
FriendlyName: giftDrop.FriendlyName, FriendlyName: giftDrop.FriendlyName,
Tooltip: giftDrop.Tooltip ?? '', Tooltip: giftDrop.Tooltip,
Rarity: giftDrop.Rarity, Rarity: giftDrop.Rarity,
} }
} }
@@ -868,7 +826,7 @@ function toEquipment(giftDrop: StoreGiftDrop): Equipment {
ModificationGuid: giftDrop.EquipmentModificationGuid, ModificationGuid: giftDrop.EquipmentModificationGuid,
PrefabName: giftDrop.EquipmentPrefabName, PrefabName: giftDrop.EquipmentPrefabName,
FriendlyName: giftDrop.FriendlyName, FriendlyName: giftDrop.FriendlyName,
Tooltip: giftDrop.Tooltip ?? '', Tooltip: giftDrop.Tooltip,
Rarity: giftDrop.Rarity, Rarity: giftDrop.Rarity,
PlatformMask: -1, PlatformMask: -1,
Favorited: false, Favorited: false,
+2 -2
View File
@@ -20,7 +20,7 @@
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -32,6 +32,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -21,7 +21,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -33,6 +33,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -16,7 +16,7 @@
}, },
"dependencies": { "dependencies": {
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"hono": "4.13.5", "hono": "4.12.27",
"workers-tagged-logger": "1.0.1" "workers-tagged-logger": "1.0.1"
}, },
"devDependencies": { "devDependencies": {
@@ -25,6 +25,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -19,7 +19,7 @@
"@repo/domain": "workspace:*", "@repo/domain": "workspace:*",
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -31,6 +31,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -21,7 +21,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -33,6 +33,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -16,7 +16,7 @@
}, },
"dependencies": { "dependencies": {
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"hono": "4.13.5", "hono": "4.12.27",
"workers-tagged-logger": "1.0.1" "workers-tagged-logger": "1.0.1"
}, },
"devDependencies": { "devDependencies": {
@@ -25,6 +25,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -19,7 +19,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -31,6 +31,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -17,7 +17,7 @@
"dependencies": { "dependencies": {
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"hono": "4.13.5", "hono": "4.12.27",
"workers-tagged-logger": "1.0.1" "workers-tagged-logger": "1.0.1"
}, },
"devDependencies": { "devDependencies": {
@@ -26,6 +26,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -16,7 +16,7 @@
}, },
"dependencies": { "dependencies": {
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"hono": "4.13.5", "hono": "4.12.27",
"workers-tagged-logger": "1.0.1" "workers-tagged-logger": "1.0.1"
}, },
"devDependencies": { "devDependencies": {
@@ -25,6 +25,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+2 -2
View File
@@ -17,7 +17,7 @@
"dependencies": { "dependencies": {
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"hono": "4.13.5", "hono": "4.12.27",
"workers-tagged-logger": "1.0.1" "workers-tagged-logger": "1.0.1"
}, },
"devDependencies": { "devDependencies": {
@@ -26,6 +26,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
-7
View File
@@ -10,18 +10,11 @@ Player-settings worker served on the `playersettings` subdomain.
`key=…&value=…` (or a JSON `{key,value}` / array) and **upserts** it into the `key=…&value=…` (or a JSON `{key,value}` / array) and **upserts** it into the
player's settings, keyed by the `sub` claim of the Bearer JWT. Returns `200`. player's settings, keyed by the `sub` claim of the Bearer JWT. Returns `200`.
Persisted in Workers KV (`RECFLARE_PLAYER_SETTINGS`, key `player:<id>`). Persisted in Workers KV (`RECFLARE_PLAYER_SETTINGS`, key `player:<id>`).
- `DELETE /playersettings``[Authorize]`. Removes a setting from the player's
map. The client sends a bare form-urlencoded `key=PlayerShoppingBagId` (no
`value`); a JSON body and a `?key=` query param are also read. Deleting a key
that isn't stored is a no-op `200`, not a `404`.
> A full settings PUT would replace the player's _entire_ settings set on each > A full settings PUT would replace the player's _entire_ settings set on each
> call; we merge instead, so a single-key PUT (e.g. `key=PlayerSessionCount`) > call; we merge instead, so a single-key PUT (e.g. `key=PlayerSessionCount`)
> doesn't wipe the others. > doesn't wipe the others.
> Emptying the map with DELETE puts the player back to a first read: the next
> `GET` re-seeds the defaults.
## KV namespace ## KV namespace
```sh ```sh
+2 -2
View File
@@ -19,7 +19,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -31,6 +31,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
-20
View File
@@ -103,23 +103,3 @@ export const SettingJsonWrite = z.union([
}) })
), ),
]) ])
/**
* The form-encoded delete the client actually sends: a bare `key=PlayerShoppingBagId`,
* with no `value`. An empty `key` is ignored.
*/
export const SettingFormDelete = z.object({
key: z.string().describe('The setting name to remove; an empty key is ignored'),
})
/**
* The JSON form of the same delete. Accepted as a bare setting name, a `{ key }` /
* `{ Key }` object, or an array of either.
*/
export const SettingJsonDelete = z.union([
z.string(),
z.object({ key: z.string().optional(), Key: z.string().optional() }),
z.array(
z.union([z.string(), z.object({ key: z.string().optional(), Key: z.string().optional() })])
),
])
+1 -95
View File
@@ -12,9 +12,7 @@ import {
HealthResponse, HealthResponse,
json, json,
PlayerSettingEntry, PlayerSettingEntry,
SettingFormDelete,
SettingFormWrite, SettingFormWrite,
SettingJsonDelete,
SettingJsonWrite, SettingJsonWrite,
UNAUTHORIZED_RESPONSE, UNAUTHORIZED_RESPONSE,
} from './openapi' } from './openapi'
@@ -28,7 +26,7 @@ import type { App } from './context'
* (`player:{id}`); a player with nothing stored is seeded with the reference defaults on * (`player:{id}`); a player with nothing stored is seeded with the reference defaults on
* their first read. * their first read.
* *
* Every `/playersettings` route is auth-gated on the Bearer JWT issued by the `auth` worker. * Both routes are auth-gated on the Bearer JWT issued by the `auth` worker.
*/ */
/** /**
@@ -80,45 +78,6 @@ async function parseSettings(c: Context<App>): Promise<Array<{ key: string; valu
return key ? [{ key, value }] : [] return key ? [{ key, value }] : []
} }
/**
* Pull the setting name(s) to remove out of a DELETE body. The client sends a bare
* form-urlencoded `key=PlayerShoppingBagId` — with no `value`, and (unlike its PUTs) not
* always a `content-type` Hono's body parser recognises on a DELETE, so an unparsed body
* is re-read as raw text. A JSON body is accepted too, as a bare string, a `{ key }`
* object, or an array of either. Blank names are dropped.
*/
async function parseDeleteKeys(c: Context<App>): Promise<string[]> {
const contentType = c.req.header('content-type') ?? ''
if (contentType.includes('application/json')) {
const body = await c.req.json<unknown>().catch(() => null)
const list = Array.isArray(body) ? body : body == null ? [] : [body]
return list
.map((o) => {
if (typeof o === 'string') return o
const rec = o as Record<string, unknown>
const key = rec.key ?? rec.Key
return typeof key === 'string' ? key : ''
})
.filter((k) => k !== '')
}
// Pick ONE read of the body from the content-type: Hono's parser only recognises the
// form types, and re-reading as text after it has cached a FormData re-serialises the
// body as multipart, so trying both in turn parses garbage.
let key = ''
if (contentType.includes('form-data') || contentType.includes('x-www-form-urlencoded')) {
const form = await c.req.parseBody().catch(() => ({}) as Record<string, unknown>)
if (typeof form.key === 'string') key = form.key
} else {
key = new URLSearchParams(await c.req.text().catch(() => '')).get('key') ?? ''
}
// Last resort, for a client that hangs the name off the URL instead.
if (key === '') key = c.req.query('key') ?? ''
return key ? [key] : []
}
const app = new Hono<App>() const app = new Hono<App>()
.use( .use(
'*', '*',
@@ -221,59 +180,6 @@ const app = new Hono<App>()
} }
) )
// Remove a setting from the caller's map. The client sends `key=PlayerShoppingBagId`
// when it drops a value it no longer wants defaulted (a stale shopping bag id, say)
// rather than writing an empty string over it.
.delete(
'/playersettings',
describeRoute({
tags: ['Player Settings'],
summary: 'Delete a player setting',
description: [
'Removes the named setting(s) from the callers KV map. The client sends a bare',
'form-urlencoded `key=PlayerShoppingBagId` (no `value`); a JSON body — a string, a',
'`{ key }` object, or an array of either — and a `?key=` query param are also read.',
'Deleting a key that isnt stored, or sending nothing to delete, is a no-op 200, not a',
'404. Empty body on success.',
'',
'Note that emptying the map entirely puts the player back to a first read: the next',
'`GET` re-seeds the defaults.',
].join(' '),
security: AUTHED,
requestBody: formOrJson(SettingFormDelete, SettingJsonDelete, 'The setting(s) to remove'),
responses: {
200: { description: 'Removed, or nothing to remove (empty body)' },
401: UNAUTHORIZED_RESPONSE,
},
}),
async (c) => {
const id = await authedId(c)
if (id === null) return unauthorized(c)
const keys = await parseDeleteKeys(c)
if (keys.length === 0) return c.body(null, 200)
const kvKey = `player:${id}`
const existing = await c.env.RECFLARE_PLAYER_SETTINGS.get<Record<string, string>>(
kvKey,
'json'
)
if (!existing) return c.body(null, 200)
const remaining = { ...existing }
let removed = false
for (const key of keys) {
if (key in remaining) {
delete remaining[key]
removed = true
}
}
if (removed) await c.env.RECFLARE_PLAYER_SETTINGS.put(kvKey, JSON.stringify(remaining))
return c.body(null, 200)
}
)
// The generated spec. Documentation only — no request is validated against it (see // The generated spec. Documentation only — no request is validated against it (see
// openapi.ts). `hide: true` keeps this route out of its own output. // openapi.ts). `hide: true` keeps this route out of its own output.
app.get( app.get(
@@ -53,17 +53,6 @@ function putForm(
} }
} }
function deleteForm(
fields: Record<string, string>,
headers: Record<string, string> = {}
): RequestInit {
return {
method: 'DELETE',
headers: { 'Content-Type': 'application/x-www-form-urlencoded', ...headers },
body: new URLSearchParams(fields).toString(),
}
}
describe('playersettings endpoints', () => { describe('playersettings endpoints', () => {
it('GET / reports service status', async () => { it('GET / reports service status', async () => {
const res = await SELF.fetch(`${ORIGIN}/`) const res = await SELF.fetch(`${ORIGIN}/`)
@@ -145,80 +134,6 @@ describe('playersettings endpoints', () => {
expect(res.status).toBe(200) expect(res.status).toBe(200)
}) })
it('DELETE /playersettings 401s without a token', async () => {
const res = await SELF.fetch(
`${ORIGIN}/playersettings`,
deleteForm({ key: 'PlayerShoppingBagId' })
)
expect(res.status).toBe(401)
})
it('DELETE /playersettings removes the named key and leaves the rest', async () => {
await SELF.fetch(
`${ORIGIN}/playersettings`,
putForm({ key: 'PlayerShoppingBagId', value: 'bag-1' }, await bearer('20'))
)
await SELF.fetch(
`${ORIGIN}/playersettings`,
putForm({ key: 'PlayerSessionCount', value: '3' }, await bearer('20'))
)
const res = await SELF.fetch(
`${ORIGIN}/playersettings`,
deleteForm({ key: 'PlayerShoppingBagId' }, await bearer('20'))
)
expect(res.status).toBe(200)
const stored = await env.RECFLARE_PLAYER_SETTINGS.get<Record<string, string>>(
'player:20',
'json'
)
expect(stored).toEqual({ PlayerSessionCount: '3' })
})
it('DELETE /playersettings reads a body with no content-type', async () => {
await SELF.fetch(
`${ORIGIN}/playersettings`,
putForm({ key: 'PlayerShoppingBagId', value: 'bag-2' }, await bearer('21'))
)
const res = await SELF.fetch(`${ORIGIN}/playersettings`, {
method: 'DELETE',
headers: await bearer('21'),
body: 'key=PlayerShoppingBagId',
})
expect(res.status).toBe(200)
const stored = await env.RECFLARE_PLAYER_SETTINGS.get<Record<string, string>>(
'player:21',
'json'
)
expect(stored).toEqual({})
})
it('DELETE /playersettings 200s for an unknown key and an empty body', async () => {
await SELF.fetch(
`${ORIGIN}/playersettings`,
putForm({ key: 'A', value: '1' }, await bearer('22'))
)
const unknown = await SELF.fetch(
`${ORIGIN}/playersettings`,
deleteForm({ key: 'NotStored' }, await bearer('22'))
)
expect(unknown.status).toBe(200)
const empty = await SELF.fetch(`${ORIGIN}/playersettings`, deleteForm({}, await bearer('22')))
expect(empty.status).toBe(200)
// Neither call touched the stored map.
const stored = await env.RECFLARE_PLAYER_SETTINGS.get<Record<string, string>>(
'player:22',
'json'
)
expect(stored).toEqual({ A: '1' })
})
it('GET /openapi.json documents every route', async () => { it('GET /openapi.json documents every route', async () => {
const res = await SELF.fetch(`${ORIGIN}/openapi.json`) const res = await SELF.fetch(`${ORIGIN}/openapi.json`)
expect(res.status).toBe(200) expect(res.status).toBe(200)
@@ -239,12 +154,7 @@ describe('playersettings endpoints', () => {
Object.keys(ops).map((method) => `${method.toUpperCase()} ${path}`) Object.keys(ops).map((method) => `${method.toUpperCase()} ${path}`)
) )
) )
expect([...documented].sort()).toEqual([ expect([...documented].sort()).toEqual(['GET /', 'GET /playersettings', 'PUT /playersettings'])
'DELETE /playersettings',
'GET /',
'GET /playersettings',
'PUT /playersettings',
])
// Every operation carries a summary — a path present but undescribed is not // Every operation carries a summary — a path present but undescribed is not
// documentation. // documentation.
+2 -2
View File
@@ -21,7 +21,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -33,6 +33,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+45
View File
@@ -0,0 +1,45 @@
-- Room roles as their own table, mirroring 0013's move of tags into `room_tag`. One row
-- per (room, account). Generated from packages/domain/src/rooms-db.ts (ROOM_SCHEMA_DDL) —
-- keep in sync.
--
-- The row is the client's `Roles` entry shape:
-- { "AccountId": …, "Role": …, "LastChangedByAccountId": …, "InvitedRole": … }
-- `role` is the member's CURRENT role tier (10 Host, 20 Moderator, 30 CoOwner,
-- 255 Creator); `invited_role` is the tier they have been OFFERED but not yet accepted —
-- usually higher than `role`, and 0 when no invitation is pending. `last_changed_by` is
-- who last touched the row; NULL for creator entries, matching the blob's
-- `LastChangedByAccountId: null`.
--
-- The table is AUTHORITATIVE and the blob's `Roles` key is removed below, the same
-- arrangement 0013 gave tags: `serializeRoom` drops `Roles` on write and the reads
-- re-attach it (attachRoles), so the room DTO the client sees is unchanged and the two
-- copies can't drift. `getContributedRooms` now matches on this table instead of running
-- `json_each` over every blob.
CREATE TABLE IF NOT EXISTS room_role (
room_id INTEGER NOT NULL,
account_id INTEGER NOT NULL,
role INTEGER NOT NULL DEFAULT 0,
last_changed_by INTEGER,
invited_role INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (room_id, account_id)
);
-- Backfill from the blobs, the way 0013 backfilled `room_tag`. `json_each` walks the
-- `Roles` array; a room with no array (or a null one) contributes nothing, which is why
-- this is a join rather than a correlated subquery. `INSERT OR IGNORE` collapses a blob
-- that somehow carries the same account twice — the primary key is (room, account).
INSERT OR IGNORE INTO room_role (room_id, account_id, role, last_changed_by, invited_role)
SELECT
r.room_id,
json_extract(t.value, '$.AccountId'),
COALESCE(json_extract(t.value, '$.Role'), 0),
json_extract(t.value, '$.LastChangedByAccountId'),
COALESCE(json_extract(t.value, '$.InvitedRole'), 0)
FROM room r, json_each(r.data, '$.Roles') t
WHERE json_extract(t.value, '$.AccountId') IS NOT NULL;
-- Single source of truth: the roles now live in `room_role`, so the copy in the blob
-- goes. Leaving it would be a second answer to "who has a role in this room" that only
-- the writes through setRoomRole keep current.
UPDATE room SET data = json_remove(data, '$.Roles');
+2 -2
View File
@@ -21,7 +21,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -33,6 +33,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
-8
View File
@@ -874,14 +874,6 @@ export const RoomExperiencePlayer = z
.array(z.unknown()) .array(z.unknown())
.describe('Always empty — no per-room experience is tracked') .describe('Always empty — no per-room experience is tracked')
/**
* `GET /showcase/{playerId}` — the rooms a player showcases on their profile. Stubbed
* empty; nothing stores a showcase, so the element shape is unknown until something does.
*/
export const ShowcasedRooms = z
.array(z.unknown())
.describe('Always empty — no room showcase is stored')
/** /**
* `GET /rooms/curated_playlists` — the curated room playlists the discovery pages' * `GET /rooms/curated_playlists` — the curated room playlists the discovery pages'
* playlist sections draw from. Nothing curates one on this server, so the list is always * playlist sections draw from. Nothing curates one on this server, so the list is always
-24
View File
@@ -123,7 +123,6 @@ import {
SaveSubRoomDataRequest, SaveSubRoomDataRequest,
SearchSuggestions, SearchSuggestions,
ServiceStatus, ServiceStatus,
ShowcasedRooms,
stringQuery, stringQuery,
SubRoomAccessibilityRequest, SubRoomAccessibilityRequest,
SubRoomDataSaveResponseDto, SubRoomDataSaveResponseDto,
@@ -1283,29 +1282,6 @@ const app = new Hono<App>()
c.json(await getPublicRoomsByCreator(c.env.DB, Number.parseInt(c.req.param('accountId'), 10))) c.json(await getPublicRoomsByCreator(c.env.DB, Number.parseInt(c.req.param('accountId'), 10)))
) )
// A player's showcased rooms — the hand-picked rail the client draws on a profile,
// separate from `ownedby/{accountId}` (which is everything public they own). Stub →
// empty list: nothing stores a showcase yet, and an empty rail is what a player who
// has picked nothing looks like, where a 404 leaves the profile half-drawn. No auth,
// matching the profile list it sits beside — a showcase is public by definition.
.get(
'/showcase/:playerId{[0-9]+}',
describeRoute({
tags: ['Rooms'],
summary: 'A players showcased rooms',
description: [
'The rooms a player has showcased on their profile, as a bare array. Nothing stores a',
'showcase yet, so this is a stub serving an empty list — which the client reads as',
'“nothing showcased”, the same as a player who has picked none. Unlike',
'`ownedby/{accountId}`, which lists everything public the account owns, a showcase is',
'a chosen subset. No auth: a profile is public.',
].join(' '),
parameters: [playerIdParam],
responses: { 200: json(ShowcasedRooms, 'An empty list') },
}),
(c) => c.json([])
)
// Rooms the caller has favorited (from the interaction table). Auth-gated. // Rooms the caller has favorited (from the interaction table). Auth-gated.
// Paginated via skip/take (take defaults to 100). Returns a bare array, like the // Paginated via skip/take (take defaults to 100). Returns a bare array, like the
// other room-source `*by/me` lists the client loads. // other room-source `*by/me` lists the client loads.
+17 -32
View File
@@ -195,23 +195,6 @@ describe('rooms endpoints', () => {
expect(await res.json()).toEqual([]) expect(await res.json()).toEqual([])
}) })
// Stub, same reasoning: the profile asks for a showcase for any player, and an
// unregistered path leaves the profile half-drawn. No auth, and no such player is
// still [] rather than a 404.
it('GET /showcase/:playerId returns [] for any player', async () => {
const res = await SELF.fetch(`${ORIGIN}/showcase/205`)
expect(res.status).toBe(200)
expect(await res.json()).toEqual([])
const unknown = await SELF.fetch(`${ORIGIN}/showcase/99999`)
expect(unknown.status).toBe(200)
expect(await unknown.json()).toEqual([])
})
it('GET /showcase/:playerId 404s on a non-numeric id', async () => {
expect((await SELF.fetch(`${ORIGIN}/showcase/abc`)).status).toBe(404)
})
it('GET /rooms/:id 404s for a room not in D1', async () => { it('GET /rooms/:id 404s for a room not in D1', async () => {
const res = await SELF.fetch(`${ORIGIN}/rooms/99999`) const res = await SELF.fetch(`${ORIGIN}/rooms/99999`)
expect(res.status).toBe(404) expect(res.status).toBe(404)
@@ -442,6 +425,11 @@ describe('rooms endpoints', () => {
it('GET /rooms/contributedby/me lists rooms the caller owns or has a role in', async () => { it('GET /rooms/contributedby/me lists rooms the caller owns or has a role in', async () => {
const seed = (data: Record<string, unknown>) => const seed = (data: Record<string, unknown>) =>
env.DB.prepare('INSERT INTO room (data) VALUES (?1)').bind(JSON.stringify(data)).run() env.DB.prepare('INSERT INTO room (data) VALUES (?1)').bind(JSON.stringify(data)).run()
// Roles live in `room_role`, not the blob — the table the query's EXISTS matches on.
const grant = (roomId: number, accountId: number, role: number) =>
env.DB.prepare('INSERT INTO room_role (room_id, account_id, role) VALUES (?1, ?2, ?3)')
.bind(roomId, accountId, role)
.run()
// A room somebody else made, where 820 is a co-owner... // A room somebody else made, where 820 is a co-owner...
await seed({ await seed({
@@ -450,11 +438,9 @@ describe('rooms endpoints', () => {
CreatorAccountId: 821, CreatorAccountId: 821,
Accessibility: 1, Accessibility: 1,
SubRooms: [], SubRooms: [],
Roles: [
{ AccountId: 821, Role: 255 },
{ AccountId: 820, Role: 30 },
],
}) })
await grant(30401, 821, 255)
await grant(30401, 820, 30)
// ...one where they're only a host (every tier counts, not just owner-level)... // ...one where they're only a host (every tier counts, not just owner-level)...
await seed({ await seed({
RoomId: 30402, RoomId: 30402,
@@ -464,20 +450,20 @@ describe('rooms endpoints', () => {
// accessibility is not filtered here. // accessibility is not filtered here.
Accessibility: 0, Accessibility: 0,
SubRooms: [], SubRooms: [],
Roles: [{ AccountId: 820, Role: 10 }],
}) })
// ...one they created themselves, whose Roles name them as Creator (matched by BOTH await grant(30402, 820, 10)
// halves of the query, so it must still appear exactly once)... // ...one they created themselves, whose role rows name them as Creator (matched by
// BOTH halves of the query, so it must still appear exactly once)...
await seed({ await seed({
RoomId: 30403, RoomId: 30403,
Name: 'ContribOwn', Name: 'ContribOwn',
CreatorAccountId: 820, CreatorAccountId: 820,
Accessibility: 1, Accessibility: 1,
SubRooms: [], SubRooms: [],
Roles: [{ AccountId: 820, Role: 255 }],
}) })
// ...one they created that names nobody in Roles at all — the older rooms have no await grant(30403, 820, 255)
// Roles key, and those reach the list on the creator half alone... // ...one they created that has no role rows at all — the older rooms never got
// any, and those reach the list on the creator half alone...
await seed({ await seed({
RoomId: 30406, RoomId: 30406,
Name: 'ContribOwnNoRoles', Name: 'ContribOwnNoRoles',
@@ -493,18 +479,17 @@ describe('rooms endpoints', () => {
IsDorm: true, IsDorm: true,
Accessibility: 2, Accessibility: 2,
SubRooms: [], SubRooms: [],
Roles: [{ AccountId: 820, Role: 255 }],
}) })
// ...one they have nothing to do with, and one with no Roles key at all (the older await grant(30407, 820, 255)
// seeded rooms have none — json_each must drop them, not error). // ...one they have nothing to do with, and one with no role rows at all.
await seed({ await seed({
RoomId: 30404, RoomId: 30404,
Name: 'ContribOther', Name: 'ContribOther',
CreatorAccountId: 821, CreatorAccountId: 821,
Accessibility: 1, Accessibility: 1,
SubRooms: [], SubRooms: [],
Roles: [{ AccountId: 822, Role: 30 }],
}) })
await grant(30404, 822, 30)
await seed({ RoomId: 30405, Name: 'ContribNoRoles', CreatorAccountId: 821, SubRooms: [] }) await seed({ RoomId: 30405, Name: 'ContribNoRoles', CreatorAccountId: 821, SubRooms: [] })
const res = await SELF.fetch(`${ORIGIN}/rooms/contributedby/me`, { const res = await SELF.fetch(`${ORIGIN}/rooms/contributedby/me`, {
@@ -532,6 +517,7 @@ describe('rooms endpoints', () => {
// The DB is shared across this file, and these are the only player-made public rooms // The DB is shared across this file, and these are the only player-made public rooms
// in it — leaving them behind changes what the `new`/`community` room feeds serve. // in it — leaving them behind changes what the `new`/`community` room feeds serve.
await env.DB.prepare('DELETE FROM room WHERE room_id BETWEEN 30401 AND 30407').run() await env.DB.prepare('DELETE FROM room WHERE room_id BETWEEN 30401 AND 30407').run()
await env.DB.prepare('DELETE FROM room_role WHERE room_id BETWEEN 30401 AND 30407').run()
}) })
it('GET /rooms/:roomId/experience serves the fixed XP settings, no auth', async () => { it('GET /rooms/:roomId/experience serves the fixed XP settings, no auth', async () => {
@@ -4105,7 +4091,6 @@ describe('rooms endpoints', () => {
'GET /rooms/{roomId}/subrooms/{subRoomId}/saves/no_unity_assets', 'GET /rooms/{roomId}/subrooms/{subRoomId}/saves/no_unity_assets',
'GET /rooms/{roomId}/subrooms/{subRoomId}/saves/{saveId}', 'GET /rooms/{roomId}/subrooms/{subRoomId}/saves/{saveId}',
'GET /roomserver/rooms/createdby/me', 'GET /roomserver/rooms/createdby/me',
'GET /showcase/{playerId}',
'POST /rooms/bulk', 'POST /rooms/bulk',
'POST /rooms/{roomId}/bans', 'POST /rooms/{roomId}/bans',
'POST /rooms/{roomId}/clone', 'POST /rooms/{roomId}/clone',
+2 -2
View File
@@ -19,7 +19,7 @@
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@standard-community/standard-json": "0.3.5", "@standard-community/standard-json": "0.3.5",
"@standard-community/standard-openapi": "0.2.9", "@standard-community/standard-openapi": "0.2.9",
"hono": "4.13.5", "hono": "4.12.27",
"hono-openapi": "1.3.1", "hono-openapi": "1.3.1",
"openapi-types": "12.1.3", "openapi-types": "12.1.3",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
@@ -31,6 +31,6 @@
"@repo/typescript-config": "workspace:*", "@repo/typescript-config": "workspace:*",
"@types/node": "26.0.1", "@types/node": "26.0.1",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
-2
View File
@@ -2,8 +2,6 @@ import type { HonoApp } from '@repo/hono-helpers'
import type { SharedHonoEnv, SharedHonoVariables } from '@repo/hono-helpers/src/types' import type { SharedHonoEnv, SharedHonoVariables } from '@repo/hono-helpers/src/types'
export type Env = SharedHonoEnv & { export type Env = SharedHonoEnv & {
/** Maximum accepted binary upload size in bytes. */
MAX_UPLOAD_BYTES?: string | number
// Shared Secrets Store binding for the HS256 JWT signing key. Resolve the value // Shared Secrets Store binding for the HS256 JWT signing key. Resolve the value
// with `await env.JWT_SECRET.get()`; all workers bind the same store so tokens // with `await env.JWT_SECRET.get()`; all workers bind the same store so tokens
// signed by `auth` verify here. // signed by `auth` verify here.
+1 -26
View File
@@ -2,13 +2,7 @@ import { Hono } from 'hono'
import { describeRoute, openAPIRouteHandler } from 'hono-openapi' import { describeRoute, openAPIRouteHandler } from 'hono-openapi'
import { useWorkersLogger } from 'workers-tagged-logger' import { useWorkersLogger } from 'workers-tagged-logger'
import { import { withCleanSpec, withDefaultCors, withNotFound, withOnError } from '@repo/hono-helpers'
intVar,
withCleanSpec,
withDefaultCors,
withNotFound,
withOnError,
} from '@repo/hono-helpers'
import { validateAndGetAccountId } from '@repo/jwt' import { validateAndGetAccountId } from '@repo/jwt'
import { import {
@@ -63,19 +57,6 @@ const UPLOAD_EXTENSION: Record<number, string> = {
5: '.inv', 5: '.inv',
} }
/**
* A Worker must not accept an unbounded user-controlled blob into memory and R2.
* Operators can tune this for known room sizes, but an unset or invalid value keeps
* the safe 64 MiB default. Non-positive values are invalid rather than disabling the
* limit: a public upload endpoint must always have a finite ceiling.
*/
const DEFAULT_MAX_UPLOAD_BYTES = 64 * 1024 * 1024
function maxUploadBytes(value: unknown): number {
const configured = intVar(value, DEFAULT_MAX_UPLOAD_BYTES)
return configured > 0 ? configured : DEFAULT_MAX_UPLOAD_BYTES
}
function extensionForFileType(fileType: string): string { function extensionForFileType(fileType: string): string {
return UPLOAD_EXTENSION[Number.parseInt(fileType, 10)] ?? '' return UPLOAD_EXTENSION[Number.parseInt(fileType, 10)] ?? ''
} }
@@ -149,7 +130,6 @@ const app = new Hono<App>()
200: json(UploadResponse, 'The stored (or echoed) file name'), 200: json(UploadResponse, 'The stored (or echoed) file name'),
400: json(ErrorResponse, 'Unknown/missing FileType, or neither a file nor a name'), 400: json(ErrorResponse, 'Unknown/missing FileType, or neither a file nor a name'),
401: UNAUTHORIZED_RESPONSE, 401: UNAUTHORIZED_RESPONSE,
413: json(ErrorResponse, 'The binary file exceeds the configured upload limit'),
}, },
}), }),
async (c) => { async (c) => {
@@ -163,11 +143,6 @@ const app = new Hono<App>()
const file = Object.values(body).find((v): v is File => v instanceof File) const file = Object.values(body).find((v): v is File => v instanceof File)
if (file) { if (file) {
const limit = maxUploadBytes(c.env.MAX_UPLOAD_BYTES)
if (file.size > limit) {
return c.json({ error: `file exceeds the ${limit}-byte upload limit` }, 413)
}
const fileType = textField(body, 'filetype') ?? '0' const fileType = textField(body, 'filetype') ?? '0'
const subfolder = subfolderForFileType(fileType) const subfolder = subfolderForFileType(fileType)
if (subfolder === undefined) { if (subfolder === undefined) {
@@ -134,24 +134,6 @@ it('POST /upload 400s for a binary with an unknown/missing FileType', async () =
} }
}) })
it('POST /upload rejects a binary above the configured size limit without storing it', async () => {
const original = env.MAX_UPLOAD_BYTES
env.MAX_UPLOAD_BYTES = '3'
try {
const res = await SELF.fetch(`${ORIGIN}/upload`, {
method: 'POST',
headers: await bearer(),
body: uploadForm('3', new Uint8Array([1, 2, 3, 4])),
})
expect(res.status).toBe(413)
expect((await res.json()) as { error: string }).toEqual({
error: 'file exceeds the 3-byte upload limit',
})
} finally {
env.MAX_UPLOAD_BYTES = original
}
})
it('POST /upload echoes an explicit name when no binary is posted', async () => { it('POST /upload echoes an explicit name when no binary is posted', async () => {
const form = new FormData() const form = new FormData()
form.set('FileType', '3') form.set('FileType', '3')
+3 -3
View File
@@ -19,8 +19,8 @@
"@repo/domain": "workspace:*", "@repo/domain": "workspace:*",
"@repo/hono-helpers": "workspace:*", "@repo/hono-helpers": "workspace:*",
"@repo/jwt": "workspace:*", "@repo/jwt": "workspace:*",
"@scalar/api-reference": "1.67.0", "@scalar/api-reference": "1.63.0",
"hono": "4.13.5", "hono": "4.12.27",
"react": "19.2.7", "react": "19.2.7",
"react-dom": "19.2.7", "react-dom": "19.2.7",
"workers-tagged-logger": "1.0.1" "workers-tagged-logger": "1.0.1"
@@ -36,6 +36,6 @@
"@vitejs/plugin-react": "5.2.0", "@vitejs/plugin-react": "5.2.0",
"vite": "6.4.3", "vite": "6.4.3",
"vitest": "4.1.9", "vitest": "4.1.9",
"wrangler": "4.128.0" "wrangler": "4.105.0"
} }
} }
+142 -28
View File
@@ -118,6 +118,25 @@ export const ROOM_SCHEMA_DDL: string[] = [
sort_ascending INTEGER NOT NULL DEFAULT 0, sort_ascending INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (room_id, leaderboard_id) PRIMARY KEY (room_id, leaderboard_id)
)`, )`,
// Per-room role grants and invitations (migrations/0017_room_role.sql), one row per
// (room, account) — the client's `Roles` entry shape ({@link RoomRole}): `role` is the
// member's CURRENT role tier, `invited_role` the tier they've been offered but not yet
// accepted (so it's usually the higher of the two; 0 when no offer is pending), and
// `last_changed_by` who last touched the row (NULL for the seeded creator entries,
// matching the blob's `LastChangedByAccountId: null`).
//
// The table is AUTHORITATIVE, the same arrangement as `room_tag`: `serializeRoom`
// strips `Roles` from the blob and the reads re-attach it (see {@link attachRoles}),
// so there is exactly one place a role is stored — and `getContributedRooms` matches
// on an indexed table instead of a `json_each` over every blob.
`CREATE TABLE IF NOT EXISTS room_role (
room_id INTEGER NOT NULL,
account_id INTEGER NOT NULL,
role INTEGER NOT NULL DEFAULT 0,
last_changed_by INTEGER,
invited_role INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (room_id, account_id)
)`,
] ]
/** /**
@@ -412,7 +431,8 @@ export async function cloneRoom(
// Ownership is reset to the cloner — the source room's Roles (its creator and // Ownership is reset to the cloner — the source room's Roles (its creator and
// any co-owners, e.g. the seeded base-room roles for accounts 1/2) must NOT // any co-owners, e.g. the seeded base-room roles for accounts 1/2) must NOT
// carry over, or the clone would still list the template's owner as owner. // carry over, or the clone would still list the template's owner as owner. The
// roles live in `room_role` (inserted below); this array is the response copy.
const roles: RoomRole[] = [ const roles: RoomRole[] = [
{ AccountId: accountId, Role: Role.Creator, LastChangedByAccountId: null, InvitedRole: 0 }, { AccountId: accountId, Role: Role.Creator, LastChangedByAccountId: null, InvitedRole: 0 },
] ]
@@ -440,9 +460,11 @@ export async function cloneRoom(
CreatedAt: new Date().toISOString(), CreatedAt: new Date().toISOString(),
} }
// serializeRoom drops the hydrated SubRooms from the blob; the clone's subrooms are // serializeRoom drops the hydrated SubRooms from the blob (and Roles — those go to
// inserted into the subroom table below with fresh globally-unique ids. // their own table); the clone's subrooms are inserted into the subroom table below
// with fresh globally-unique ids.
await db.prepare('INSERT INTO room (data) VALUES (?1)').bind(serializeRoom(cloned)).run() await db.prepare('INSERT INTO room (data) VALUES (?1)').bind(serializeRoom(cloned)).run()
await insertCreatorRole(db, newRoomId, accountId)
const sourceSubRooms = Array.isArray(source.SubRooms) ? (source.SubRooms as SubRoom[]) : [] const sourceSubRooms = Array.isArray(source.SubRooms) ? (source.SubRooms as SubRoom[]) : []
const clonedSubRooms: SubRoom[] = [] const clonedSubRooms: SubRoom[] = []
for (const sub of sourceSubRooms) { for (const sub of sourceSubRooms) {
@@ -509,10 +531,12 @@ export async function updateRoomFields(
} }
/** /**
* Set a target account's room `Role` updating their existing `Roles` entry or * Set a target account's room `Role` updating their existing `room_role` row or
* appending a new one and stamp `LastChangedByAccountId` with the editor. The * inserting one and stamp `last_changed_by` with the editor. One row per
* caller supplies the already-loaded room (after its owner/co-owner check) to avoid * (room, account), so the call is idempotent; a pending `invited_role` is left alone
* a re-read; the whole room JSON is rewritten. Returns the updated room. * (setting someone's role is not answering their invitation). The caller supplies the
* already-loaded (hydrated) room, and gets it back with `Roles` updated to match the
* table the blob is not touched, roles don't live there.
*/ */
export async function setRoomRole( export async function setRoomRole(
db: D1Database, db: D1Database,
@@ -522,7 +546,18 @@ export async function setRoomRole(
changedByAccountId: number, changedByAccountId: number,
room: Room room: Room
): Promise<Room> { ): Promise<Room> {
const roles = Array.isArray(room.Roles) ? (room.Roles as RoomRole[]) : [] await db
.prepare(
`INSERT INTO room_role (room_id, account_id, role, last_changed_by, invited_role)
VALUES (?1, ?2, ?3, ?4, 0)
ON CONFLICT(room_id, account_id) DO UPDATE SET role = ?3, last_changed_by = ?4`
)
.bind(roomId, targetAccountId, role, changedByAccountId)
.run()
// Mirror the write onto the hydrated room so the caller can serve it without a
// re-read — the same entry shape {@link attachRoles} would produce.
const roles = Array.isArray(room.Roles) ? [...(room.Roles as RoomRole[])] : []
const existing = roles.find((r) => r.AccountId === targetAccountId) const existing = roles.find((r) => r.AccountId === targetAccountId)
if (existing) { if (existing) {
existing.Role = role existing.Role = role
@@ -535,12 +570,7 @@ export async function setRoomRole(
InvitedRole: 0, InvitedRole: 0,
}) })
} }
const updated: Room = { ...room, Roles: roles } return { ...room, Roles: roles }
await db
.prepare('UPDATE room SET data = ?2 WHERE room_id = ?1')
.bind(roomId, serializeRoom(updated))
.run()
return updated
} }
/** /**
@@ -1274,16 +1304,17 @@ const serializeSubRoom = (sub: SubRoom, roomId: number): string => {
/** /**
* Serialize a room for a full-blob write, dropping the parts that belong to another table * Serialize a room for a full-blob write, dropping the parts that belong to another table
* so the blob can never hold a stale copy: hydrated `SubRooms` (the `subroom` table's job), * so the blob can never hold a stale copy: hydrated `SubRooms` (the `subroom` table's job),
* `Tags` (the `room_tag` table's job see {@link setRoomTags}), and the derived engagement * `Tags` (the `room_tag` table's job see {@link setRoomTags}), `Roles` (the `room_role`
* counters, which are zeroed rather than dropped so the key stays present (the * table's job see {@link setRoomRole}), and the derived engagement counters, which are
* `interaction` table's job see {@link attachStats}). * zeroed rather than dropped so the key stays present (the `interaction` table's job
* see {@link attachStats}).
* *
* Because `Tags` is dropped here, a write that means to CHANGE a room's tags has to write * Because `Tags` and `Roles` are dropped here, a write that means to CHANGE them has to
* the table itself; passing a room with a new `Tags` array through this silently discards * write the table itself; passing a room with a new array through this silently discards
* it. * it.
*/ */
const serializeRoom = (room: Room): string => { const serializeRoom = (room: Room): string => {
const { SubRooms: _subRooms, Tags: _tags, Stats: stats, ...rest } = room const { SubRooms: _subRooms, Tags: _tags, Roles: _roles, Stats: stats, ...rest } = room
return JSON.stringify({ ...rest, Stats: storedStats(stats) }) return JSON.stringify({ ...rest, Stats: storedStats(stats) })
} }
@@ -1489,6 +1520,70 @@ function roomsByTagsQuery(tagSets: string[][], where = ''): { sql: string; binds
return { sql: `SELECT ${ROOM_COLUMNS} FROM room r ${joins.join(' ')}${filter}`, binds } return { sql: `SELECT ${ROOM_COLUMNS} FROM room r ${joins.join(' ')}${filter}`, binds }
} }
// ---- Room roles -----------------------------------------------------------
// A room's roles live in `room_role`, not in the room blob (see ROOM_SCHEMA_DDL). The
// blob is stripped on write and the array is re-attached on read, the same arrangement
// as `room_tag`, so there is exactly one place a role is stored.
interface RoomRoleRow {
room_id: number
account_id: number
role: number
last_changed_by: number | null
invited_role: number
}
const toRoomRole = (row: RoomRoleRow): RoomRole => ({
AccountId: row.account_id,
Role: row.role,
LastChangedByAccountId: row.last_changed_by,
InvitedRole: row.invited_role,
})
/** The given rooms' role entries, grouped by room id (one query for the batch). */
async function rolesByRoom(db: D1Database, ids: number[]): Promise<Map<number, RoomRole[]>> {
const byRoom = new Map<number, RoomRole[]>()
if (ids.length === 0) return byRoom
const results = await selectInChunks<RoomRoleRow>(
db,
ids,
(placeholders) =>
`SELECT room_id, account_id, role, last_changed_by, invited_role FROM room_role
WHERE room_id IN (${placeholders}) ORDER BY account_id`
)
for (const row of results) {
const list = byRoom.get(row.room_id) ?? []
list.push(toRoomRole(row))
byRoom.set(row.room_id, list)
}
return byRoom
}
/**
* Fill in each room's `Roles` from `room_role`. Every room ends up with the key PRESENT
* an empty array when it carries none because {@link canManageRoom} and the client both
* read it directly and the blob no longer supplies one.
*/
async function attachRoles(db: D1Database, rooms: Room[]): Promise<void> {
const byRoom = await rolesByRoom(db, [...new Set(rooms.map(roomIdOf))])
for (const room of rooms) room.Roles = byRoom.get(roomIdOf(room)) ?? []
}
/**
* Seed a brand-new room's creator entry (Role 255, `last_changed_by` NULL like the
* imported creator rows) the row every room minted by this module starts with.
*/
async function insertCreatorRole(db: D1Database, roomId: number, accountId: number): Promise<void> {
await db
.prepare(
`INSERT INTO room_role (room_id, account_id, role, last_changed_by, invited_role)
VALUES (?1, ?2, ?3, NULL, 0)
ON CONFLICT(room_id, account_id) DO UPDATE SET role = ?3`
)
.bind(roomId, accountId, Role.Creator)
.run()
}
/** Parse subroom rows and resolve their `CurrentSave` in one batched query. */ /** Parse subroom rows and resolve their `CurrentSave` in one batched query. */
async function parseSubRoomRows(db: D1Database, rows: SubRoomRow[]): Promise<SubRoom[]> { async function parseSubRoomRows(db: D1Database, rows: SubRoomRow[]): Promise<SubRoom[]> {
const subs = rows.map(parseSubRoomRow) const subs = rows.map(parseSubRoomRow)
@@ -1638,7 +1733,8 @@ async function hydrateRoom(db: D1Database, room: Room | null): Promise<Room | nu
} }
/** /**
* Hydrate many rooms' `SubRooms`, `Tags` and derived `Stats` (one batched query each). * Hydrate many rooms' `SubRooms`, `Tags`, `Roles` and derived `Stats` (one batched query
* each).
* *
* `Tags` is re-attached even for the feeds that already did so before ranking * `Tags` is re-attached even for the feeds that already did so before ranking
* ({@link parseAllWithTags}) it is one query for the page slice and it guarantees the key * ({@link parseAllWithTags}) it is one query for the page slice and it guarantees the key
@@ -1652,6 +1748,7 @@ async function hydrateRooms(
await Promise.all([ await Promise.all([
attachSubRooms(db, rooms), attachSubRooms(db, rooms),
attachTags(db, rooms), attachTags(db, rooms),
attachRoles(db, rooms),
attachStats(db, rooms, stats), attachStats(db, rooms, stats),
]) ])
return rooms return rooms
@@ -1940,6 +2037,19 @@ export async function seedRoomWithSubRooms(db: D1Database, room: Room): Promise<
if (Array.isArray(room.Tags) && room.Tags.length > 0) { if (Array.isArray(room.Tags) && room.Tags.length > 0) {
await setRoomTags(db, roomId, room.Tags as RoomTag[]) await setRoomTags(db, roomId, room.Tags as RoomTag[])
} }
// Same for `Roles` — mirrors 0017's backfill of `room_role` from the blobs.
if (Array.isArray(room.Roles) && room.Roles.length > 0) {
await db.batch(
(room.Roles as RoomRole[]).map((r) =>
db
.prepare(
`INSERT OR IGNORE INTO room_role (room_id, account_id, role, last_changed_by, invited_role)
VALUES (?1, ?2, ?3, ?4, ?5)`
)
.bind(roomId, r.AccountId, r.Role ?? 0, r.LastChangedByAccountId, r.InvitedRole ?? 0)
)
)
}
for (const sub of subRooms) { for (const sub of subRooms) {
const subRoomId = Number(sub.SubRoomId) const subRoomId = Number(sub.SubRoomId)
await db await db
@@ -1981,6 +2091,8 @@ export async function deleteRoom(db: D1Database, roomId: number): Promise<void>
// Tag rows outlive the blob otherwise, and would keep answering `#tag` searches and // Tag rows outlive the blob otherwise, and would keep answering `#tag` searches and
// category rows for a room nobody can open. // category rows for a room nobody can open.
db.prepare('DELETE FROM room_tag WHERE room_id = ?1').bind(roomId), db.prepare('DELETE FROM room_tag WHERE room_id = ?1').bind(roomId),
// Role rows likewise — they'd keep the room in everyone's contributed list.
db.prepare('DELETE FROM room_role WHERE room_id = ?1').bind(roomId),
// Saves and permission overrides first — both are keyed by subroom, so they'd be // Saves and permission overrides first — both are keyed by subroom, so they'd be
// unreachable once the subrooms themselves are gone. // unreachable once the subrooms themselves are gone.
db db
@@ -2071,9 +2183,9 @@ export async function countRoomsByCreator(db: D1Database, accountId: number): Pr
* room the player made. A room matching BOTH halves appears once the roles half is an * room the player made. A room matching BOTH halves appears once the roles half is an
* EXISTS, not a join. * EXISTS, not a join.
* *
* Roles live inside the room blob rather than in a table of their own, so the match is a * The roles half matches on `room_role` (the table is authoritative see ROOM_SCHEMA_DDL),
* `json_each` over `$.Roles`. A room with no `Roles` key (or a null one) simply yields no * so it is an indexed probe per room rather than the `json_each` over every blob it was
* rows there rather than erroring, so it only reaches the list if the account created it. * when roles lived serialized in the room.
*/ */
export async function getContributedRooms(db: D1Database, accountId: number): Promise<Room[]> { export async function getContributedRooms(db: D1Database, accountId: number): Promise<Room[]> {
const { results } = await db const { results } = await db
@@ -2081,8 +2193,8 @@ export async function getContributedRooms(db: D1Database, accountId: number): Pr
`SELECT ${ROOM_COLUMNS} FROM room `SELECT ${ROOM_COLUMNS} FROM room
WHERE creator_account_id = ?1 WHERE creator_account_id = ?1
OR EXISTS ( OR EXISTS (
SELECT 1 FROM json_each(room.data, '$.Roles') AS role SELECT 1 FROM room_role WHERE room_role.room_id = room.room_id
WHERE json_extract(role.value, '$.AccountId') = ?1 AND room_role.account_id = ?1
)` )`
) )
.bind(accountId) .bind(accountId)
@@ -2921,9 +3033,11 @@ export async function getOrCreateDormRoom(db: D1Database, accountId: number): Pr
Stats: storedStats(template?.Stats), Stats: storedStats(template?.Stats),
CreatedAt: new Date().toISOString(), CreatedAt: new Date().toISOString(),
} }
// serializeRoom drops any SubRooms carried over from the template; the dorm's own // serializeRoom drops any SubRooms carried over from the template (and Roles — those
// subroom is inserted into the subroom table below with a fresh globally-unique id. // go to their own table); the dorm's own subroom is inserted into the subroom table
// below with a fresh globally-unique id.
await db.prepare('INSERT INTO room (data) VALUES (?1)').bind(serializeRoom(room)).run() await db.prepare('INSERT INTO room (data) VALUES (?1)').bind(serializeRoom(room)).run()
await insertCreatorRole(db, roomId, accountId)
const subRoom = await insertSubRoom(db, roomId, { ...templateSub, CreatorAccountId: accountId }) const subRoom = await insertSubRoom(db, roomId, { ...templateSub, CreatorAccountId: accountId })
room.SubRooms = [subRoom] room.SubRooms = [subRoom]
// The template carries these (it was parsed), but a dorm minted without one wouldn't. // The template carries these (it was parsed), but a dorm minted without one wouldn't.
+1 -1
View File
@@ -12,7 +12,7 @@
}, },
"dependencies": { "dependencies": {
"@hono/standard-validator": "0.2.2", "@hono/standard-validator": "0.2.2",
"hono": "4.13.5", "hono": "4.12.27",
"http-codex": "0.6.7", "http-codex": "0.6.7",
"workers-tagged-logger": "1.0.1", "workers-tagged-logger": "1.0.1",
"zod": "4.4.3" "zod": "4.4.3"
+1 -1
View File
@@ -11,7 +11,7 @@
}, },
"dependencies": { "dependencies": {
"@repo/domain": "workspace:*", "@repo/domain": "workspace:*",
"hono": "4.13.5" "hono": "4.12.27"
}, },
"devDependencies": { "devDependencies": {
"@cloudflare/workers-types": "4.20260630.1", "@cloudflare/workers-types": "4.20260630.1",
+2 -6
View File
@@ -52,12 +52,8 @@ export async function validateAndGetAccountId(
const accountId = await getAccountIdFromToken(token, secret) const accountId = await getAccountIdFromToken(token, secret)
if (!accountId) return null if (!accountId) return null
// `parseInt("42junk", 10)` is 42, which lets a malformed subject select a real const id = Number.parseInt(accountId, 10)
// account. Token subjects are canonical positive base-10 account ids: reject return Number.isNaN(id) ? null : id
// partial parses, signs, decimals, leading zeroes and values outside JS's safe range.
if (!/^[1-9]\d*$/.test(accountId)) return null
const id = Number(accountId)
return Number.isSafeInteger(id) ? id : null
} }
/** /**
+1 -1
View File
@@ -36,7 +36,7 @@
"dependencies": { "dependencies": {
"esbuild": "0.28.1", "esbuild": "0.28.1",
"slugify": "1.6.9", "slugify": "1.6.9",
"wrangler": "4.128.0", "wrangler": "4.105.0",
"yaml": "2.9.0", "yaml": "2.9.0",
"zod": "4.4.3", "zod": "4.4.3",
"zx": "8.8.5" "zx": "8.8.5"
+554 -1003
View File
@@ -13,7 +13,7 @@ importers:
version: 8.0.1(@babel/core@7.29.7) version: 8.0.1(@babel/core@7.29.7)
'@ianvs/prettier-plugin-sort-imports': '@ianvs/prettier-plugin-sort-imports':
specifier: 4.7.1 specifier: 4.7.1
version: 4.7.1(@vue/compiler-sfc@3.5.42)(prettier@3.9.4) version: 4.7.1(@vue/compiler-sfc@3.5.40)(prettier@3.9.4)
'@repo/oxlint-config': '@repo/oxlint-config':
specifier: workspace:* specifier: workspace:*
version: link:packages/oxlint-config version: link:packages/oxlint-config
@@ -69,11 +69,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -100,8 +100,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/ai: apps/ai:
dependencies: dependencies:
@@ -118,11 +118,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -149,8 +149,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/api: apps/api:
dependencies: dependencies:
@@ -173,11 +173,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -204,8 +204,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/auth: apps/auth:
dependencies: dependencies:
@@ -225,11 +225,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -256,8 +256,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/cards: apps/cards:
dependencies: dependencies:
@@ -265,8 +265,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../packages/hono-helpers version: link:../../packages/hono-helpers
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
workers-tagged-logger: workers-tagged-logger:
specifier: 1.0.1 specifier: 1.0.1
version: 1.0.1 version: 1.0.1
@@ -287,8 +287,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/cdn: apps/cdn:
dependencies: dependencies:
@@ -305,11 +305,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -336,8 +336,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/chat: apps/chat:
dependencies: dependencies:
@@ -357,11 +357,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -388,8 +388,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/clubs: apps/clubs:
dependencies: dependencies:
@@ -409,11 +409,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -440,8 +440,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/commerce: apps/commerce:
dependencies: dependencies:
@@ -455,11 +455,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -486,8 +486,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/datacollection: apps/datacollection:
dependencies: dependencies:
@@ -495,8 +495,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../packages/hono-helpers version: link:../../packages/hono-helpers
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
workers-tagged-logger: workers-tagged-logger:
specifier: 1.0.1 specifier: 1.0.1
version: 1.0.1 version: 1.0.1
@@ -517,8 +517,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/discovery: apps/discovery:
dependencies: dependencies:
@@ -532,11 +532,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -563,8 +563,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/econ: apps/econ:
dependencies: dependencies:
@@ -587,11 +587,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -618,8 +618,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/img: apps/img:
dependencies: dependencies:
@@ -636,11 +636,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -667,8 +667,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/leaderboard: apps/leaderboard:
dependencies: dependencies:
@@ -688,11 +688,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -719,8 +719,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/link: apps/link:
dependencies: dependencies:
@@ -728,8 +728,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../packages/hono-helpers version: link:../../packages/hono-helpers
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
workers-tagged-logger: workers-tagged-logger:
specifier: 1.0.1 specifier: 1.0.1
version: 1.0.1 version: 1.0.1
@@ -750,8 +750,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/lists: apps/lists:
dependencies: dependencies:
@@ -765,11 +765,11 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../packages/jwt version: link:../../packages/jwt
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -796,8 +796,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/match: apps/match:
dependencies: dependencies:
@@ -817,11 +817,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -848,8 +848,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/moderation: apps/moderation:
dependencies: dependencies:
@@ -857,8 +857,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../packages/hono-helpers version: link:../../packages/hono-helpers
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
workers-tagged-logger: workers-tagged-logger:
specifier: 1.0.1 specifier: 1.0.1
version: 1.0.1 version: 1.0.1
@@ -879,8 +879,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/mono: apps/mono:
dependencies: dependencies:
@@ -900,11 +900,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -931,8 +931,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/notify: apps/notify:
dependencies: dependencies:
@@ -943,8 +943,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../packages/jwt version: link:../../packages/jwt
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
workers-tagged-logger: workers-tagged-logger:
specifier: 1.0.1 specifier: 1.0.1
version: 1.0.1 version: 1.0.1
@@ -965,8 +965,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/ns: apps/ns:
dependencies: dependencies:
@@ -974,8 +974,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../packages/hono-helpers version: link:../../packages/hono-helpers
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
workers-tagged-logger: workers-tagged-logger:
specifier: 1.0.1 specifier: 1.0.1
version: 1.0.1 version: 1.0.1
@@ -996,8 +996,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/platformnotifications: apps/platformnotifications:
dependencies: dependencies:
@@ -1008,8 +1008,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../packages/jwt version: link:../../packages/jwt
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
workers-tagged-logger: workers-tagged-logger:
specifier: 1.0.1 specifier: 1.0.1
version: 1.0.1 version: 1.0.1
@@ -1030,8 +1030,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/playersettings: apps/playersettings:
dependencies: dependencies:
@@ -1048,11 +1048,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -1079,8 +1079,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/roomcomments: apps/roomcomments:
dependencies: dependencies:
@@ -1100,11 +1100,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -1131,8 +1131,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/rooms: apps/rooms:
dependencies: dependencies:
@@ -1152,11 +1152,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -1183,8 +1183,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/storage: apps/storage:
dependencies: dependencies:
@@ -1201,11 +1201,11 @@ importers:
specifier: 0.2.9 specifier: 0.2.9
version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) version: 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
hono-openapi: hono-openapi:
specifier: 1.3.1 specifier: 1.3.1
version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3) version: 1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3)
openapi-types: openapi-types:
specifier: 12.1.3 specifier: 12.1.3
version: 12.1.3 version: 12.1.3
@@ -1232,8 +1232,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
apps/www: apps/www:
dependencies: dependencies:
@@ -1247,11 +1247,11 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../packages/jwt version: link:../../packages/jwt
'@scalar/api-reference': '@scalar/api-reference':
specifier: 1.67.0 specifier: 1.63.0
version: 1.67.0(tailwindcss@4.3.3)(typescript@6.0.3)(zod@4.5.4) version: 1.63.0(tailwindcss@4.3.3)(typescript@6.0.3)(zod@4.4.3)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
react: react:
specifier: 19.2.7 specifier: 19.2.7
version: 19.2.7 version: 19.2.7
@@ -1264,7 +1264,7 @@ importers:
devDependencies: devDependencies:
'@cloudflare/vite-plugin': '@cloudflare/vite-plugin':
specifier: 1.42.0 specifier: 1.42.0
version: 1.42.0(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))(workerd@1.20260831.1)(wrangler@4.128.0) version: 1.42.0(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))(workerd@1.20260625.1)(wrangler@4.105.0(@cloudflare/workers-types@4.20260630.1))
'@cloudflare/vitest-pool-workers': '@cloudflare/vitest-pool-workers':
specifier: 0.16.20 specifier: 0.16.20
version: 0.16.20(@cloudflare/workers-types@4.20260630.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))) version: 0.16.20(@cloudflare/workers-types@4.20260630.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)))
@@ -1293,8 +1293,8 @@ importers:
specifier: 4.1.9 specifier: 4.1.9
version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)) version: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@26.0.1)(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
packages/domain: packages/domain:
dependencies: dependencies:
@@ -1316,10 +1316,10 @@ importers:
dependencies: dependencies:
'@hono/standard-validator': '@hono/standard-validator':
specifier: 0.2.2 specifier: 0.2.2
version: 0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5) version: 0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27)
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
http-codex: http-codex:
specifier: 0.6.7 specifier: 0.6.7
version: 0.6.7 version: 0.6.7
@@ -1352,8 +1352,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../domain version: link:../domain
hono: hono:
specifier: 4.13.5 specifier: 4.12.27
version: 4.13.5 version: 4.12.27
devDependencies: devDependencies:
'@cloudflare/workers-types': '@cloudflare/workers-types':
specifier: 4.20260630.1 specifier: 4.20260630.1
@@ -1450,8 +1450,8 @@ importers:
specifier: 1.6.9 specifier: 1.6.9
version: 1.6.9 version: 1.6.9
wrangler: wrangler:
specifier: 4.128.0 specifier: 4.105.0
version: 4.128.0 version: 4.105.0(@cloudflare/workers-types@4.20260630.1)
yaml: yaml:
specifier: 2.9.0 specifier: 2.9.0
version: 2.9.0 version: 2.9.0
@@ -1587,11 +1587,6 @@ packages:
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
hasBin: true hasBin: true
'@babel/parser@7.29.8':
resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==}
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/plugin-transform-destructuring@8.0.1': '@babel/plugin-transform-destructuring@8.0.1':
resolution: {integrity: sha512-RtR8uLDl0QcCmqMNIkM8gmDeYZ3rS0ZH+sa+I6sfc09yFoqfp9AEPgBstq9KyfVb0lFCVSRFfJXCI70FIl5ccw==} resolution: {integrity: sha512-RtR8uLDl0QcCmqMNIkM8gmDeYZ3rS0ZH+sa+I6sfc09yFoqfp9AEPgBstq9KyfVb0lFCVSRFfJXCI70FIl5ccw==}
engines: {node: ^22.18.0 || >=24.11.0} engines: {node: ^22.18.0 || >=24.11.0}
@@ -1628,10 +1623,6 @@ packages:
resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/types@7.29.8':
resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
engines: {node: '>=6.9.0'}
'@cf-wasm/internals@0.1.2': '@cf-wasm/internals@0.1.2':
resolution: {integrity: sha512-9d/I3JFv1IpQFYOrIw5RQShQPyuZRw9DyeBylF39Uj/MH7my8+EzKDPpUCHiqZ5O7tZS/A6zwP08egpeI5NBhA==} resolution: {integrity: sha512-9d/I3JFv1IpQFYOrIw5RQShQPyuZRw9DyeBylF39Uj/MH7my8+EzKDPpUCHiqZ5O7tZS/A6zwP08egpeI5NBhA==}
@@ -1677,12 +1668,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@cloudflare/workerd-darwin-64@1.20260831.1':
resolution: {integrity: sha512-oyZ8xhu+gYTvoxV/sn6NRmTHK95RhEO1Dk54/6oPb0Uu70w7ZeRoCjkJ5aNmfS8Vrkdu6+oL0HNg6EcC61uQ2Q==}
engines: {node: '>=16'}
cpu: [x64]
os: [darwin]
'@cloudflare/workerd-darwin-arm64@1.20260617.1': '@cloudflare/workerd-darwin-arm64@1.20260617.1':
resolution: {integrity: sha512-LHH7b565g9znfCUOkwbec6FG2rmRbsgCy6aJiU9KN662mNheWl5sw/iKleiFSiljPKQQP3HkjnC/NSkdgi/aSA==} resolution: {integrity: sha512-LHH7b565g9znfCUOkwbec6FG2rmRbsgCy6aJiU9KN662mNheWl5sw/iKleiFSiljPKQQP3HkjnC/NSkdgi/aSA==}
engines: {node: '>=16'} engines: {node: '>=16'}
@@ -1695,12 +1680,6 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@cloudflare/workerd-darwin-arm64@1.20260831.1':
resolution: {integrity: sha512-s6Go53KPnoXZ1sTGBZ3en3otfHDuMPJhiwXMYWU21JkJQkpoeRt6HFUwM0GPhK3YhXWm+8baGMvCGZYS/KA9eA==}
engines: {node: '>=16'}
cpu: [arm64]
os: [darwin]
'@cloudflare/workerd-linux-64@1.20260617.1': '@cloudflare/workerd-linux-64@1.20260617.1':
resolution: {integrity: sha512-FMnaAKXe4Cfd8TQurCVd9fs2XQVBFRCsP+Id/SRdUv89MlwYu9zXfoyx6BxM+brPTIUK38SHbo8iaxiwzLi9JQ==} resolution: {integrity: sha512-FMnaAKXe4Cfd8TQurCVd9fs2XQVBFRCsP+Id/SRdUv89MlwYu9zXfoyx6BxM+brPTIUK38SHbo8iaxiwzLi9JQ==}
engines: {node: '>=16'} engines: {node: '>=16'}
@@ -1713,12 +1692,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@cloudflare/workerd-linux-64@1.20260831.1':
resolution: {integrity: sha512-WxNKBgjKgeYTolW3yl1Lt3Lu67UlxdeyzWYi9MIqrKBdyQcz+UNG36RevSBf8rv1sTWapRW234VX2keZ+wXapA==}
engines: {node: '>=16'}
cpu: [x64]
os: [linux]
'@cloudflare/workerd-linux-arm64@1.20260617.1': '@cloudflare/workerd-linux-arm64@1.20260617.1':
resolution: {integrity: sha512-MRoifFYcqbxxIIQy7PqO5tFY/qPFSnjXzakWl0sO93l+HLyG35jRAgOi6jfqa4kBxc7gKKtH861DcewjxUfkjA==} resolution: {integrity: sha512-MRoifFYcqbxxIIQy7PqO5tFY/qPFSnjXzakWl0sO93l+HLyG35jRAgOi6jfqa4kBxc7gKKtH861DcewjxUfkjA==}
engines: {node: '>=16'} engines: {node: '>=16'}
@@ -1731,12 +1704,6 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@cloudflare/workerd-linux-arm64@1.20260831.1':
resolution: {integrity: sha512-JTF9+9clUT3gaCq7Xnmd+Q/wEMaitpngSTOec/Ffb/r3xexA9XwNJVFSOKfk6q61flHGjAYJ4H9B7Mu5Qur49w==}
engines: {node: '>=16'}
cpu: [arm64]
os: [linux]
'@cloudflare/workerd-windows-64@1.20260617.1': '@cloudflare/workerd-windows-64@1.20260617.1':
resolution: {integrity: sha512-rgBV9wQrv0OSKgCTTbhFUFY3sLGNANZ88aqaLvtmEn2gmbFVb1J4PDGochVUdB7NSEp4D/ghHva6/8SZmbONpw==} resolution: {integrity: sha512-rgBV9wQrv0OSKgCTTbhFUFY3sLGNANZ88aqaLvtmEn2gmbFVb1J4PDGochVUdB7NSEp4D/ghHva6/8SZmbONpw==}
engines: {node: '>=16'} engines: {node: '>=16'}
@@ -1749,26 +1716,20 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@cloudflare/workerd-windows-64@1.20260831.1':
resolution: {integrity: sha512-do+KDYw0PABwsrKUQIccWBZB70kqKcADoSnvzJ8pvMaWUVB4qaCspEZYfm97WNdtY1wt8mlKYqIJyYUNOkTvQg==}
engines: {node: '>=16'}
cpu: [x64]
os: [win32]
'@cloudflare/workers-types@4.20260630.1': '@cloudflare/workers-types@4.20260630.1':
resolution: {integrity: sha512-yl+c9vwvko9UZ0frmtsHuwOh3BRHvNjLrfelAp5Akpqe1+Ho1UWekr3nmjJ1D64CH0Yb0K0oRMV4i7npOFzsog==} resolution: {integrity: sha512-yl+c9vwvko9UZ0frmtsHuwOh3BRHvNjLrfelAp5Akpqe1+Ho1UWekr3nmjJ1D64CH0Yb0K0oRMV4i7npOFzsog==}
'@codemirror/autocomplete@6.20.3': '@codemirror/autocomplete@6.20.3':
resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==} resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==}
'@codemirror/commands@6.11.0': '@codemirror/commands@6.10.4':
resolution: {integrity: sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA==} resolution: {integrity: sha512-Ryk9y9T0FFVF0cUGhAknveAyUOl/A1qReTFi+qPKtOh2Z9F4AUBz3XOrYD4ZEgZirdugVzHvd/2/Wcwy5OliTg==}
'@codemirror/lang-css@6.3.1': '@codemirror/lang-css@6.3.1':
resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==}
'@codemirror/lang-html@6.4.12': '@codemirror/lang-html@6.4.11':
resolution: {integrity: sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==} resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==}
'@codemirror/lang-javascript@6.2.5': '@codemirror/lang-javascript@6.2.5':
resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==} resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==}
@@ -1788,11 +1749,11 @@ packages:
'@codemirror/lint@6.9.7': '@codemirror/lint@6.9.7':
resolution: {integrity: sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==} resolution: {integrity: sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==}
'@codemirror/state@6.7.2': '@codemirror/state@6.7.1':
resolution: {integrity: sha512-U3RiPX62Wl/Gx4ftQ7UxLlloSfsFTQqKa+7vFBYteZGCzkp6oBqcsD7iSwniWRGobCAmDcwZSY+Six3+3ztdfg==} resolution: {integrity: sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==}
'@codemirror/view@6.43.10': '@codemirror/view@6.43.6':
resolution: {integrity: sha512-vVWLvd4fKWYN/pMcwUrg6dWeublxmSz+V+52ZjW3h64IVN9cRUYLk5Km4JDT9vifxAFfDtNOIFxKYENthcolJQ==} resolution: {integrity: sha512-EVunGSYN1wz1p75WY1s3Xg7t3i8Yol0kGZGizNdX9BUFgMFILYVe8/u6EVpo7Ff5PwbZuILb4QAq7IZoKzIEQA==}
'@colors/colors@1.5.0': '@colors/colors@1.5.0':
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
@@ -1807,9 +1768,6 @@ packages:
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'} engines: {node: '>=12'}
'@emnapi/runtime@1.11.3':
resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
'@emnapi/runtime@1.8.1': '@emnapi/runtime@1.8.1':
resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==}
@@ -2137,9 +2095,6 @@ packages:
'@floating-ui/utils@0.2.12': '@floating-ui/utils@0.2.12':
resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==}
'@floating-ui/vue@1.1.11':
resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==}
'@floating-ui/vue@1.1.9': '@floating-ui/vue@1.1.9':
resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==} resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==}
@@ -2183,285 +2138,139 @@ packages:
resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
engines: {node: '>=18'} engines: {node: '>=18'}
'@img/colour@1.1.0':
resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
engines: {node: '>=18'}
'@img/sharp-darwin-arm64@0.34.5': '@img/sharp-darwin-arm64@0.34.5':
resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@img/sharp-darwin-arm64@0.35.2':
resolution: {integrity: sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==}
engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [darwin]
'@img/sharp-darwin-x64@0.34.5': '@img/sharp-darwin-x64@0.34.5':
resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@img/sharp-darwin-x64@0.35.2':
resolution: {integrity: sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==}
engines: {node: '>=20.9.0'}
cpu: [x64]
os: [darwin]
'@img/sharp-freebsd-wasm32@0.35.2':
resolution: {integrity: sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==}
engines: {node: '>=20.9.0'}
os: [freebsd]
'@img/sharp-libvips-darwin-arm64@1.2.4': '@img/sharp-libvips-darwin-arm64@1.2.4':
resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@img/sharp-libvips-darwin-arm64@1.3.1':
resolution: {integrity: sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==}
cpu: [arm64]
os: [darwin]
'@img/sharp-libvips-darwin-x64@1.2.4': '@img/sharp-libvips-darwin-x64@1.2.4':
resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@img/sharp-libvips-darwin-x64@1.3.1':
resolution: {integrity: sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==}
cpu: [x64]
os: [darwin]
'@img/sharp-libvips-linux-arm64@1.2.4': '@img/sharp-libvips-linux-arm64@1.2.4':
resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@img/sharp-libvips-linux-arm64@1.3.1':
resolution: {integrity: sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==}
cpu: [arm64]
os: [linux]
'@img/sharp-libvips-linux-arm@1.2.4': '@img/sharp-libvips-linux-arm@1.2.4':
resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@img/sharp-libvips-linux-arm@1.3.1':
resolution: {integrity: sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==}
cpu: [arm]
os: [linux]
'@img/sharp-libvips-linux-ppc64@1.2.4': '@img/sharp-libvips-linux-ppc64@1.2.4':
resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
'@img/sharp-libvips-linux-ppc64@1.3.1':
resolution: {integrity: sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==}
cpu: [ppc64]
os: [linux]
'@img/sharp-libvips-linux-riscv64@1.2.4': '@img/sharp-libvips-linux-riscv64@1.2.4':
resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@img/sharp-libvips-linux-riscv64@1.3.1':
resolution: {integrity: sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==}
cpu: [riscv64]
os: [linux]
'@img/sharp-libvips-linux-s390x@1.2.4': '@img/sharp-libvips-linux-s390x@1.2.4':
resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@img/sharp-libvips-linux-s390x@1.3.1':
resolution: {integrity: sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==}
cpu: [s390x]
os: [linux]
'@img/sharp-libvips-linux-x64@1.2.4': '@img/sharp-libvips-linux-x64@1.2.4':
resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-libvips-linux-x64@1.3.1':
resolution: {integrity: sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==}
cpu: [x64]
os: [linux]
'@img/sharp-libvips-linuxmusl-arm64@1.2.4': '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@img/sharp-libvips-linuxmusl-arm64@1.3.1':
resolution: {integrity: sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==}
cpu: [arm64]
os: [linux]
'@img/sharp-libvips-linuxmusl-x64@1.2.4': '@img/sharp-libvips-linuxmusl-x64@1.2.4':
resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-libvips-linuxmusl-x64@1.3.1':
resolution: {integrity: sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==}
cpu: [x64]
os: [linux]
'@img/sharp-linux-arm64@0.34.5': '@img/sharp-linux-arm64@0.34.5':
resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@img/sharp-linux-arm64@0.35.2':
resolution: {integrity: sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==}
engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [linux]
'@img/sharp-linux-arm@0.34.5': '@img/sharp-linux-arm@0.34.5':
resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@img/sharp-linux-arm@0.35.2':
resolution: {integrity: sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==}
engines: {node: '>=20.9.0'}
cpu: [arm]
os: [linux]
'@img/sharp-linux-ppc64@0.34.5': '@img/sharp-linux-ppc64@0.34.5':
resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
'@img/sharp-linux-ppc64@0.35.2':
resolution: {integrity: sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==}
engines: {node: '>=20.9.0'}
cpu: [ppc64]
os: [linux]
'@img/sharp-linux-riscv64@0.34.5': '@img/sharp-linux-riscv64@0.34.5':
resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@img/sharp-linux-riscv64@0.35.2':
resolution: {integrity: sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==}
engines: {node: '>=20.9.0'}
cpu: [riscv64]
os: [linux]
'@img/sharp-linux-s390x@0.34.5': '@img/sharp-linux-s390x@0.34.5':
resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@img/sharp-linux-s390x@0.35.2':
resolution: {integrity: sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==}
engines: {node: '>=20.9.0'}
cpu: [s390x]
os: [linux]
'@img/sharp-linux-x64@0.34.5': '@img/sharp-linux-x64@0.34.5':
resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-linux-x64@0.35.2':
resolution: {integrity: sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==}
engines: {node: '>=20.9.0'}
cpu: [x64]
os: [linux]
'@img/sharp-linuxmusl-arm64@0.34.5': '@img/sharp-linuxmusl-arm64@0.34.5':
resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@img/sharp-linuxmusl-arm64@0.35.2':
resolution: {integrity: sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==}
engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [linux]
'@img/sharp-linuxmusl-x64@0.34.5': '@img/sharp-linuxmusl-x64@0.34.5':
resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-linuxmusl-x64@0.35.2':
resolution: {integrity: sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==}
engines: {node: '>=20.9.0'}
cpu: [x64]
os: [linux]
'@img/sharp-wasm32@0.34.5': '@img/sharp-wasm32@0.34.5':
resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [wasm32] cpu: [wasm32]
'@img/sharp-wasm32@0.35.2':
resolution: {integrity: sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==}
engines: {node: '>=20.9.0'}
'@img/sharp-webcontainers-wasm32@0.35.2':
resolution: {integrity: sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==}
engines: {node: '>=20.9.0'}
cpu: [wasm32]
'@img/sharp-win32-arm64@0.34.5': '@img/sharp-win32-arm64@0.34.5':
resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@img/sharp-win32-arm64@0.35.2':
resolution: {integrity: sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==}
engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [win32]
'@img/sharp-win32-ia32@0.34.5': '@img/sharp-win32-ia32@0.34.5':
resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
'@img/sharp-win32-ia32@0.35.2':
resolution: {integrity: sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==}
engines: {node: ^20.9.0}
cpu: [ia32]
os: [win32]
'@img/sharp-win32-x64@0.34.5': '@img/sharp-win32-x64@0.34.5':
resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@img/sharp-win32-x64@0.35.2':
resolution: {integrity: sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==}
engines: {node: '>=20.9.0'}
cpu: [x64]
os: [win32]
'@inquirer/ansi@1.0.2': '@inquirer/ansi@1.0.2':
resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
@@ -2596,11 +2405,11 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@internationalized/date@3.12.4': '@internationalized/date@3.12.2':
resolution: {integrity: sha512-M1dEn4c1U1HsSlaVR8upZtSqvXrTkHDfv18H01uCSJyjVLDxnBR38v/fMxecmlwXKR4i9HeZcmgQAPE6A+aGJQ==} resolution: {integrity: sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==}
'@internationalized/number@3.6.8': '@internationalized/number@3.6.7':
resolution: {integrity: sha512-8UmMFia46DUt+k97zKd9fKWXcWHR+k8ae3eYzILETuT2KbIvLyOfac7zesw+sJdRAAZ7Q9pM1Mk22aXp2LD0Ig==} resolution: {integrity: sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==}
'@jahands/cli-tools@0.11.5': '@jahands/cli-tools@0.11.5':
resolution: {integrity: sha512-h3h6hXJ7TgQxP90EaxOpP+WV9ki8OF3AGclF8062YWWTKP1z3FP1fvxV03afh/+zrkVpclrrUKsQqNRWwq9M7w==} resolution: {integrity: sha512-h3h6hXJ7TgQxP90EaxOpP+WV9ki8OF3AGclF8062YWWTKP1z3FP1fvxV03afh/+zrkVpclrrUKsQqNRWwq9M7w==}
@@ -2633,8 +2442,8 @@ packages:
'@lezer/common@1.5.2': '@lezer/common@1.5.2':
resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==} resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==}
'@lezer/css@1.3.6': '@lezer/css@1.3.4':
resolution: {integrity: sha512-YJE78Wcg+zX8f10hiHWQ4Az48Qr/c13eId0VtRQYLBpxHDmDeSrXIlkbl+fJGW42rWC/uoUco9mhBZeVWP/A1g==} resolution: {integrity: sha512-N+tn9tej2hPvyKgHEApMOQfHczDJCwxrRFS3SPn9QjYN+uwHvEDnCgKRrb3mxDYxRS8sKMM8fhC3+lc04Abz5Q==}
'@lezer/highlight@1.2.3': '@lezer/highlight@1.2.3':
resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==}
@@ -2657,8 +2466,8 @@ packages:
'@lezer/yaml@1.0.4': '@lezer/yaml@1.0.4':
resolution: {integrity: sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==} resolution: {integrity: sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==}
'@marijn/find-cluster-break@1.0.4': '@marijn/find-cluster-break@1.0.3':
resolution: {integrity: sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==} resolution: {integrity: sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==}
'@opentelemetry/api@1.9.0': '@opentelemetry/api@1.9.0':
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
@@ -2955,99 +2764,99 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@scalar/agent-chat@0.12.29': '@scalar/agent-chat@0.12.22':
resolution: {integrity: sha512-sZH6XDqhyF6X5hRSOOdlWuwV1MM2xxhLmY3OZiJFnvkLHKQNiFl6aWCxFIBkpgSxhAaXly+U2u41FjARN9rPTw==} resolution: {integrity: sha512-TQ4K8DOPMzRSwFWEVuJp7a+JQoiPD4WxbG0d7sJilC1dgtdDS6efRmadh87eRa17N+06xWfx5EcXg8hDrfKAFw==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/api-client@3.17.0': '@scalar/api-client@3.13.7':
resolution: {integrity: sha512-7YLNYCfQAWtnQyu958KOEgSTW4gKhjEyrIsghUPmXfTM5Lbz5bRdPbsqIuGiHQ6kJUmGWCjPUw1KaonkiTAidA==} resolution: {integrity: sha512-bd+2nI27gnfCgzCGEP13u7rd2IlNdAB+Rx+CX0i29UXEu6SVxWpv5hBVrLLTQebfNzcUk9Evr+NkIX/WjSHp0Q==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/api-reference@1.67.0': '@scalar/api-reference@1.63.0':
resolution: {integrity: sha512-GBgsAKP9kmGbaUVZLlCeOK6QNVB/HKwfefvpRviiWsf1Qq3B4LHTrnQuZnfeojfoCqDXu2mldh8G8jSEaycpMA==} resolution: {integrity: sha512-ie2DfrOeElmaVmY/xHd3aMfUpA5ApBDuPHYbcypn01l7rQPGQMFjPa7GX4QNzp4tgjnEMX3X9BYKSkyMQtH5ng==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/asyncapi-upgrader@0.1.8': '@scalar/asyncapi-upgrader@0.1.4':
resolution: {integrity: sha512-aotwerUUVKzvjgeyLseVIb93OHgwPYYUIOM/iUhQChhb7F24H5RhMrKVlQkQUhqWwvYue3mJOpT4or3zerFEiw==} resolution: {integrity: sha512-pyAoyuFVlUf+ZThiuHAShV4lyF9LlPab5AJrvoER8JBz00bHF1NWiGveYySRcNcvke5U5nWCr7NxtiMIokP8sA==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/blocks@0.1.15': '@scalar/blocks@0.1.8':
resolution: {integrity: sha512-SltVGWkIsesLDTfoSWbE+xHmqxtSAjAmdvb7m69C8hc7uslul9TloI6/UxkCIpcWsDoP/NEY+ioJz50qBpsDPg==} resolution: {integrity: sha512-I0bOMnb8+8cjboaRMWz4Vo16rcYu8+4tzLIpPeJHsJs4I5OaIIgaoNHRPaWDip9ZrqbD4m1I2gMDJmpJU/hEmA==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/code-highlight@0.4.5': '@scalar/code-highlight@0.4.3':
resolution: {integrity: sha512-OCZvBYwodCR1cWemO3MXMwXumI18kFOy8k2nwP+Ic8zFLK1ObyXECRoM+UH+GTw+O4TJsrjNIdLjsnXPO1MvyA==} resolution: {integrity: sha512-uueW22siajrJUtszH+k/PmABqau2MmJzajpEFTPapK7Zak167xcKUIjcMbFFFgW8SGKLMSVzLkuB/VNDbOHuOg==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/components@0.29.0': '@scalar/components@0.27.9':
resolution: {integrity: sha512-sSXagAIOgVCZQnZDfQHDZqpA88UYbSFlL9+hC0hJuhzs1kIRWHfxjqV/MFkTxyDc04AuGyKHruONe8Z0hTak5g==} resolution: {integrity: sha512-AoUTHwTfVc44zZbZnridPd7mp8lhe2LgX9KeyKw5keFlhLY1MzQv9OuXD7riLbJPrFFF/7lbqCLEpyG6vWSXQg==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/helpers@0.11.2': '@scalar/helpers@0.9.2':
resolution: {integrity: sha512-IgHW/hIj1XAvsPIBKiOgmK87qbyDjaQQg9S/auXU4MUtvnwKKpOeIOJc0NC71FkMdr4Mok0SSVI748cmlptoXQ==} resolution: {integrity: sha512-hjyMpMZjTBZQhyByZmz5oUgRKUQJO5V5AOiJxsVEGbUmgA7sJRQeTrXLB+BEwzaKS5nm2opJeNyMBYLFNK4hiQ==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/icons@0.7.6': '@scalar/icons@0.7.5':
resolution: {integrity: sha512-UIQ7K/xNDo7Mgez/Z+ArG7JZnS8QRZNOl+s9frdS1T8uEJYuTqT1lnS7R0ECwIw3y6dn6EIfjaZKPihjYC7+qw==} resolution: {integrity: sha512-kWYkjmYlHzrZ+31d8L1uJpVeil6r1xNcyR+MewnxFslpMBCDIeo9udhYzg09v8s6nWKxwuPokhdQPLbKS+SSgg==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/json-magic@0.13.3': '@scalar/json-magic@0.12.19':
resolution: {integrity: sha512-ONbveMHPl8ashCnTH/IzF2skr7CKUAC97m2tWQpbWJXhkUvc/B9vSRirjM0IqPCDURn4WZWAQFoaehDiEJICWA==} resolution: {integrity: sha512-1T4QoFYZ1nKt25xFeHtghAuZzaLq2X4CpCSLFXG0Fjcz6K2HIZqo+RtywfI0WD8RRRRgS34keo7X4Gv1BQUNoQ==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/oas-utils@0.19.15': '@scalar/oas-utils@0.19.8':
resolution: {integrity: sha512-hGaCIIqwiHUDdTKQPdrwa9vDe8gLXydYeBfiLjkHFpZer+ibDgLclQdI31l777L5Rs7ga2abFTzaZSJ3bPNgUw==} resolution: {integrity: sha512-A/bGTqthxnsgoveQ7Xomxtwk0JQ7V/cweaxz/Dhp9/JmvnAnjBjpcG050gcC1EuVkHhJL1sPH2+IczS9liQQ3A==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/openapi-types@0.9.5': '@scalar/openapi-types@0.9.3':
resolution: {integrity: sha512-czrz/zkVm1oPzrpYo3hI/iymfiw1s4dgJiQtwNi2U77Sqf3EQOGKsif4VNRa5suWMYRuPaFx5EiFM1FNEV4Whg==} resolution: {integrity: sha512-34qglt5jSo55iZfH9i7EhjQCdE0Po2xZeh8wytQKolSnXrxsYMSyFDJEBxz1Gaew4on9N3XIWsd0QpwKVA5CSA==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/openapi-upgrader@0.2.15': '@scalar/openapi-upgrader@0.2.11':
resolution: {integrity: sha512-yqROK9U96ElasEL4Wl/+PIjQZlqrQXVUUpXk9PA6xBnrp8KdEv7at8pR5gsZkvddJfYVwLILPlctyqUg4u4YZA==} resolution: {integrity: sha512-eYEFBO8mZfgXEO/hv8rdL5OA4oOB8orFT5kXNK4I/x9xca2D7A4BteuFXqRaw9lE1CIjtG+StlAUYVz5omTXew==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/schemas@0.8.4': '@scalar/schemas@0.7.4':
resolution: {integrity: sha512-gbx/UjAswjJc+OZp/vcVRIopjqoJ62pOkrKLvVHa1MuMRoVxcPyNzW2/SQmnvdJku7C7a6PsKaPUQ6gZXGA4eg==} resolution: {integrity: sha512-Or31zxR+ceGGhkVU5XBO2Zv7oyGDtjsJOjM2Rr0WRZ1/tRsQc2/FsVv+9kPmCA7sqFL8BKWlNfTXcPITI7WRHw==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/sidebar@0.11.0': '@scalar/sidebar@0.9.33':
resolution: {integrity: sha512-eTl8goJs/HBSVgrIp0HfP3GUnxNA1mcVrACBOdKcoptrh+cZpEBU+/7LtKC6PwHvkujn+87wvCW/eERTdYn2vw==} resolution: {integrity: sha512-y00qMs6dPu4Te+OuyyGSg0hGWTPsnUrn7juErtF4bOIse2w9BM1rHkYZWSdEL/afYv27x1wMBZJwAReiUeHguA==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/snippetz@0.9.29': '@scalar/snippetz@0.9.23':
resolution: {integrity: sha512-elv4AZWWY/v/f9g9QqQY2P3UekpRdpe1w0ECDCXNHvVBU2cherdU5FNnjiPYZOb52r3T2i92WVnXSFXh0CYSPw==} resolution: {integrity: sha512-bjahBX9J7VQsOpDERMPZSPuIKZmz1DEh9NHdCE5dEe6uz1rHicai0Zqjpuduw6DVDVyWrDI0trxPzCqGzpj0oQ==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/themes@0.17.4': '@scalar/themes@0.17.1':
resolution: {integrity: sha512-tSCtGLb0noijR8GzgH6H/tlbSuZoLupe66ta6I9FzZxdvgj4SdPM+2Q7E8k1uwPRfrE5NvMyp61s1BsA3DTFsg==} resolution: {integrity: sha512-aqR6o44CpDvgVT6dHlc1/56JRdWUrbNgaLyHKEd1KC/+Gcznix9Ud0fW7cKw2VvNgPgcqlO+MhZIrYHwbkNMew==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/typebox@0.1.3': '@scalar/typebox@0.1.3':
resolution: {integrity: sha512-lU055AUccECZMIfGA0z/C1StYmboAYIPJLDFBzOO81yXBi35Pxdq+I4fWX6iUZ8qcoHneiLGk9jAUM1rA93iEg==} resolution: {integrity: sha512-lU055AUccECZMIfGA0z/C1StYmboAYIPJLDFBzOO81yXBi35Pxdq+I4fWX6iUZ8qcoHneiLGk9jAUM1rA93iEg==}
'@scalar/types@0.18.3': '@scalar/types@0.16.4':
resolution: {integrity: sha512-hPLLxVt/ah4RpCVp5UrLEpnBEgTwf+RvPtRiSEty3QqfBJUfADMXHz+oWK6UAa/vALg2AWuJLCD8hRlyQ2ET9w==} resolution: {integrity: sha512-fLf0ANAC3iQq0sIVdmH6aGM+pFSLyD8GfGBxSWcLpI0jE0iFAzX2A3p0qVZm7vqBT4TQnn0fSwg5U+h+FZ52BA==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/use-codemirror@0.14.15': '@scalar/use-codemirror@0.14.14':
resolution: {integrity: sha512-Uvjx0qvOsWPs+I32FL+3v//+VKwtp8ROXgbIAMauNypuw52VeF7R4RM7YoN2Xg1EAEiMtM8ZhWVzCoYTFr6AKQ==} resolution: {integrity: sha512-A7Exfctudg7d3DeQFSSrZYc6yhrEsLX3Iq6GJ7m7ruqgev9y8Hbx7g8yvZWYRQuMUdFtLH5euP7a1ZwM8OrHKA==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/use-hooks@0.4.10': '@scalar/use-hooks@0.4.9':
resolution: {integrity: sha512-YDIohEujqRmPCLpRlE+NTzjKPjeMJZtI4oJcZ5uH2vA1gR8wiaEStK8djBsldOFIn+LmhHagl+HHn6NX054f7Q==} resolution: {integrity: sha512-RnflJ178BPdH7pKY9/YBcRlhyc7uJxtqG4hBbi8IPEM4YkpLHcMmxWKgHAgC3MBc21rpuKKBE+DTJOiYmU+UyA==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/use-toasts@0.10.5': '@scalar/use-toasts@0.10.4':
resolution: {integrity: sha512-5a8qTVd9eXvMDeD0ifqHvnzg0i2v15clhyFToXDHYmInQD51oBRwByCFqFO+m9ymxSLOHZ7/FiEcU6F90/QTlg==} resolution: {integrity: sha512-OHXkVfFKV0qx2WpKlzUpvIUkoA/PiloBcXe6soX2S/1z/D042QlKO8rNxkuC3Hlamvyvj8ru8XN17XNl+D0OPg==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@scalar/validation@0.6.3': '@scalar/validation@0.6.2':
resolution: {integrity: sha512-j3s9XPv8Wo1EG5/naBi4XGF0uXYQ2A3QZNI0NKWgCMxRHVrDJGlZEYymcHDHY7fquRm73P8U3c8xqJqB5yad6w==} resolution: {integrity: sha512-Sc1TkcwGV6aVCO51AyKeaGiP8gpwAHxEtO5d3tZzPV+KsnlC/YokQxFxwBrbIXw73k9hmcExnJyGu3k5i6n6VA==}
engines: {node: '>=20'} engines: {node: '>=20'}
'@scalar/workspace-store@0.59.0': '@scalar/workspace-store@0.55.6':
resolution: {integrity: sha512-5/vMoUbOhNDj2azgnrXbatbthCKSt7eQOLwUp0Tua/mnouXcemJXNfMw+dBQHykSH0Ga8DjcA/hVxU0Xmaymdg==} resolution: {integrity: sha512-l7yuW1XplVRu+bqN7Mt+XtMovuKRBOHSGb00e+nEvjkkL1WIFd6pMJCogYt0ZlLvyLFPbWODWA4oG6LZjr7ijQ==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@sindresorhus/is@7.0.2': '@sindresorhus/is@7.0.2':
@@ -3124,11 +2933,11 @@ packages:
'@swc/helpers@0.5.23': '@swc/helpers@0.5.23':
resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==}
'@tanstack/virtual-core@3.17.8': '@tanstack/virtual-core@3.17.5':
resolution: {integrity: sha512-BfEvehNpOT75r5Ksc5xW6NZuXujTfb7nlSEyVu4XHG3gdxNg1KqXruWbDewXOUaUYIo4oRbSfkjIajz4MAT8tA==} resolution: {integrity: sha512-AXfBC3sq6PuYSwyxYORqqgHCNjPGAvKJvZuBBJ1klhztWBB5cgqgwsq8+fNfaQJG7/K4xYBja9S90QFn2zmQAg==}
'@tanstack/vue-virtual@3.13.36': '@tanstack/vue-virtual@3.13.33':
resolution: {integrity: sha512-gKpExv4RbB9luVG+SucTXoqPZv/gzu/Yvz6BNO+8kpNxJ2x+I/ulryzl5W9BRciahZGp5Tls3Dp5XP1ztVGbMw==} resolution: {integrity: sha512-R1j/o/5pdgzDqV3Us/s7VEV1Il6ocTsElKxK9g04rq66V3m7kIULgKXD04BAQwCO0IMemXsw3ex6LSH4ug3Feg==}
peerDependencies: peerDependencies:
vue: ^2.7.0 || ^3.0.0 vue: ^2.7.0 || ^3.0.0
@@ -3290,11 +3099,11 @@ packages:
engines: {node: '>=16.20.0'} engines: {node: '>=16.20.0'}
hasBin: true hasBin: true
'@ungap/structured-clone@1.4.0': '@ungap/structured-clone@1.3.3':
resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==}
'@unhead/vue@2.1.17': '@unhead/vue@2.1.16':
resolution: {integrity: sha512-pnC8x9HLV3qQXdvWfylUEU25uhfCAy3ly9nmpQz84j9py818DRfU8jOsQ5wjdWtxyU1vX/fW2udfm4jtxUK8Bg==} resolution: {integrity: sha512-t6QykImeMJcrUTbFB0Coy0cB/OZItHdQFRFLoH8GAVXKWmQORGPrwvueP9me7adOCuMH2uVvrv0nCkbi6zksaA==}
peerDependencies: peerDependencies:
vue: '>=3.5.18' vue: '>=3.5.18'
@@ -3337,32 +3146,32 @@ packages:
'@vitest/utils@4.1.9': '@vitest/utils@4.1.9':
resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==}
'@vue/compiler-core@3.5.42': '@vue/compiler-core@3.5.40':
resolution: {integrity: sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==} resolution: {integrity: sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==}
'@vue/compiler-dom@3.5.42': '@vue/compiler-dom@3.5.40':
resolution: {integrity: sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==} resolution: {integrity: sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==}
'@vue/compiler-sfc@3.5.42': '@vue/compiler-sfc@3.5.40':
resolution: {integrity: sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==} resolution: {integrity: sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==}
'@vue/compiler-ssr@3.5.42': '@vue/compiler-ssr@3.5.40':
resolution: {integrity: sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==} resolution: {integrity: sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==}
'@vue/reactivity@3.5.42': '@vue/reactivity@3.5.40':
resolution: {integrity: sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==} resolution: {integrity: sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==}
'@vue/runtime-core@3.5.42': '@vue/runtime-core@3.5.40':
resolution: {integrity: sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==} resolution: {integrity: sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==}
'@vue/runtime-dom@3.5.42': '@vue/runtime-dom@3.5.40':
resolution: {integrity: sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==} resolution: {integrity: sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==}
'@vue/server-renderer@3.5.42': '@vue/server-renderer@3.5.40':
resolution: {integrity: sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==} resolution: {integrity: sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==}
'@vue/shared@3.5.42': '@vue/shared@3.5.40':
resolution: {integrity: sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==} resolution: {integrity: sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==}
'@vueuse/core@10.11.1': '@vueuse/core@10.11.1':
resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==}
@@ -3631,8 +3440,8 @@ packages:
estree-walker@3.0.3: estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
eventsource-parser@3.1.1: eventsource-parser@3.1.0:
resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
expect-type@1.4.0: expect-type@1.4.0:
@@ -3654,8 +3463,8 @@ packages:
picomatch: picomatch:
optional: true optional: true
flatted@3.4.4: flatted@3.4.2:
resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
focus-trap@7.8.0: focus-trap@7.8.0:
resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==}
@@ -3739,12 +3548,8 @@ packages:
hastscript@9.0.1: hastscript@9.0.1:
resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
highlight.js@11.11.2: highlight.js@11.11.1:
resolution: {integrity: sha512-oaXMACAU0kzOMXBjWpNcX+vlwSBCIAiZ9BHa7gA15NOTtT2L/l8OSZDuqS2XppOhZBPJ7hm4o8ep2kyuip2uEQ==} resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
engines: {node: '>=12.0.0'}
highlight.js@11.12.0:
resolution: {integrity: sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
hono-openapi@1.3.1: hono-openapi@1.3.1:
@@ -3762,8 +3567,8 @@ packages:
hono: hono:
optional: true optional: true
hono@4.13.5: hono@4.12.27:
resolution: {integrity: sha512-O6+/eCYRkzzzy0rPWwKLiGBR1nFuUPZynnwjxN1MBA62NNqbT0wQEzQyK2gSO5yDIDB336sXQleAhOHrzlYyKw==} resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==}
engines: {node: '>=16.9.0'} engines: {node: '>=16.9.0'}
hookable@6.1.1: hookable@6.1.1:
@@ -3818,8 +3623,8 @@ packages:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true hasBin: true
js-base64@3.9.3: js-base64@3.9.1:
resolution: {integrity: sha512-uwYQp+VJ38FVvtim6qNbit6e9uT6dwWQ4Y1+H9TxhW5hcHjpHwoxlR0nMpqUmIFOmu4VqMxwdJA88gIVuZJQ/g==} resolution: {integrity: sha512-U73qptcvf/HIOauFOmqT3a0mDUp0MYlfd15oqoe9kqZt5XhiXVb+HG09sLvI9PQ9tZIBFS4nlErai8zbWazP0g==}
js-tokens@4.0.0: js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -3966,8 +3771,8 @@ packages:
memoize-one@6.0.0: memoize-one@6.0.0:
resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
microdiff@1.6.0: microdiff@1.5.0:
resolution: {integrity: sha512-w7JWt8Bno6I8h0rEqlxr4lNG4UbT1FVtWo42wWosIiaJ+rP3pXh7shCYDnyqBrYx36LJ1CZ64p8A62aVp0sJpQ==} resolution: {integrity: sha512-Drq+/THMvDdzRYrK0oxJmOKiC24ayUV8ahrt8l3oRK51PWt6gdtrIGrlIH3pT/lFh1z93FbAcidtsHcWbnRz8Q==}
micromark-core-commonmark@2.0.3: micromark-core-commonmark@2.0.3:
resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
@@ -4063,10 +3868,6 @@ packages:
engines: {node: '>=22.0.0'} engines: {node: '>=22.0.0'}
hasBin: true hasBin: true
miniflare@5.20260831.0-alpha:
resolution: {integrity: sha512-Hwgh1VDUiPCPGQKODQfUmy7hRAje1D55icB+9png3ueiM64rlSM87nSrtqpxAD+DlLWI4ehnYBuECaXV43zGmQ==}
engines: {node: '>=22.0.0'}
ms@2.1.3: ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -4079,8 +3880,8 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true hasBin: true
nanoid@3.3.18: nanoid@3.3.16:
resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true hasBin: true
@@ -4156,8 +3957,8 @@ packages:
resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
postcss@8.5.26: postcss@8.5.20:
resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} resolution: {integrity: sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
prettier-plugin-packagejson@3.0.2: prettier-plugin-packagejson@3.0.2:
@@ -4179,8 +3980,8 @@ packages:
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
pretty-ms@9.3.1: pretty-ms@9.3.0:
resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==} resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
property-information@7.2.0: property-information@7.2.0:
@@ -4272,10 +4073,6 @@ packages:
resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
sharp@0.35.2:
resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==}
engines: {node: '>=20.9.0'}
siginfo@2.0.0: siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
@@ -4457,8 +4254,8 @@ packages:
resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
engines: {node: '>=16'} engines: {node: '>=16'}
type-fest@5.9.0: type-fest@5.8.0:
resolution: {integrity: sha512-yANm3Jr3GiJ1qgJlxGAVxTOIcEOk1rhQHamlXtnrCK7EHP4HeM9OGxtMg/W7HFdrVzw/ZWJKGVIJusVH85sLtw==} resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==}
engines: {node: '>=20'} engines: {node: '>=20'}
typescript@6.0.3: typescript@6.0.3:
@@ -4476,15 +4273,11 @@ packages:
resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==}
engines: {node: '>=20.18.1'} engines: {node: '>=20.18.1'}
undici@7.29.0:
resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==}
engines: {node: '>=20.18.1'}
unenv@2.0.0-rc.24: unenv@2.0.0-rc.24:
resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==}
unhead@2.1.17: unhead@2.1.16:
resolution: {integrity: sha512-HLMKXOszRhAPBrr6VlqCeVeJq2kbC4kXwzGLEZvvojPLWNYTJw22xG7Bfwhsvs31+IBet3Wl8ADg9dwYdyphfQ==} resolution: {integrity: sha512-cD2Q4a6SQHhW9/bPp17NT4GJ1yS0DSLe75WEHKQ8bKa/wjB6cIki3KeL86hhllNBcpv8i6bxdwtwQunneXPqKQ==}
unified@11.0.5: unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
@@ -4603,8 +4396,8 @@ packages:
jsdom: jsdom:
optional: true optional: true
vue-component-type-helpers@3.3.11: vue-component-type-helpers@3.3.7:
resolution: {integrity: sha512-LwcxzeliO9fkQcpJG0PoX8X5kmAhKmH9wkpDLxNabwzkQ9Zeib2YVHwFV4pcWmMLfXVfjr/dSV+DaJ3cIPgSNA==} resolution: {integrity: sha512-Skkhw9agYSgsWqv7bxSOGJZa9SaiJbZVGdXuFWnrzKaQYHnw9qbjD630rw6RyMqDbp54nfLCLw5SZA55if7JLg==}
vue-demi@0.14.10: vue-demi@0.14.10:
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
@@ -4620,8 +4413,8 @@ packages:
vue-sonner@1.3.2: vue-sonner@1.3.2:
resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==} resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==}
vue@3.5.42: vue@3.5.40:
resolution: {integrity: sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==} resolution: {integrity: sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
peerDependenciesMeta: peerDependenciesMeta:
@@ -4652,11 +4445,6 @@ packages:
engines: {node: '>=16'} engines: {node: '>=16'}
hasBin: true hasBin: true
workerd@1.20260831.1:
resolution: {integrity: sha512-A2LwrkBel/FnKABPfeBAMiL6v70+rugnunqQRfWsWZjlhsTZoBScWUVunMy/xLCGLjWCQL2zp39AVR6aO0jurQ==}
engines: {node: '>=16'}
hasBin: true
workers-tagged-logger@1.0.1: workers-tagged-logger@1.0.1:
resolution: {integrity: sha512-D/MHPg7lnrKCPRRsa7rWF8v6dANIT/sPKe8/xd5Kb3JcsGayx53Djvnsfli7fm/DqRpRRTKdmKAKMMuvjr//5Q==} resolution: {integrity: sha512-D/MHPg7lnrKCPRRsa7rWF8v6dANIT/sPKe8/xd5Kb3JcsGayx53Djvnsfli7fm/DqRpRRTKdmKAKMMuvjr//5Q==}
@@ -4670,16 +4458,6 @@ packages:
'@cloudflare/workers-types': '@cloudflare/workers-types':
optional: true optional: true
wrangler@4.128.0:
resolution: {integrity: sha512-jNXy9e8/pbx8iqTzXPiuflnitKJZoAfEUSUUDLW87bwyeMvJ7kb3yQMSbxEcfNdfHqJW38KRcKaLljOYV4N/4w==}
engines: {node: '>=22.0.0'}
hasBin: true
peerDependencies:
'@cloudflare/workers-types': ^5.20260831.1
peerDependenciesMeta:
'@cloudflare/workers-types':
optional: true
wrap-ansi@6.2.0: wrap-ansi@6.2.0:
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -4720,9 +4498,6 @@ packages:
zod@4.4.3: zod@4.4.3:
resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
zod@4.5.4:
resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==}
zwitch@2.0.4: zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@@ -4735,30 +4510,30 @@ snapshots:
'@2toad/profanity@3.3.0': {} '@2toad/profanity@3.3.0': {}
'@ai-sdk/gateway@3.0.13(zod@4.5.4)': '@ai-sdk/gateway@3.0.13(zod@4.4.3)':
dependencies: dependencies:
'@ai-sdk/provider': 3.0.2 '@ai-sdk/provider': 3.0.2
'@ai-sdk/provider-utils': 4.0.5(zod@4.5.4) '@ai-sdk/provider-utils': 4.0.5(zod@4.4.3)
'@vercel/oidc': 3.1.0 '@vercel/oidc': 3.1.0
zod: 4.5.4 zod: 4.4.3
'@ai-sdk/provider-utils@4.0.5(zod@4.5.4)': '@ai-sdk/provider-utils@4.0.5(zod@4.4.3)':
dependencies: dependencies:
'@ai-sdk/provider': 3.0.2 '@ai-sdk/provider': 3.0.2
'@standard-schema/spec': 1.1.0 '@standard-schema/spec': 1.1.0
eventsource-parser: 3.1.1 eventsource-parser: 3.1.0
zod: 4.5.4 zod: 4.4.3
'@ai-sdk/provider@3.0.2': '@ai-sdk/provider@3.0.2':
dependencies: dependencies:
json-schema: 0.4.0 json-schema: 0.4.0
'@ai-sdk/vue@3.0.33(vue@3.5.42(typescript@6.0.3))(zod@4.5.4)': '@ai-sdk/vue@3.0.33(vue@3.5.40(typescript@6.0.3))(zod@4.4.3)':
dependencies: dependencies:
'@ai-sdk/provider-utils': 4.0.5(zod@4.5.4) '@ai-sdk/provider-utils': 4.0.5(zod@4.4.3)
ai: 6.0.33(zod@4.5.4) ai: 6.0.33(zod@4.4.3)
swrv: 1.2.0(vue@3.5.42(typescript@6.0.3)) swrv: 1.2.0(vue@3.5.40(typescript@6.0.3))
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
transitivePeerDependencies: transitivePeerDependencies:
- zod - zod
@@ -4845,10 +4620,6 @@ snapshots:
dependencies: dependencies:
'@babel/types': 7.29.7 '@babel/types': 7.29.7
'@babel/parser@7.29.8':
dependencies:
'@babel/types': 7.29.8
'@babel/plugin-transform-destructuring@8.0.1(@babel/core@7.29.7)': '@babel/plugin-transform-destructuring@8.0.1(@babel/core@7.29.7)':
dependencies: dependencies:
'@babel/core': 7.29.7 '@babel/core': 7.29.7
@@ -4893,11 +4664,6 @@ snapshots:
'@babel/helper-string-parser': 7.29.7 '@babel/helper-string-parser': 7.29.7
'@babel/helper-validator-identifier': 7.29.7 '@babel/helper-validator-identifier': 7.29.7
'@babel/types@7.29.8':
dependencies:
'@babel/helper-string-parser': 7.29.7
'@babel/helper-validator-identifier': 7.29.7
'@cf-wasm/internals@0.1.2': {} '@cf-wasm/internals@0.1.2': {}
'@cf-wasm/photon@0.3.6': '@cf-wasm/photon@0.3.6':
@@ -4912,19 +4678,13 @@ snapshots:
optionalDependencies: optionalDependencies:
workerd: 1.20260625.1 workerd: 1.20260625.1
'@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260831.1)': '@cloudflare/vite-plugin@1.42.0(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))(workerd@1.20260625.1)(wrangler@4.105.0(@cloudflare/workers-types@4.20260630.1))':
dependencies: dependencies:
unenv: 2.0.0-rc.24 '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260625.1)
optionalDependencies:
workerd: 1.20260831.1
'@cloudflare/vite-plugin@1.42.0(vite@6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0))(workerd@1.20260831.1)(wrangler@4.128.0)':
dependencies:
'@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260831.1)
miniflare: 4.20260617.0 miniflare: 4.20260617.0
unenv: 2.0.0-rc.24 unenv: 2.0.0-rc.24
vite: 6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0) vite: 6.4.3(@types/node@26.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(tsx@4.22.4)(yaml@2.9.0)
wrangler: 4.128.0 wrangler: 4.105.0(@cloudflare/workers-types@4.20260630.1)
ws: 8.21.0 ws: 8.21.0
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
@@ -4952,79 +4712,64 @@ snapshots:
'@cloudflare/workerd-darwin-64@1.20260625.1': '@cloudflare/workerd-darwin-64@1.20260625.1':
optional: true optional: true
'@cloudflare/workerd-darwin-64@1.20260831.1':
optional: true
'@cloudflare/workerd-darwin-arm64@1.20260617.1': '@cloudflare/workerd-darwin-arm64@1.20260617.1':
optional: true optional: true
'@cloudflare/workerd-darwin-arm64@1.20260625.1': '@cloudflare/workerd-darwin-arm64@1.20260625.1':
optional: true optional: true
'@cloudflare/workerd-darwin-arm64@1.20260831.1':
optional: true
'@cloudflare/workerd-linux-64@1.20260617.1': '@cloudflare/workerd-linux-64@1.20260617.1':
optional: true optional: true
'@cloudflare/workerd-linux-64@1.20260625.1': '@cloudflare/workerd-linux-64@1.20260625.1':
optional: true optional: true
'@cloudflare/workerd-linux-64@1.20260831.1':
optional: true
'@cloudflare/workerd-linux-arm64@1.20260617.1': '@cloudflare/workerd-linux-arm64@1.20260617.1':
optional: true optional: true
'@cloudflare/workerd-linux-arm64@1.20260625.1': '@cloudflare/workerd-linux-arm64@1.20260625.1':
optional: true optional: true
'@cloudflare/workerd-linux-arm64@1.20260831.1':
optional: true
'@cloudflare/workerd-windows-64@1.20260617.1': '@cloudflare/workerd-windows-64@1.20260617.1':
optional: true optional: true
'@cloudflare/workerd-windows-64@1.20260625.1': '@cloudflare/workerd-windows-64@1.20260625.1':
optional: true optional: true
'@cloudflare/workerd-windows-64@1.20260831.1':
optional: true
'@cloudflare/workers-types@4.20260630.1': {} '@cloudflare/workers-types@4.20260630.1': {}
'@codemirror/autocomplete@6.20.3': '@codemirror/autocomplete@6.20.3':
dependencies: dependencies:
'@codemirror/language': 6.12.4 '@codemirror/language': 6.12.4
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@codemirror/view': 6.43.10 '@codemirror/view': 6.43.6
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@codemirror/commands@6.11.0': '@codemirror/commands@6.10.4':
dependencies: dependencies:
'@codemirror/language': 6.12.4 '@codemirror/language': 6.12.4
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@codemirror/view': 6.43.10 '@codemirror/view': 6.43.6
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@codemirror/lang-css@6.3.1': '@codemirror/lang-css@6.3.1':
dependencies: dependencies:
'@codemirror/autocomplete': 6.20.3 '@codemirror/autocomplete': 6.20.3
'@codemirror/language': 6.12.4 '@codemirror/language': 6.12.4
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@lezer/css': 1.3.6 '@lezer/css': 1.3.4
'@codemirror/lang-html@6.4.12': '@codemirror/lang-html@6.4.11':
dependencies: dependencies:
'@codemirror/autocomplete': 6.20.3 '@codemirror/autocomplete': 6.20.3
'@codemirror/lang-css': 6.3.1 '@codemirror/lang-css': 6.3.1
'@codemirror/lang-javascript': 6.2.5 '@codemirror/lang-javascript': 6.2.5
'@codemirror/language': 6.12.4 '@codemirror/language': 6.12.4
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@codemirror/view': 6.43.10 '@codemirror/view': 6.43.6
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@lezer/css': 1.3.6 '@lezer/css': 1.3.4
'@lezer/html': 1.3.13 '@lezer/html': 1.3.13
'@codemirror/lang-javascript@6.2.5': '@codemirror/lang-javascript@6.2.5':
@@ -5032,8 +4777,8 @@ snapshots:
'@codemirror/autocomplete': 6.20.3 '@codemirror/autocomplete': 6.20.3
'@codemirror/language': 6.12.4 '@codemirror/language': 6.12.4
'@codemirror/lint': 6.9.7 '@codemirror/lint': 6.9.7
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@codemirror/view': 6.43.10 '@codemirror/view': 6.43.6
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@lezer/javascript': 1.5.4 '@lezer/javascript': 1.5.4
@@ -5046,8 +4791,8 @@ snapshots:
dependencies: dependencies:
'@codemirror/autocomplete': 6.20.3 '@codemirror/autocomplete': 6.20.3
'@codemirror/language': 6.12.4 '@codemirror/language': 6.12.4
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@codemirror/view': 6.43.10 '@codemirror/view': 6.43.6
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@lezer/xml': 1.0.6 '@lezer/xml': 1.0.6
@@ -5055,7 +4800,7 @@ snapshots:
dependencies: dependencies:
'@codemirror/autocomplete': 6.20.3 '@codemirror/autocomplete': 6.20.3
'@codemirror/language': 6.12.4 '@codemirror/language': 6.12.4
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@lezer/highlight': 1.2.3 '@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.10 '@lezer/lr': 1.4.10
@@ -5063,8 +4808,8 @@ snapshots:
'@codemirror/language@6.12.4': '@codemirror/language@6.12.4':
dependencies: dependencies:
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@codemirror/view': 6.43.10 '@codemirror/view': 6.43.6
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@lezer/highlight': 1.2.3 '@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.10 '@lezer/lr': 1.4.10
@@ -5072,17 +4817,17 @@ snapshots:
'@codemirror/lint@6.9.7': '@codemirror/lint@6.9.7':
dependencies: dependencies:
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@codemirror/view': 6.43.10 '@codemirror/view': 6.43.6
crelt: 1.0.7 crelt: 1.0.7
'@codemirror/state@6.7.2': '@codemirror/state@6.7.1':
dependencies: dependencies:
'@marijn/find-cluster-break': 1.0.4 '@marijn/find-cluster-break': 1.0.3
'@codemirror/view@6.43.10': '@codemirror/view@6.43.6':
dependencies: dependencies:
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
crelt: 1.0.7 crelt: 1.0.7
style-mod: 4.1.3 style-mod: 4.1.3
w3c-keyname: 2.2.8 w3c-keyname: 2.2.8
@@ -5098,11 +4843,6 @@ snapshots:
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.9 '@jridgewell/trace-mapping': 0.3.9
'@emnapi/runtime@1.11.3':
dependencies:
tslib: 2.8.1
optional: true
'@emnapi/runtime@1.8.1': '@emnapi/runtime@1.8.1':
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
@@ -5277,20 +5017,11 @@ snapshots:
'@floating-ui/utils@0.2.12': {} '@floating-ui/utils@0.2.12': {}
'@floating-ui/vue@1.1.11(vue@3.5.42(typescript@6.0.3))': '@floating-ui/vue@1.1.9(vue@3.5.40(typescript@6.0.3))':
dependencies: dependencies:
'@floating-ui/dom': 1.8.0 '@floating-ui/dom': 1.8.0
'@floating-ui/utils': 0.2.12 '@floating-ui/utils': 0.2.12
vue-demi: 0.14.10(vue@3.5.42(typescript@6.0.3)) vue-demi: 0.14.10(vue@3.5.40(typescript@6.0.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
'@floating-ui/vue@1.1.9(vue@3.5.42(typescript@6.0.3))':
dependencies:
'@floating-ui/dom': 1.8.0
'@floating-ui/utils': 0.2.10
vue-demi: 0.14.10(vue@3.5.42(typescript@6.0.3))
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- vue - vue
@@ -5299,17 +5030,17 @@ snapshots:
dependencies: dependencies:
tailwindcss: 4.3.3 tailwindcss: 4.3.3
'@headlessui/vue@1.7.23(vue@3.5.42(typescript@6.0.3))': '@headlessui/vue@1.7.23(vue@3.5.40(typescript@6.0.3))':
dependencies: dependencies:
'@tanstack/vue-virtual': 3.13.36(vue@3.5.42(typescript@6.0.3)) '@tanstack/vue-virtual': 3.13.33(vue@3.5.40(typescript@6.0.3))
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
'@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5)': '@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27)':
dependencies: dependencies:
'@standard-schema/spec': 1.1.0 '@standard-schema/spec': 1.1.0
hono: 4.13.5 hono: 4.12.27
'@ianvs/prettier-plugin-sort-imports@4.7.1(@vue/compiler-sfc@3.5.42)(prettier@3.9.4)': '@ianvs/prettier-plugin-sort-imports@4.7.1(@vue/compiler-sfc@3.5.40)(prettier@3.9.4)':
dependencies: dependencies:
'@babel/generator': 7.29.7 '@babel/generator': 7.29.7
'@babel/parser': 7.29.7 '@babel/parser': 7.29.7
@@ -5318,212 +5049,106 @@ snapshots:
prettier: 3.9.4 prettier: 3.9.4
semver: 7.8.5 semver: 7.8.5
optionalDependencies: optionalDependencies:
'@vue/compiler-sfc': 3.5.42 '@vue/compiler-sfc': 3.5.40
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@img/colour@1.0.0': {} '@img/colour@1.0.0': {}
'@img/colour@1.1.0': {}
'@img/sharp-darwin-arm64@0.34.5': '@img/sharp-darwin-arm64@0.34.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.2.4 '@img/sharp-libvips-darwin-arm64': 1.2.4
optional: true optional: true
'@img/sharp-darwin-arm64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.3.1
optional: true
'@img/sharp-darwin-x64@0.34.5': '@img/sharp-darwin-x64@0.34.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-darwin-x64': 1.2.4 '@img/sharp-libvips-darwin-x64': 1.2.4
optional: true optional: true
'@img/sharp-darwin-x64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-darwin-x64': 1.3.1
optional: true
'@img/sharp-freebsd-wasm32@0.35.2':
dependencies:
'@img/sharp-wasm32': 0.35.2
optional: true
'@img/sharp-libvips-darwin-arm64@1.2.4': '@img/sharp-libvips-darwin-arm64@1.2.4':
optional: true optional: true
'@img/sharp-libvips-darwin-arm64@1.3.1':
optional: true
'@img/sharp-libvips-darwin-x64@1.2.4': '@img/sharp-libvips-darwin-x64@1.2.4':
optional: true optional: true
'@img/sharp-libvips-darwin-x64@1.3.1':
optional: true
'@img/sharp-libvips-linux-arm64@1.2.4': '@img/sharp-libvips-linux-arm64@1.2.4':
optional: true optional: true
'@img/sharp-libvips-linux-arm64@1.3.1':
optional: true
'@img/sharp-libvips-linux-arm@1.2.4': '@img/sharp-libvips-linux-arm@1.2.4':
optional: true optional: true
'@img/sharp-libvips-linux-arm@1.3.1':
optional: true
'@img/sharp-libvips-linux-ppc64@1.2.4': '@img/sharp-libvips-linux-ppc64@1.2.4':
optional: true optional: true
'@img/sharp-libvips-linux-ppc64@1.3.1':
optional: true
'@img/sharp-libvips-linux-riscv64@1.2.4': '@img/sharp-libvips-linux-riscv64@1.2.4':
optional: true optional: true
'@img/sharp-libvips-linux-riscv64@1.3.1':
optional: true
'@img/sharp-libvips-linux-s390x@1.2.4': '@img/sharp-libvips-linux-s390x@1.2.4':
optional: true optional: true
'@img/sharp-libvips-linux-s390x@1.3.1':
optional: true
'@img/sharp-libvips-linux-x64@1.2.4': '@img/sharp-libvips-linux-x64@1.2.4':
optional: true optional: true
'@img/sharp-libvips-linux-x64@1.3.1':
optional: true
'@img/sharp-libvips-linuxmusl-arm64@1.2.4': '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
optional: true optional: true
'@img/sharp-libvips-linuxmusl-arm64@1.3.1':
optional: true
'@img/sharp-libvips-linuxmusl-x64@1.2.4': '@img/sharp-libvips-linuxmusl-x64@1.2.4':
optional: true optional: true
'@img/sharp-libvips-linuxmusl-x64@1.3.1':
optional: true
'@img/sharp-linux-arm64@0.34.5': '@img/sharp-linux-arm64@0.34.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-arm64': 1.2.4 '@img/sharp-libvips-linux-arm64': 1.2.4
optional: true optional: true
'@img/sharp-linux-arm64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-arm64': 1.3.1
optional: true
'@img/sharp-linux-arm@0.34.5': '@img/sharp-linux-arm@0.34.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-arm': 1.2.4 '@img/sharp-libvips-linux-arm': 1.2.4
optional: true optional: true
'@img/sharp-linux-arm@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-arm': 1.3.1
optional: true
'@img/sharp-linux-ppc64@0.34.5': '@img/sharp-linux-ppc64@0.34.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-ppc64': 1.2.4 '@img/sharp-libvips-linux-ppc64': 1.2.4
optional: true optional: true
'@img/sharp-linux-ppc64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-ppc64': 1.3.1
optional: true
'@img/sharp-linux-riscv64@0.34.5': '@img/sharp-linux-riscv64@0.34.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-riscv64': 1.2.4 '@img/sharp-libvips-linux-riscv64': 1.2.4
optional: true optional: true
'@img/sharp-linux-riscv64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-riscv64': 1.3.1
optional: true
'@img/sharp-linux-s390x@0.34.5': '@img/sharp-linux-s390x@0.34.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-s390x': 1.2.4 '@img/sharp-libvips-linux-s390x': 1.2.4
optional: true optional: true
'@img/sharp-linux-s390x@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-s390x': 1.3.1
optional: true
'@img/sharp-linux-x64@0.34.5': '@img/sharp-linux-x64@0.34.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-x64': 1.2.4 '@img/sharp-libvips-linux-x64': 1.2.4
optional: true optional: true
'@img/sharp-linux-x64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-x64': 1.3.1
optional: true
'@img/sharp-linuxmusl-arm64@0.34.5': '@img/sharp-linuxmusl-arm64@0.34.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linuxmusl-arm64': 1.2.4 '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
optional: true optional: true
'@img/sharp-linuxmusl-arm64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-arm64': 1.3.1
optional: true
'@img/sharp-linuxmusl-x64@0.34.5': '@img/sharp-linuxmusl-x64@0.34.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linuxmusl-x64': 1.2.4 '@img/sharp-libvips-linuxmusl-x64': 1.2.4
optional: true optional: true
'@img/sharp-linuxmusl-x64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-x64': 1.3.1
optional: true
'@img/sharp-wasm32@0.34.5': '@img/sharp-wasm32@0.34.5':
dependencies: dependencies:
'@emnapi/runtime': 1.8.1 '@emnapi/runtime': 1.8.1
optional: true optional: true
'@img/sharp-wasm32@0.35.2':
dependencies:
'@emnapi/runtime': 1.11.3
optional: true
'@img/sharp-webcontainers-wasm32@0.35.2':
dependencies:
'@img/sharp-wasm32': 0.35.2
optional: true
'@img/sharp-win32-arm64@0.34.5': '@img/sharp-win32-arm64@0.34.5':
optional: true optional: true
'@img/sharp-win32-arm64@0.35.2':
optional: true
'@img/sharp-win32-ia32@0.34.5': '@img/sharp-win32-ia32@0.34.5':
optional: true optional: true
'@img/sharp-win32-ia32@0.35.2':
optional: true
'@img/sharp-win32-x64@0.34.5': '@img/sharp-win32-x64@0.34.5':
optional: true optional: true
'@img/sharp-win32-x64@0.35.2':
optional: true
'@inquirer/ansi@1.0.2': {} '@inquirer/ansi@1.0.2': {}
'@inquirer/checkbox@4.3.2(@types/node@26.0.1)': '@inquirer/checkbox@4.3.2(@types/node@26.0.1)':
@@ -5649,11 +5274,11 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 26.0.1 '@types/node': 26.0.1
'@internationalized/date@3.12.4': '@internationalized/date@3.12.2':
dependencies: dependencies:
'@swc/helpers': 0.5.23 '@swc/helpers': 0.5.23
'@internationalized/number@3.6.8': '@internationalized/number@3.6.7':
dependencies: dependencies:
'@swc/helpers': 0.5.23 '@swc/helpers': 0.5.23
@@ -5691,7 +5316,7 @@ snapshots:
'@lezer/common@1.5.2': {} '@lezer/common@1.5.2': {}
'@lezer/css@1.3.6': '@lezer/css@1.3.4':
dependencies: dependencies:
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@lezer/highlight': 1.2.3 '@lezer/highlight': 1.2.3
@@ -5735,7 +5360,7 @@ snapshots:
'@lezer/highlight': 1.2.3 '@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.10 '@lezer/lr': 1.4.10
'@marijn/find-cluster-break@1.0.4': {} '@marijn/find-cluster-break@1.0.3': {}
'@opentelemetry/api@1.9.0': {} '@opentelemetry/api@1.9.0': {}
@@ -5828,11 +5453,11 @@ snapshots:
'@poppinss/exception@1.2.2': {} '@poppinss/exception@1.2.2': {}
'@replit/codemirror-css-color-picker@6.3.0(@codemirror/language@6.12.4)(@codemirror/state@6.7.2)(@codemirror/view@6.43.10)': '@replit/codemirror-css-color-picker@6.3.0(@codemirror/language@6.12.4)(@codemirror/state@6.7.1)(@codemirror/view@6.43.6)':
dependencies: dependencies:
'@codemirror/language': 6.12.4 '@codemirror/language': 6.12.4
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@codemirror/view': 6.43.10 '@codemirror/view': 6.43.6
'@rolldown/pluginutils@1.0.0-rc.3': {} '@rolldown/pluginutils@1.0.0-rc.3': {}
@@ -5911,27 +5536,27 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.62.2': '@rollup/rollup-win32-x64-msvc@4.62.2':
optional: true optional: true
'@scalar/agent-chat@0.12.29(tailwindcss@4.3.3)(typescript@6.0.3)(zod@4.5.4)': '@scalar/agent-chat@0.12.22(tailwindcss@4.3.3)(typescript@6.0.3)(zod@4.4.3)':
dependencies: dependencies:
'@ai-sdk/vue': 3.0.33(vue@3.5.42(typescript@6.0.3))(zod@4.5.4) '@ai-sdk/vue': 3.0.33(vue@3.5.40(typescript@6.0.3))(zod@4.4.3)
'@scalar/api-client': 3.17.0(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/api-client': 3.13.7(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/components': 0.29.0(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/components': 0.27.9(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/icons': 0.7.6(typescript@6.0.3) '@scalar/icons': 0.7.5(typescript@6.0.3)
'@scalar/json-magic': 0.13.3 '@scalar/json-magic': 0.12.19
'@scalar/openapi-types': 0.9.5 '@scalar/openapi-types': 0.9.3
'@scalar/schemas': 0.8.4 '@scalar/schemas': 0.7.4
'@scalar/themes': 0.17.4 '@scalar/themes': 0.17.1
'@scalar/types': 0.18.3 '@scalar/types': 0.16.4
'@scalar/use-toasts': 0.10.5(typescript@6.0.3) '@scalar/use-toasts': 0.10.4(typescript@6.0.3)
'@scalar/validation': 0.6.3 '@scalar/validation': 0.6.2
'@scalar/workspace-store': 0.59.0(typescript@6.0.3) '@scalar/workspace-store': 0.55.6(typescript@6.0.3)
'@vueuse/core': 13.9.0(vue@3.5.42(typescript@6.0.3)) '@vueuse/core': 13.9.0(vue@3.5.40(typescript@6.0.3))
ai: 6.0.33(zod@4.5.4) ai: 6.0.33(zod@4.4.3)
js-base64: 3.9.3 js-base64: 3.9.1
neverpanic: 0.0.8 neverpanic: 0.0.8
truncate-json: 3.0.1 truncate-json: 3.0.1
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- async-validator - async-validator
@@ -5949,38 +5574,38 @@ snapshots:
- universal-cookie - universal-cookie
- zod - zod
'@scalar/api-client@3.17.0(tailwindcss@4.3.3)(typescript@6.0.3)': '@scalar/api-client@3.13.7(tailwindcss@4.3.3)(typescript@6.0.3)':
dependencies: dependencies:
'@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.3) '@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.3)
'@headlessui/vue': 1.7.23(vue@3.5.42(typescript@6.0.3)) '@headlessui/vue': 1.7.23(vue@3.5.40(typescript@6.0.3))
'@scalar/blocks': 0.1.15(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/blocks': 0.1.8(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/components': 0.29.0(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/components': 0.27.9(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/icons': 0.7.6(typescript@6.0.3) '@scalar/icons': 0.7.5(typescript@6.0.3)
'@scalar/oas-utils': 0.19.15(typescript@6.0.3) '@scalar/oas-utils': 0.19.8(typescript@6.0.3)
'@scalar/openapi-types': 0.9.5 '@scalar/openapi-types': 0.9.3
'@scalar/sidebar': 0.11.0(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/sidebar': 0.9.33(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/snippetz': 0.9.29 '@scalar/snippetz': 0.9.23
'@scalar/themes': 0.17.4 '@scalar/themes': 0.17.1
'@scalar/typebox': 0.1.3 '@scalar/typebox': 0.1.3
'@scalar/types': 0.18.3 '@scalar/types': 0.16.4
'@scalar/use-codemirror': 0.14.15(typescript@6.0.3) '@scalar/use-codemirror': 0.14.14(typescript@6.0.3)
'@scalar/use-hooks': 0.4.10(typescript@6.0.3) '@scalar/use-hooks': 0.4.9(typescript@6.0.3)
'@scalar/use-toasts': 0.10.5(typescript@6.0.3) '@scalar/use-toasts': 0.10.4(typescript@6.0.3)
'@scalar/workspace-store': 0.59.0(typescript@6.0.3) '@scalar/workspace-store': 0.55.6(typescript@6.0.3)
'@vueuse/core': 13.9.0(vue@3.5.42(typescript@6.0.3)) '@vueuse/core': 13.9.0(vue@3.5.40(typescript@6.0.3))
'@vueuse/integrations': 13.9.0(focus-trap@7.8.0)(fuse.js@7.5.0)(vue@3.5.42(typescript@6.0.3)) '@vueuse/integrations': 13.9.0(focus-trap@7.8.0)(fuse.js@7.5.0)(vue@3.5.40(typescript@6.0.3))
focus-trap: 7.8.0 focus-trap: 7.8.0
fuse.js: 7.5.0 fuse.js: 7.5.0
js-base64: 3.9.3 js-base64: 3.9.1
jsonc-parser: 3.3.1 jsonc-parser: 3.3.1
nanoid: 5.1.16 nanoid: 5.1.16
pretty-ms: 9.3.1 pretty-ms: 9.3.0
radix-vue: 1.9.17(vue@3.5.42(typescript@6.0.3)) radix-vue: 1.9.17(vue@3.5.40(typescript@6.0.3))
set-cookie-parser: 3.1.0 set-cookie-parser: 3.1.0
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
yaml: 2.9.0 yaml: 2.9.0
zod: 4.5.4 zod: 4.4.3
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- async-validator - async-validator
@@ -5997,32 +5622,32 @@ snapshots:
- typescript - typescript
- universal-cookie - universal-cookie
'@scalar/api-reference@1.67.0(tailwindcss@4.3.3)(typescript@6.0.3)(zod@4.5.4)': '@scalar/api-reference@1.63.0(tailwindcss@4.3.3)(typescript@6.0.3)(zod@4.4.3)':
dependencies: dependencies:
'@headlessui/vue': 1.7.23(vue@3.5.42(typescript@6.0.3)) '@headlessui/vue': 1.7.23(vue@3.5.40(typescript@6.0.3))
'@scalar/agent-chat': 0.12.29(tailwindcss@4.3.3)(typescript@6.0.3)(zod@4.5.4) '@scalar/agent-chat': 0.12.22(tailwindcss@4.3.3)(typescript@6.0.3)(zod@4.4.3)
'@scalar/api-client': 3.17.0(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/api-client': 3.13.7(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/blocks': 0.1.15(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/blocks': 0.1.8(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/code-highlight': 0.4.5 '@scalar/code-highlight': 0.4.3
'@scalar/components': 0.29.0(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/components': 0.27.9(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/icons': 0.7.6(typescript@6.0.3) '@scalar/icons': 0.7.5(typescript@6.0.3)
'@scalar/oas-utils': 0.19.15(typescript@6.0.3) '@scalar/oas-utils': 0.19.8(typescript@6.0.3)
'@scalar/schemas': 0.8.4 '@scalar/schemas': 0.7.4
'@scalar/sidebar': 0.11.0(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/sidebar': 0.9.33(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/snippetz': 0.9.29 '@scalar/snippetz': 0.9.23
'@scalar/themes': 0.17.4 '@scalar/themes': 0.17.1
'@scalar/types': 0.18.3 '@scalar/types': 0.16.4
'@scalar/use-hooks': 0.4.10(typescript@6.0.3) '@scalar/use-hooks': 0.4.9(typescript@6.0.3)
'@scalar/use-toasts': 0.10.5(typescript@6.0.3) '@scalar/use-toasts': 0.10.4(typescript@6.0.3)
'@scalar/validation': 0.6.3 '@scalar/validation': 0.6.2
'@scalar/workspace-store': 0.59.0(typescript@6.0.3) '@scalar/workspace-store': 0.55.6(typescript@6.0.3)
'@unhead/vue': 2.1.17(vue@3.5.42(typescript@6.0.3)) '@unhead/vue': 2.1.16(vue@3.5.40(typescript@6.0.3))
'@vueuse/core': 13.9.0(vue@3.5.42(typescript@6.0.3)) '@vueuse/core': 13.9.0(vue@3.5.40(typescript@6.0.3))
fuse.js: 7.5.0 fuse.js: 7.5.0
microdiff: 1.6.0 microdiff: 1.5.0
nanoid: 5.1.16 nanoid: 5.1.16
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
yaml: 2.9.0 yaml: 2.9.0
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
@@ -6041,32 +5666,32 @@ snapshots:
- universal-cookie - universal-cookie
- zod - zod
'@scalar/asyncapi-upgrader@0.1.8': '@scalar/asyncapi-upgrader@0.1.4':
dependencies: dependencies:
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/blocks@0.1.15(tailwindcss@4.3.3)(typescript@6.0.3)': '@scalar/blocks@0.1.8(tailwindcss@4.3.3)(typescript@6.0.3)':
dependencies: dependencies:
'@scalar/components': 0.29.0(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/components': 0.27.9(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/icons': 0.7.6(typescript@6.0.3) '@scalar/icons': 0.7.5(typescript@6.0.3)
'@scalar/snippetz': 0.9.29 '@scalar/snippetz': 0.9.23
'@scalar/themes': 0.17.4 '@scalar/themes': 0.17.1
'@scalar/types': 0.18.3 '@scalar/types': 0.16.4
'@scalar/workspace-store': 0.59.0(typescript@6.0.3) '@scalar/workspace-store': 0.55.6(typescript@6.0.3)
'@types/har-format': 1.2.16 '@types/har-format': 1.2.16
js-base64: 3.9.3 js-base64: 3.9.1
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- supports-color - supports-color
- tailwindcss - tailwindcss
- typescript - typescript
'@scalar/code-highlight@0.4.5': '@scalar/code-highlight@0.4.3':
dependencies: dependencies:
hast-util-to-text: 4.0.2 hast-util-to-text: 4.0.2
highlight.js: 11.12.0 highlight.js: 11.11.1
lowlight: 3.3.0 lowlight: 3.3.0
rehype-external-links: 3.0.0 rehype-external-links: 3.0.0
rehype-format: 5.0.1 rehype-format: 5.0.1
@@ -6083,157 +5708,157 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@scalar/components@0.29.0(tailwindcss@4.3.3)(typescript@6.0.3)': '@scalar/components@0.27.9(tailwindcss@4.3.3)(typescript@6.0.3)':
dependencies: dependencies:
'@floating-ui/utils': 0.2.10 '@floating-ui/utils': 0.2.10
'@floating-ui/vue': 1.1.9(vue@3.5.42(typescript@6.0.3)) '@floating-ui/vue': 1.1.9(vue@3.5.40(typescript@6.0.3))
'@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.3) '@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.3)
'@headlessui/vue': 1.7.23(vue@3.5.42(typescript@6.0.3)) '@headlessui/vue': 1.7.23(vue@3.5.40(typescript@6.0.3))
'@scalar/code-highlight': 0.4.5 '@scalar/code-highlight': 0.4.3
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/icons': 0.7.6(typescript@6.0.3) '@scalar/icons': 0.7.5(typescript@6.0.3)
'@scalar/themes': 0.17.4 '@scalar/themes': 0.17.1
'@scalar/use-hooks': 0.4.10(typescript@6.0.3) '@scalar/use-hooks': 0.4.9(typescript@6.0.3)
'@vueuse/core': 13.9.0(vue@3.5.42(typescript@6.0.3)) '@vueuse/core': 13.9.0(vue@3.5.40(typescript@6.0.3))
cva: 1.0.0-beta.4(typescript@6.0.3) cva: 1.0.0-beta.4(typescript@6.0.3)
radix-vue: 1.9.17(vue@3.5.42(typescript@6.0.3)) radix-vue: 1.9.17(vue@3.5.40(typescript@6.0.3))
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
vue-component-type-helpers: 3.3.11 vue-component-type-helpers: 3.3.7
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- supports-color - supports-color
- tailwindcss - tailwindcss
- typescript - typescript
'@scalar/helpers@0.11.2': {} '@scalar/helpers@0.9.2': {}
'@scalar/icons@0.7.6(typescript@6.0.3)': '@scalar/icons@0.7.5(typescript@6.0.3)':
dependencies: dependencies:
'@phosphor-icons/core': 2.1.1 '@phosphor-icons/core': 2.1.1
'@types/node': 24.13.3 '@types/node': 24.13.3
chalk: 5.6.2 chalk: 5.6.2
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
transitivePeerDependencies: transitivePeerDependencies:
- typescript - typescript
'@scalar/json-magic@0.13.3': '@scalar/json-magic@0.12.19':
dependencies: dependencies:
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
pathe: 2.0.3 pathe: 2.0.3
yaml: 2.9.0 yaml: 2.9.0
'@scalar/oas-utils@0.19.15(typescript@6.0.3)': '@scalar/oas-utils@0.19.8(typescript@6.0.3)':
dependencies: dependencies:
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/themes': 0.17.4 '@scalar/themes': 0.17.1
'@scalar/types': 0.18.3 '@scalar/types': 0.16.4
'@scalar/workspace-store': 0.59.0(typescript@6.0.3) '@scalar/workspace-store': 0.55.6(typescript@6.0.3)
flatted: 3.4.4 flatted: 3.4.2
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
yaml: 2.9.0 yaml: 2.9.0
transitivePeerDependencies: transitivePeerDependencies:
- typescript - typescript
'@scalar/openapi-types@0.9.5': {} '@scalar/openapi-types@0.9.3': {}
'@scalar/openapi-upgrader@0.2.15': '@scalar/openapi-upgrader@0.2.11':
dependencies: dependencies:
'@scalar/openapi-types': 0.9.5 '@scalar/openapi-types': 0.9.3
'@scalar/schemas@0.8.4': '@scalar/schemas@0.7.4':
dependencies: dependencies:
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/validation': 0.6.3 '@scalar/validation': 0.6.2
'@scalar/sidebar@0.11.0(tailwindcss@4.3.3)(typescript@6.0.3)': '@scalar/sidebar@0.9.33(tailwindcss@4.3.3)(typescript@6.0.3)':
dependencies: dependencies:
'@scalar/components': 0.29.0(tailwindcss@4.3.3)(typescript@6.0.3) '@scalar/components': 0.27.9(tailwindcss@4.3.3)(typescript@6.0.3)
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/icons': 0.7.6(typescript@6.0.3) '@scalar/icons': 0.7.5(typescript@6.0.3)
'@scalar/themes': 0.17.4 '@scalar/themes': 0.17.1
'@scalar/use-hooks': 0.4.10(typescript@6.0.3) '@scalar/use-hooks': 0.4.9(typescript@6.0.3)
'@scalar/workspace-store': 0.59.0(typescript@6.0.3) '@scalar/workspace-store': 0.55.6(typescript@6.0.3)
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- supports-color - supports-color
- tailwindcss - tailwindcss
- typescript - typescript
'@scalar/snippetz@0.9.29': '@scalar/snippetz@0.9.23':
dependencies: dependencies:
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/types': 0.18.3 '@scalar/types': 0.16.4
js-base64: 3.9.3 js-base64: 3.9.1
stringify-object: 6.0.0 stringify-object: 6.0.0
'@scalar/themes@0.17.4': '@scalar/themes@0.17.1':
dependencies: dependencies:
nanoid: 5.1.16 nanoid: 5.1.16
'@scalar/typebox@0.1.3': {} '@scalar/typebox@0.1.3': {}
'@scalar/types@0.18.3': '@scalar/types@0.16.4':
dependencies: dependencies:
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
nanoid: 5.1.16 nanoid: 5.1.16
type-fest: 5.9.0 type-fest: 5.8.0
zod: 4.5.4 zod: 4.4.3
'@scalar/use-codemirror@0.14.15(typescript@6.0.3)': '@scalar/use-codemirror@0.14.14(typescript@6.0.3)':
dependencies: dependencies:
'@codemirror/autocomplete': 6.20.3 '@codemirror/autocomplete': 6.20.3
'@codemirror/commands': 6.11.0 '@codemirror/commands': 6.10.4
'@codemirror/lang-css': 6.3.1 '@codemirror/lang-css': 6.3.1
'@codemirror/lang-html': 6.4.12 '@codemirror/lang-html': 6.4.11
'@codemirror/lang-json': 6.0.2 '@codemirror/lang-json': 6.0.2
'@codemirror/lang-xml': 6.1.0 '@codemirror/lang-xml': 6.1.0
'@codemirror/lang-yaml': 6.1.3 '@codemirror/lang-yaml': 6.1.3
'@codemirror/language': 6.12.4 '@codemirror/language': 6.12.4
'@codemirror/lint': 6.9.7 '@codemirror/lint': 6.9.7
'@codemirror/state': 6.7.2 '@codemirror/state': 6.7.1
'@codemirror/view': 6.43.10 '@codemirror/view': 6.43.6
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@lezer/highlight': 1.2.3 '@lezer/highlight': 1.2.3
'@replit/codemirror-css-color-picker': 6.3.0(@codemirror/language@6.12.4)(@codemirror/state@6.7.2)(@codemirror/view@6.43.10) '@replit/codemirror-css-color-picker': 6.3.0(@codemirror/language@6.12.4)(@codemirror/state@6.7.1)(@codemirror/view@6.43.6)
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
transitivePeerDependencies: transitivePeerDependencies:
- typescript - typescript
'@scalar/use-hooks@0.4.10(typescript@6.0.3)': '@scalar/use-hooks@0.4.9(typescript@6.0.3)':
dependencies: dependencies:
'@scalar/use-toasts': 0.10.5(typescript@6.0.3) '@scalar/use-toasts': 0.10.4(typescript@6.0.3)
'@scalar/validation': 0.6.3 '@scalar/validation': 0.6.2
'@vueuse/core': 13.9.0(vue@3.5.42(typescript@6.0.3)) '@vueuse/core': 13.9.0(vue@3.5.40(typescript@6.0.3))
cva: 1.0.0-beta.4(typescript@6.0.3) cva: 1.0.0-beta.4(typescript@6.0.3)
tailwind-merge: 3.5.0 tailwind-merge: 3.5.0
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
transitivePeerDependencies: transitivePeerDependencies:
- typescript - typescript
'@scalar/use-toasts@0.10.5(typescript@6.0.3)': '@scalar/use-toasts@0.10.4(typescript@6.0.3)':
dependencies: dependencies:
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
vue-sonner: 1.3.2 vue-sonner: 1.3.2
transitivePeerDependencies: transitivePeerDependencies:
- typescript - typescript
'@scalar/validation@0.6.3': {} '@scalar/validation@0.6.2': {}
'@scalar/workspace-store@0.59.0(typescript@6.0.3)': '@scalar/workspace-store@0.55.6(typescript@6.0.3)':
dependencies: dependencies:
'@scalar/asyncapi-upgrader': 0.1.8 '@scalar/asyncapi-upgrader': 0.1.4
'@scalar/helpers': 0.11.2 '@scalar/helpers': 0.9.2
'@scalar/json-magic': 0.13.3 '@scalar/json-magic': 0.12.19
'@scalar/openapi-upgrader': 0.2.15 '@scalar/openapi-upgrader': 0.2.11
'@scalar/schemas': 0.8.4 '@scalar/schemas': 0.7.4
'@scalar/snippetz': 0.9.29 '@scalar/snippetz': 0.9.23
'@scalar/typebox': 0.1.3 '@scalar/typebox': 0.1.3
'@scalar/types': 0.18.3 '@scalar/types': 0.16.4
'@scalar/validation': 0.6.3 '@scalar/validation': 0.6.2
js-base64: 3.9.3 js-base64: 3.9.1
type-fest: 5.9.0 type-fest: 5.8.0
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
yaml: 2.9.0 yaml: 2.9.0
transitivePeerDependencies: transitivePeerDependencies:
- typescript - typescript
@@ -6264,12 +5889,12 @@ snapshots:
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
'@tanstack/virtual-core@3.17.8': {} '@tanstack/virtual-core@3.17.5': {}
'@tanstack/vue-virtual@3.13.36(vue@3.5.42(typescript@6.0.3))': '@tanstack/vue-virtual@3.13.33(vue@3.5.40(typescript@6.0.3))':
dependencies: dependencies:
'@tanstack/virtual-core': 3.17.8 '@tanstack/virtual-core': 3.17.5
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
'@taplo/core@0.2.0': {} '@taplo/core@0.2.0': {}
@@ -6416,13 +6041,13 @@ snapshots:
'@typescript/native-preview-win32-arm64': 7.0.0-dev.20260629.1 '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260629.1
'@typescript/native-preview-win32-x64': 7.0.0-dev.20260629.1 '@typescript/native-preview-win32-x64': 7.0.0-dev.20260629.1
'@ungap/structured-clone@1.4.0': {} '@ungap/structured-clone@1.3.3': {}
'@unhead/vue@2.1.17(vue@3.5.42(typescript@6.0.3))': '@unhead/vue@2.1.16(vue@3.5.40(typescript@6.0.3))':
dependencies: dependencies:
hookable: 6.1.1 hookable: 6.1.1
unhead: 2.1.17 unhead: 2.1.16
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
'@vercel/oidc@3.1.0': {} '@vercel/oidc@3.1.0': {}
@@ -6479,82 +6104,82 @@ snapshots:
convert-source-map: 2.0.0 convert-source-map: 2.0.0
tinyrainbow: 3.1.0 tinyrainbow: 3.1.0
'@vue/compiler-core@3.5.42': '@vue/compiler-core@3.5.40':
dependencies: dependencies:
'@babel/parser': 7.29.8 '@babel/parser': 7.29.7
'@vue/shared': 3.5.42 '@vue/shared': 3.5.40
entities: 7.0.1 entities: 7.0.1
estree-walker: 2.0.2 estree-walker: 2.0.2
source-map-js: 1.2.1 source-map-js: 1.2.1
'@vue/compiler-dom@3.5.42': '@vue/compiler-dom@3.5.40':
dependencies: dependencies:
'@vue/compiler-core': 3.5.42 '@vue/compiler-core': 3.5.40
'@vue/shared': 3.5.42 '@vue/shared': 3.5.40
'@vue/compiler-sfc@3.5.42': '@vue/compiler-sfc@3.5.40':
dependencies: dependencies:
'@babel/parser': 7.29.8 '@babel/parser': 7.29.7
'@vue/compiler-core': 3.5.42 '@vue/compiler-core': 3.5.40
'@vue/compiler-dom': 3.5.42 '@vue/compiler-dom': 3.5.40
'@vue/compiler-ssr': 3.5.42 '@vue/compiler-ssr': 3.5.40
'@vue/shared': 3.5.42 '@vue/shared': 3.5.40
estree-walker: 2.0.2 estree-walker: 2.0.2
magic-string: 0.30.21 magic-string: 0.30.21
postcss: 8.5.26 postcss: 8.5.20
source-map-js: 1.2.1 source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.42': '@vue/compiler-ssr@3.5.40':
dependencies: dependencies:
'@vue/compiler-dom': 3.5.42 '@vue/compiler-dom': 3.5.40
'@vue/shared': 3.5.42 '@vue/shared': 3.5.40
'@vue/reactivity@3.5.42': '@vue/reactivity@3.5.40':
dependencies: dependencies:
'@vue/shared': 3.5.42 '@vue/shared': 3.5.40
'@vue/runtime-core@3.5.42': '@vue/runtime-core@3.5.40':
dependencies: dependencies:
'@vue/reactivity': 3.5.42 '@vue/reactivity': 3.5.40
'@vue/shared': 3.5.42 '@vue/shared': 3.5.40
'@vue/runtime-dom@3.5.42': '@vue/runtime-dom@3.5.40':
dependencies: dependencies:
'@vue/reactivity': 3.5.42 '@vue/reactivity': 3.5.40
'@vue/runtime-core': 3.5.42 '@vue/runtime-core': 3.5.40
'@vue/shared': 3.5.42 '@vue/shared': 3.5.40
csstype: 3.2.3 csstype: 3.2.3
'@vue/server-renderer@3.5.42': '@vue/server-renderer@3.5.40':
dependencies: dependencies:
'@vue/compiler-ssr': 3.5.42 '@vue/compiler-ssr': 3.5.40
'@vue/runtime-dom': 3.5.42 '@vue/runtime-dom': 3.5.40
'@vue/shared': 3.5.42 '@vue/shared': 3.5.40
'@vue/shared@3.5.42': {} '@vue/shared@3.5.40': {}
'@vueuse/core@10.11.1(vue@3.5.42(typescript@6.0.3))': '@vueuse/core@10.11.1(vue@3.5.40(typescript@6.0.3))':
dependencies: dependencies:
'@types/web-bluetooth': 0.0.20 '@types/web-bluetooth': 0.0.20
'@vueuse/metadata': 10.11.1 '@vueuse/metadata': 10.11.1
'@vueuse/shared': 10.11.1(vue@3.5.42(typescript@6.0.3)) '@vueuse/shared': 10.11.1(vue@3.5.40(typescript@6.0.3))
vue-demi: 0.14.10(vue@3.5.42(typescript@6.0.3)) vue-demi: 0.14.10(vue@3.5.40(typescript@6.0.3))
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- vue - vue
'@vueuse/core@13.9.0(vue@3.5.42(typescript@6.0.3))': '@vueuse/core@13.9.0(vue@3.5.40(typescript@6.0.3))':
dependencies: dependencies:
'@types/web-bluetooth': 0.0.21 '@types/web-bluetooth': 0.0.21
'@vueuse/metadata': 13.9.0 '@vueuse/metadata': 13.9.0
'@vueuse/shared': 13.9.0(vue@3.5.42(typescript@6.0.3)) '@vueuse/shared': 13.9.0(vue@3.5.40(typescript@6.0.3))
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
'@vueuse/integrations@13.9.0(focus-trap@7.8.0)(fuse.js@7.5.0)(vue@3.5.42(typescript@6.0.3))': '@vueuse/integrations@13.9.0(focus-trap@7.8.0)(fuse.js@7.5.0)(vue@3.5.40(typescript@6.0.3))':
dependencies: dependencies:
'@vueuse/core': 13.9.0(vue@3.5.42(typescript@6.0.3)) '@vueuse/core': 13.9.0(vue@3.5.40(typescript@6.0.3))
'@vueuse/shared': 13.9.0(vue@3.5.42(typescript@6.0.3)) '@vueuse/shared': 13.9.0(vue@3.5.40(typescript@6.0.3))
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
optionalDependencies: optionalDependencies:
focus-trap: 7.8.0 focus-trap: 7.8.0
fuse.js: 7.5.0 fuse.js: 7.5.0
@@ -6563,24 +6188,24 @@ snapshots:
'@vueuse/metadata@13.9.0': {} '@vueuse/metadata@13.9.0': {}
'@vueuse/shared@10.11.1(vue@3.5.42(typescript@6.0.3))': '@vueuse/shared@10.11.1(vue@3.5.40(typescript@6.0.3))':
dependencies: dependencies:
vue-demi: 0.14.10(vue@3.5.42(typescript@6.0.3)) vue-demi: 0.14.10(vue@3.5.40(typescript@6.0.3))
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- vue - vue
'@vueuse/shared@13.9.0(vue@3.5.42(typescript@6.0.3))': '@vueuse/shared@13.9.0(vue@3.5.40(typescript@6.0.3))':
dependencies: dependencies:
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
ai@6.0.33(zod@4.5.4): ai@6.0.33(zod@4.4.3):
dependencies: dependencies:
'@ai-sdk/gateway': 3.0.13(zod@4.5.4) '@ai-sdk/gateway': 3.0.13(zod@4.4.3)
'@ai-sdk/provider': 3.0.2 '@ai-sdk/provider': 3.0.2
'@ai-sdk/provider-utils': 4.0.5(zod@4.5.4) '@ai-sdk/provider-utils': 4.0.5(zod@4.4.3)
'@opentelemetry/api': 1.9.0 '@opentelemetry/api': 1.9.0
zod: 4.5.4 zod: 4.4.3
ansi-regex@5.0.1: {} ansi-regex@5.0.1: {}
@@ -6770,7 +6395,7 @@ snapshots:
dependencies: dependencies:
'@types/estree': 1.0.9 '@types/estree': 1.0.9
eventsource-parser@3.1.1: {} eventsource-parser@3.1.0: {}
expect-type@1.4.0: {} expect-type@1.4.0: {}
@@ -6782,7 +6407,7 @@ snapshots:
optionalDependencies: optionalDependencies:
picomatch: 4.0.4 picomatch: 4.0.4
flatted@3.4.4: {} flatted@3.4.2: {}
focus-trap@7.8.0: focus-trap@7.8.0:
dependencies: dependencies:
@@ -6874,7 +6499,7 @@ snapshots:
dependencies: dependencies:
'@types/hast': 3.0.5 '@types/hast': 3.0.5
'@types/unist': 3.0.3 '@types/unist': 3.0.3
'@ungap/structured-clone': 1.4.0 '@ungap/structured-clone': 1.3.3
hast-util-from-parse5: 8.0.3 hast-util-from-parse5: 8.0.3
hast-util-to-parse5: 8.0.1 hast-util-to-parse5: 8.0.1
html-void-elements: 3.0.0 html-void-elements: 3.0.0
@@ -6889,7 +6514,7 @@ snapshots:
hast-util-sanitize@5.0.2: hast-util-sanitize@5.0.2:
dependencies: dependencies:
'@types/hast': 3.0.5 '@types/hast': 3.0.5
'@ungap/structured-clone': 1.4.0 '@ungap/structured-clone': 1.3.3
unist-util-position: 5.0.0 unist-util-position: 5.0.0
hast-util-to-html@9.0.5: hast-util-to-html@9.0.5:
@@ -6935,21 +6560,19 @@ snapshots:
property-information: 7.2.0 property-information: 7.2.0
space-separated-tokens: 2.0.2 space-separated-tokens: 2.0.2
highlight.js@11.11.2: {} highlight.js@11.11.1: {}
highlight.js@11.12.0: {} hono-openapi@1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.12.27)(openapi-types@12.1.3):
hono-openapi@1.3.1(@hono/standard-validator@0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5))(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-community/standard-openapi@0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3))(@types/json-schema@7.0.15)(hono@4.13.5)(openapi-types@12.1.3):
dependencies: dependencies:
'@standard-community/standard-json': 0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3) '@standard-community/standard-json': 0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3)
'@standard-community/standard-openapi': 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3) '@standard-community/standard-openapi': 0.2.9(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod@4.4.3))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@4.4.3)
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
openapi-types: 12.1.3 openapi-types: 12.1.3
optionalDependencies: optionalDependencies:
'@hono/standard-validator': 0.2.2(@standard-schema/spec@1.1.0)(hono@4.13.5) '@hono/standard-validator': 0.2.2(@standard-schema/spec@1.1.0)(hono@4.12.27)
hono: 4.13.5 hono: 4.12.27
hono@4.13.5: {} hono@4.12.27: {}
hookable@6.1.1: {} hookable@6.1.1: {}
@@ -6989,7 +6612,7 @@ snapshots:
jiti@2.6.1: jiti@2.6.1:
optional: true optional: true
js-base64@3.9.3: {} js-base64@3.9.1: {}
js-tokens@4.0.0: {} js-tokens@4.0.0: {}
@@ -7055,7 +6678,7 @@ snapshots:
dependencies: dependencies:
'@types/hast': 3.0.5 '@types/hast': 3.0.5
devlop: 1.1.0 devlop: 1.1.0
highlight.js: 11.11.2 highlight.js: 11.11.1
lru-cache@5.1.1: lru-cache@5.1.1:
dependencies: dependencies:
@@ -7163,7 +6786,7 @@ snapshots:
dependencies: dependencies:
'@types/hast': 3.0.5 '@types/hast': 3.0.5
'@types/mdast': 4.0.4 '@types/mdast': 4.0.4
'@ungap/structured-clone': 1.4.0 '@ungap/structured-clone': 1.3.3
devlop: 1.1.0 devlop: 1.1.0
micromark-util-sanitize-uri: 2.0.1 micromark-util-sanitize-uri: 2.0.1
trim-lines: 3.0.1 trim-lines: 3.0.1
@@ -7189,7 +6812,7 @@ snapshots:
memoize-one@6.0.0: {} memoize-one@6.0.0: {}
microdiff@1.6.0: {} microdiff@1.5.0: {}
micromark-core-commonmark@2.0.3: micromark-core-commonmark@2.0.3:
dependencies: dependencies:
@@ -7406,25 +7029,13 @@ snapshots:
- bufferutil - bufferutil
- utf-8-validate - utf-8-validate
miniflare@5.20260831.0-alpha:
dependencies:
'@cspotcode/source-map-support': 0.8.1
sharp: 0.35.2
undici: 7.29.0
workerd: 1.20260831.1
ws: 8.21.0
youch: 4.1.0-beta.10
transitivePeerDependencies:
- bufferutil
- utf-8-validate
ms@2.1.3: {} ms@2.1.3: {}
mute-stream@2.0.0: {} mute-stream@2.0.0: {}
nanoid@3.3.15: {} nanoid@3.3.15: {}
nanoid@3.3.18: {} nanoid@3.3.16: {}
nanoid@5.1.16: {} nanoid@5.1.16: {}
@@ -7496,9 +7107,9 @@ snapshots:
picocolors: 1.1.1 picocolors: 1.1.1
source-map-js: 1.2.1 source-map-js: 1.2.1
postcss@8.5.26: postcss@8.5.20:
dependencies: dependencies:
nanoid: 3.3.18 nanoid: 3.3.16
picocolors: 1.1.1 picocolors: 1.1.1
source-map-js: 1.2.1 source-map-js: 1.2.1
@@ -7515,7 +7126,7 @@ snapshots:
prettier@3.9.4: {} prettier@3.9.4: {}
pretty-ms@9.3.1: pretty-ms@9.3.0:
dependencies: dependencies:
parse-ms: 4.0.0 parse-ms: 4.0.0
@@ -7525,20 +7136,20 @@ snapshots:
quansync@0.2.11: {} quansync@0.2.11: {}
radix-vue@1.9.17(vue@3.5.42(typescript@6.0.3)): radix-vue@1.9.17(vue@3.5.40(typescript@6.0.3)):
dependencies: dependencies:
'@floating-ui/dom': 1.8.0 '@floating-ui/dom': 1.8.0
'@floating-ui/vue': 1.1.11(vue@3.5.42(typescript@6.0.3)) '@floating-ui/vue': 1.1.9(vue@3.5.40(typescript@6.0.3))
'@internationalized/date': 3.12.4 '@internationalized/date': 3.12.2
'@internationalized/number': 3.6.8 '@internationalized/number': 3.6.7
'@tanstack/vue-virtual': 3.13.36(vue@3.5.42(typescript@6.0.3)) '@tanstack/vue-virtual': 3.13.33(vue@3.5.40(typescript@6.0.3))
'@vueuse/core': 10.11.1(vue@3.5.42(typescript@6.0.3)) '@vueuse/core': 10.11.1(vue@3.5.40(typescript@6.0.3))
'@vueuse/shared': 10.11.1(vue@3.5.42(typescript@6.0.3)) '@vueuse/shared': 10.11.1(vue@3.5.40(typescript@6.0.3))
aria-hidden: 1.2.6 aria-hidden: 1.2.6
defu: 6.1.7 defu: 6.1.7
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
nanoid: 5.1.16 nanoid: 5.1.16
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
@@ -7554,7 +7165,7 @@ snapshots:
rehype-external-links@3.0.0: rehype-external-links@3.0.0:
dependencies: dependencies:
'@types/hast': 3.0.5 '@types/hast': 3.0.5
'@ungap/structured-clone': 1.4.0 '@ungap/structured-clone': 1.3.3
hast-util-is-element: 3.0.0 hast-util-is-element: 3.0.0
is-absolute-url: 4.0.1 is-absolute-url: 4.0.1
space-separated-tokens: 2.0.2 space-separated-tokens: 2.0.2
@@ -7696,38 +7307,6 @@ snapshots:
'@img/sharp-win32-ia32': 0.34.5 '@img/sharp-win32-ia32': 0.34.5
'@img/sharp-win32-x64': 0.34.5 '@img/sharp-win32-x64': 0.34.5
sharp@0.35.2:
dependencies:
'@img/colour': 1.1.0
detect-libc: 2.1.2
semver: 7.8.5
optionalDependencies:
'@img/sharp-darwin-arm64': 0.35.2
'@img/sharp-darwin-x64': 0.35.2
'@img/sharp-freebsd-wasm32': 0.35.2
'@img/sharp-libvips-darwin-arm64': 1.3.1
'@img/sharp-libvips-darwin-x64': 1.3.1
'@img/sharp-libvips-linux-arm': 1.3.1
'@img/sharp-libvips-linux-arm64': 1.3.1
'@img/sharp-libvips-linux-ppc64': 1.3.1
'@img/sharp-libvips-linux-riscv64': 1.3.1
'@img/sharp-libvips-linux-s390x': 1.3.1
'@img/sharp-libvips-linux-x64': 1.3.1
'@img/sharp-libvips-linuxmusl-arm64': 1.3.1
'@img/sharp-libvips-linuxmusl-x64': 1.3.1
'@img/sharp-linux-arm': 0.35.2
'@img/sharp-linux-arm64': 0.35.2
'@img/sharp-linux-ppc64': 0.35.2
'@img/sharp-linux-riscv64': 0.35.2
'@img/sharp-linux-s390x': 0.35.2
'@img/sharp-linux-x64': 0.35.2
'@img/sharp-linuxmusl-arm64': 0.35.2
'@img/sharp-linuxmusl-x64': 0.35.2
'@img/sharp-webcontainers-wasm32': 0.35.2
'@img/sharp-win32-arm64': 0.35.2
'@img/sharp-win32-ia32': 0.35.2
'@img/sharp-win32-x64': 0.35.2
siginfo@2.0.0: {} siginfo@2.0.0: {}
signal-exit@4.1.0: {} signal-exit@4.1.0: {}
@@ -7792,9 +7371,9 @@ snapshots:
supports-color@10.1.0: {} supports-color@10.1.0: {}
swrv@1.2.0(vue@3.5.42(typescript@6.0.3)): swrv@1.2.0(vue@3.5.40(typescript@6.0.3)):
dependencies: dependencies:
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
syncpack-darwin-arm64@15.3.2: syncpack-darwin-arm64@15.3.2:
optional: true optional: true
@@ -7885,7 +7464,7 @@ snapshots:
type-fest@4.41.0: {} type-fest@4.41.0: {}
type-fest@5.9.0: type-fest@5.8.0:
dependencies: dependencies:
tagged-tag: 1.0.0 tagged-tag: 1.0.0
@@ -7897,13 +7476,11 @@ snapshots:
undici@7.28.0: {} undici@7.28.0: {}
undici@7.29.0: {}
unenv@2.0.0-rc.24: unenv@2.0.0-rc.24:
dependencies: dependencies:
pathe: 2.0.3 pathe: 2.0.3
unhead@2.1.17: unhead@2.1.16:
dependencies: dependencies:
hookable: 6.1.1 hookable: 6.1.1
@@ -8010,21 +7587,21 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- msw - msw
vue-component-type-helpers@3.3.11: {} vue-component-type-helpers@3.3.7: {}
vue-demi@0.14.10(vue@3.5.42(typescript@6.0.3)): vue-demi@0.14.10(vue@3.5.40(typescript@6.0.3)):
dependencies: dependencies:
vue: 3.5.42(typescript@6.0.3) vue: 3.5.40(typescript@6.0.3)
vue-sonner@1.3.2: {} vue-sonner@1.3.2: {}
vue@3.5.42(typescript@6.0.3): vue@3.5.40(typescript@6.0.3):
dependencies: dependencies:
'@vue/compiler-dom': 3.5.42 '@vue/compiler-dom': 3.5.40
'@vue/compiler-sfc': 3.5.42 '@vue/compiler-sfc': 3.5.40
'@vue/runtime-dom': 3.5.42 '@vue/runtime-dom': 3.5.40
'@vue/server-renderer': 3.5.42 '@vue/server-renderer': 3.5.40
'@vue/shared': 3.5.42 '@vue/shared': 3.5.40
optionalDependencies: optionalDependencies:
typescript: 6.0.3 typescript: 6.0.3
@@ -8055,19 +7632,11 @@ snapshots:
'@cloudflare/workerd-linux-arm64': 1.20260625.1 '@cloudflare/workerd-linux-arm64': 1.20260625.1
'@cloudflare/workerd-windows-64': 1.20260625.1 '@cloudflare/workerd-windows-64': 1.20260625.1
workerd@1.20260831.1:
optionalDependencies:
'@cloudflare/workerd-darwin-64': 1.20260831.1
'@cloudflare/workerd-darwin-arm64': 1.20260831.1
'@cloudflare/workerd-linux-64': 1.20260831.1
'@cloudflare/workerd-linux-arm64': 1.20260831.1
'@cloudflare/workerd-windows-64': 1.20260831.1
workers-tagged-logger@1.0.1: workers-tagged-logger@1.0.1:
dependencies: dependencies:
zod: 4.4.3 zod: 4.4.3
optionalDependencies: optionalDependencies:
hono: 4.13.5 hono: 4.12.27
wrangler@4.105.0(@cloudflare/workers-types@4.20260630.1): wrangler@4.105.0(@cloudflare/workers-types@4.20260630.1):
dependencies: dependencies:
@@ -8086,22 +7655,6 @@ snapshots:
- bufferutil - bufferutil
- utf-8-validate - utf-8-validate
wrangler@4.128.0:
dependencies:
'@cloudflare/kv-asset-handler': 0.5.0
'@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260831.1)
blake3-wasm: 2.1.5
esbuild: 0.28.1
miniflare: 5.20260831.0-alpha
path-to-regexp: 6.3.0
unenv: 2.0.0-rc.24
workerd: 1.20260831.1
optionalDependencies:
fsevents: 2.3.3
transitivePeerDependencies:
- bufferutil
- utf-8-validate
wrap-ansi@6.2.0: wrap-ansi@6.2.0:
dependencies: dependencies:
ansi-styles: 4.3.0 ansi-styles: 4.3.0
@@ -8133,8 +7686,6 @@ snapshots:
zod@4.4.3: {} zod@4.4.3: {}
zod@4.5.4: {}
zwitch@2.0.4: {} zwitch@2.0.4: {}
zx@8.8.5: {} zx@8.8.5: {}